diff --git a/.env.ci.test b/.env.ci similarity index 51% rename from .env.ci.test rename to .env.ci index ab52aac39..d06599331 100644 --- a/.env.ci.test +++ b/.env.ci @@ -3,6 +3,15 @@ APP_ENV=development APP_KEY= APP_DEBUG=true APP_URL=http://localhost:80 + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database +PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 APP_DESCRIPTION='nmrXiv is currently developed as the FAIR, consensus-driven NMR data repository and computational platform. The ultimate goal is to accelerate broader coordination and data sharing among natural product (NP) researchers by enabling the storage, management, sharing and analysis of NMR data.' COOL_OFF_PERIOD=10 SCHEMA_VERSION=beta @@ -11,19 +20,22 @@ SHOW_BANNER=true GITHUB_LICENSE_URL=https://api.github.com/licenses EUROPEMC_WS_API=https://www.ebi.ac.uk/europepmc/webservices/rest/search -ORCID_ID_SEARCH_API=https://pub.orcid.org/v2.1/search -ORCID_ID_EMPLOYMENT_API=https://pub.orcid.org/v3.0/{orcid_id}/employments -ORCID_ID_PERSON_API=https://pub.orcid.org/v3.0/{orcid_id}/person +ORCID_BASE_URL=https://pub.orcid.org/v3.0 +CM_API=https://api.naturalproducts.net/latest/ +CROSSREF_API=https://api.crossref.org/works/ +DATACITE_API=https://api.datacite.org/ +DATACITE_TEST_API=https://api.test.datacite.org LOG_CHANNEL=stack +LOG_STACK=single LOG_LEVEL=debug DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 -DB_DATABASE=nmrxiv +DB_DATABASE=nmrxiv_test DB_USERNAME=postgres -DB_PASSWORD=postgres +DB_PASSWORD=password BROADCAST_CONNECTION=log CACHE_STORE=file @@ -31,6 +43,9 @@ FILESYSTEM_DRIVER=local QUEUE_CONNECTION=redis SESSION_DRIVER=redis SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null MEMCACHED_HOST=memcached @@ -58,6 +73,7 @@ AWS_BUCKET=nmrxiv AWS_BUCKET_PUBLIC=nmrxiv-public AWS_ENDPOINT=https://s3.uni-jena.de AWS_URL=https://s3.uni-jena.de +AWS_USE_PATH_STYLE_ENDPOINT=false PUSHER_APP_ID= PUSHER_APP_KEY= @@ -67,9 +83,9 @@ PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" -SCOUT_DRIVER=meilisearch -SCOUT_PREFIX=dev_ -MEILISEARCH_HOST=https://msdev.nmrxiv.org +SCOUT_DRIVER=null +SCOUT_PREFIX=test_ +MEILISEARCH_HOST=http://localhost:7700/ MEILISEARCH_KEY= MEILISEARCH_PUBLICKEY= @@ -81,4 +97,40 @@ TWITTER_CLIENT_ID= TWITTER_CLIENT_SECRET= TWITTER_REDIRECT_URL=http://localhost:80/auth/login/twitter/callback +ORCID_CLIENT_ID= +ORCID_CLIENT_SECRET= +ORCID_REDIRECT_URL=http://localhost/auth/login/orcid/callback +ORCID_ENVIRONMENT=sandbox + +NFDIAAI_CLIENT_ID= +NFDIAAI_CLIENT_SECRET= +NFDIAAI_REDIRECT_URL="${APP_URL}/auth/login/regapp/callback" + TELESCOPE_ENABLED=false + +#DATACITE Properties +DOI_HOST=datacite +DATACITE_USERNAME= +DATACITE_SECRET= +DATACITE_PREFIX= +DATACITE_ENDPOINT=https://api.test.datacite.org + +NMRKIT_URL=https://nodejs.nmrxiv.org +PUBCHEM_URL=https://pubchem.ncbi.nlm.nih.gov +COMMON_CHEMISTRY_URL=https://commonchemistry.cas.org/api +CAS_API_TOKEN= +CHEMISTRY_STANDARDIZE_URL=https://api.naturalproducts.net/latest/chem/standardize + +BACKUP_KEEP_DAYS=7 + +# CSP Configuration +CSP_ENABLED=true +CSP_REPORT_URI="/csp-violation-report" +CSP_NONCE_ENABLED=true +CSP_ENABLED_WHILE_HOT_RELOADING=false + +# Additional CSP sources (comma-separated, no spaces) +# CSP_ADDITIONAL_CONNECT_SRC="https://api.example.com,https://analytics.example.com" +# CSP_ADDITIONAL_IMG_SRC="https://cdn.example.com,https://images.example.com" +# CSP_ADDITIONAL_SCRIPT_SRC="https://cdn.example.com" +# CSP_ADDITIONAL_STYLE_SRC="https://fonts.example.com" \ No newline at end of file diff --git a/.env.example b/.env.example index 9c88138b1..96780ed07 100644 --- a/.env.example +++ b/.env.example @@ -1,37 +1,50 @@ +# ============================================================================ +# Application Configuration +# ============================================================================ APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=localhost:80 +APP_DESCRIPTION='nmrXiv is currently developed as the FAIR, consensus-driven NMR data repository and computational platform. The ultimate goal is to accelerate broader coordination and data sharing among natural product (NP) researchers by enabling the storage, management, sharing and analysis of NMR data.' +# Localization APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US + +# Maintenance & Workers APP_MAINTENANCE_DRIVER=file APP_MAINTENANCE_STORE=database PHP_CLI_SERVER_WORKERS=4 +# Application Specific BCRYPT_ROUNDS=12 -APP_DESCRIPTION='nmrXiv is currently developed as the FAIR, consensus-driven NMR data repository and computational platform. The ultimate goal is to accelerate broader coordination and data sharing among natural product (NP) researchers by enabling the storage, management, sharing and analysis of NMR data.' COOL_OFF_PERIOD=10 SCHEMA_VERSION=beta - -SHOW_BANNER=true - -GITHUB_LICENSE_URL=https://api.github.com/licenses -EUROPEMC_WS_API=https://www.ebi.ac.uk/europepmc/webservices/rest/search -ORCID_ID_SEARCH_API=https://pub.orcid.org/v2.1/search -ORCID_ID_EMPLOYMENT_API=https://pub.orcid.org/v3.0/{orcid_id}/employments -ORCID_ID_PERSON_API=https://pub.orcid.org/v3.0/{orcid_id}/person -CM_API=https://api.cheminf.studio/latest/ -CROSSREF_API=https://api.crossref.org/works/ -DATACITE_API=https://api.datacite.org/ - - +BACKUP_KEEP_DAYS=7 + +# Spectra Parsing Configuration +NMRKIT_API_URL=https://nmrkit.nmrxiv.org/latest/spectra/parse/url +BIOSCHEMA_API_URL=https://nmrxiv.org/api/v1/schemas/bioschemas +SPECTRA_STORAGE_DISK=local +SPECTRA_STORAGE_PATH=spectra_parse +SPECTRA_JOB_TRIES=3 +SPECTRA_JOB_TIMEOUT=600 +SPECTRA_RETRY_COUNT=3 +SPECTRA_DOWNLOAD_TIMEOUT=300 +SPECTRA_API_TIMEOUT=300 + +# ============================================================================ +# Logging Configuration +# ============================================================================ LOG_CHANNEL=stack LOG_STACK=single LOG_LEVEL=debug +# ============================================================================ +# Database Configuration +# ============================================================================ DB_CONNECTION=pgsql DB_HOST=pgsql DB_PORT=5432 @@ -39,23 +52,35 @@ DB_DATABASE=nmrxiv DB_USERNAME=sail DB_PASSWORD=password +# ============================================================================ +# Cache, Queue, Session & Broadcasting +# ============================================================================ BROADCAST_CONNECTION=log CACHE_STORE=file -FILESYSTEM_DRIVER=local QUEUE_CONNECTION=redis + SESSION_DRIVER=redis SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null +# ============================================================================ +# Memcached Configuration +# ============================================================================ MEMCACHED_HOST=memcached +# ============================================================================ +# Redis Configuration +# ============================================================================ REDIS_CLIENT=predis REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 +# ============================================================================ +# Mail Configuration +# ============================================================================ MAIL_MAILER=smtp MAIL_HOST=mailpit MAIL_PORT=1025 @@ -65,18 +90,25 @@ MAIL_SCHEME=null MAIL_FROM_ADDRESS=info.nmrxiv@uni-jena.de MAIL_FROM_NAME="${APP_NAME}" +# ============================================================================ +# Filesystem Configuration +# ============================================================================ FILESYSTEM_DRIVER=minio FILESYSTEM_DRIVER_PUBLIC=minio_public +# AWS S3 Compatible Storage (MinIO) AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET=nmrxiv +AWS_BUCKET_PUBLIC=nmrxiv-public AWS_ENDPOINT=http://localhost:9000/ AWS_URL=http://localhost:9000/ AWS_USE_PATH_STYLE_ENDPOINT=false -AWS_BUCKET_PUBLIC=nmrxiv-public +# ============================================================================ +# Pusher Configuration +# ============================================================================ PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= @@ -85,42 +117,105 @@ PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" +# ============================================================================ +# Scout & Meilisearch Configuration +# ============================================================================ SCOUT_DRIVER=meilisearch SCOUT_PREFIX=dev_ MEILISEARCH_HOST=http://localhost:7700/ MEILISEARCH_KEY= MEILISEARCH_PUBLICKEY= +# ============================================================================ +# OAuth Providers +# ============================================================================ +# GitHub OAuth GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= GITHUB_REDIRECT_URL=http://localhost:80/auth/login/github/callback +# Twitter OAuth TWITTER_CLIENT_ID= TWITTER_CLIENT_SECRET= TWITTER_REDIRECT_URL=http://localhost:80/auth/login/twitter/callback +# ORCID OAuth ORCID_CLIENT_ID= ORCID_CLIENT_SECRET= ORCID_REDIRECT_URL=http://localhost/auth/login/orcid/callback ORCID_ENVIRONMENT=sandbox +ORCID_UID_FIELDNAME= +ORCID_BASE_URL=https://pub.orcid.org/v3.0 +# NFDI4Chem AAI OAuth NFDIAAI_CLIENT_ID= NFDIAAI_CLIENT_SECRET= NFDIAAI_REDIRECT_URL="${APP_URL}/auth/login/regapp/callback" -TELESCOPE_ENABLED=false - -#DATACITE Properties +# ============================================================================ +# DataCite & DOI Configuration +# ============================================================================ DOI_HOST=datacite DATACITE_USERNAME= DATACITE_SECRET= DATACITE_PREFIX= -DATACITE_ENDPOINT= +DATACITE_ENDPOINT=https://api.test.datacite.org +DATACITE_API=https://api.datacite.org/ -NMRKIT_URL=https://nodejs.nmrxiv.org -CAS_URL=https://commonchemistry.cas.org +# ============================================================================ +# External API Services +# ============================================================================ +# ROR (Research Organization Registry) +ROR_API_URL=https://api.ror.org/organizations +ROR_CLIENT_ID= + +# Europe PMC & CrossRef +EUROPEMC_WS_API=https://www.ebi.ac.uk/europepmc/webservices/rest/search +CROSSREF_API=https://api.crossref.org/works/ + +# ChemInformatics API +CM_API=https://api.cheminf.studio/latest/ + +# CAS (Chemical Abstracts Service) +CAS_API_TOKEN= + +# PubChem PUBCHEM_URL=https://pubchem.ncbi.nlm.nih.gov -COMMON_CHEMISTRY_URL=https://commonchemistry.cas.org + +# Common Chemistry +COMMON_CHEMISTRY_URL=https://commonchemistry.cas.org/api + +# Chemistry Standardization CHEMISTRY_STANDARDIZE_URL=https://api.cheminf.studio/latest/chem/standardize -BACKUP_KEEP_DAYS=7 \ No newline at end of file +# ============================================================================ +# NMRIUM Specific Services +# ============================================================================ +NMRKIT_URL=https://nodejs.nmrxiv.org +NMRIUM_URL=https://nmrium.nmrxiv.org?defaultEmptyMessage=loading&workspace=nmrXiv + +# ============================================================================ +# External Links +# ============================================================================ +MICHI_STANDARDS_URL=https://nfdi4chem.github.io/workshops/docs/michi/tabular/nmr/v1/table + +# ============================================================================ +# Content Security Policy (CSP) Configuration +# ============================================================================ +CSP_ENABLED=true +CSP_NONCE_ENABLED=false +CSP_ENABLED_WHILE_HOT_RELOADING=false + +# Additional CSP sources (comma-separated, no spaces) +# CSP_ADDITIONAL_CONNECT_SRC="https://api.example.com,https://analytics.example.com" +# CSP_ADDITIONAL_IMG_SRC="https://cdn.example.com,https://images.example.com" +# CSP_ADDITIONAL_SCRIPT_SRC="https://cdn.example.com" +# CSP_ADDITIONAL_STYLE_SRC="https://fonts.example.com" + +# ============================================================================ +# Laravel Octane Configuration +# ============================================================================ +OCTANE_SERVER=frankenphp +OCTANE_MAX_EXECUTION_TIME=3600 +OCTANE_HTTPS=true +SUPERVISOR_PHP_COMMAND="/usr/local/bin/php -d variables_order=EGPCS -d max_execution_time=600 -d max_input_time=600 -d memory_limit=4G /var/www/html/artisan octane:start --server=frankenphp --host=0.0.0.0 --admin-port=2019 --port=80" diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index eb396fac6..2b4b1bb3b 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -16,8 +16,9 @@ env: REPOSITORY_NAMESPACE: nfdi4chem jobs: + # Lint and Security check lint-security: - name: Lint & Security (reusable) + name: Lint & Security uses: ./.github/workflows/lint-security-check.yml permissions: contents: read @@ -27,11 +28,33 @@ jobs: run_js: true run_secrets: true + # Run tests and collect coverage + test-coverage: + name: Tests & Coverage + uses: ./.github/workflows/test-coverage.yml + needs: [lint-security] + secrets: inherit + + # Smoke test Docker images before pushing + smoke-test: + name: Smoke test Docker images + uses: ./.github/workflows/docker-smoke-test.yml + needs: [test-coverage] + # Build and publish Docker images for the development environment - setup-build-publish-deploy: - name: Build & deploy to development + build-and-push: + name: Build & push to Docker Hub runs-on: ubuntu-latest - needs: [lint-security] + needs: [test-coverage, smoke-test, lint-security] + strategy: + matrix: + image: + - name: app + file: ./deployment/Dockerfile + tag: app-dev-latest + - name: worker + file: ./deployment/Dockerfile.worker + tag: worker-dev-latest # Environment provides secrets and protection rules environment: @@ -52,28 +75,15 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - # Build + push app image (tag: app-dev-latest). Uses GHA cache for speed. - - name: Build and push App Docker image - uses: docker/build-push-action@v6 - with: - context: . - file: ./deployment/Dockerfile - push: true - build-args: | - RELEASE_VERSION=app-dev-latest - tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:app-dev-latest - cache-from: type=gha - cache-to: type=gha,mode=max - - # Build + push worker image (tag: worker-dev-latest) - - name: Build and push Worker Docker image + # Build and push image + - name: Build and push ${{ matrix.image.name }} image uses: docker/build-push-action@v6 with: context: . - file: ./deployment/Dockerfile.worker + file: ${{ matrix.image.file }} push: true build-args: | - RELEASE_VERSION=worker-dev-latest - tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:worker-dev-latest - cache-from: type=gha - cache-to: type=gha,mode=max \ No newline at end of file + RELEASE_VERSION=${{ matrix.image.tag }} + tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ matrix.image.tag }} + cache-from: type=gha,scope=${{ matrix.image.name }} + cache-to: type=gha,mode=max,scope=${{ matrix.image.name }} \ No newline at end of file diff --git a/.github/workflows/docker-smoke-test.yml b/.github/workflows/docker-smoke-test.yml new file mode 100644 index 000000000..faeb8a8f0 --- /dev/null +++ b/.github/workflows/docker-smoke-test.yml @@ -0,0 +1,62 @@ +name: Docker Image Smoke Tests + +on: + workflow_call: + +env: + REPOSITORY_NAME: nmrxiv + REPOSITORY_NAMESPACE: nfdi4chem + +jobs: + smoke-test: + name: Smoke test containers + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + container: + - name: app + file: ./deployment/Dockerfile + wait-time: 60 + - name: worker + file: ./deployment/Dockerfile.worker + wait-time: 60 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and export ${{ matrix.container.name }} image + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.container.file }} + load: true + tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ matrix.container.name }}-test + cache-from: type=gha,scope=${{ matrix.container.name }} + cache-to: type=gha,mode=max,scope=${{ matrix.container.name }} + + - name: Start ${{ matrix.container.name }} container + run: | + docker run -d --name nmrxiv-${{ matrix.container.name }}-test \ + -e APP_KEY=base64:$(openssl rand -base64 32) \ + -e APP_ENV=production \ + -e DB_CONNECTION=sqlite \ + -e CACHE_STORE=array \ + -e SESSION_DRIVER=array \ + -e QUEUE_CONNECTION=sync \ + ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ matrix.container.name }}-test + + - name: Wait for ${{ matrix.container.name }} container health + uses: stringbean/docker-healthcheck-action@v3 + with: + container: nmrxiv-${{ matrix.container.name }}-test + wait-time: ${{ matrix.container.wait-time }} + require-status: running + require-healthy: true + + - name: Cleanup ${{ matrix.container.name }} container + if: always() + run: docker rm -f nmrxiv-${{ matrix.container.name }}-test diff --git a/.github/workflows/lint-security-check.yml b/.github/workflows/lint-security-check.yml index 287ab2d43..102408c7b 100644 --- a/.github/workflows/lint-security-check.yml +++ b/.github/workflows/lint-security-check.yml @@ -40,7 +40,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: "8.4" coverage: none tools: composer extensions: mbstring, intl, pdo, pdo_mysql, pdo_pgsql @@ -79,8 +79,8 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' - cache: 'npm' + node-version: "20" + cache: "npm" - name: Install Node dependencies run: npm ci @@ -145,4 +145,4 @@ jobs: if [ "$code" -ne 0 ]; then echo "Gitleaks detected potential secrets (exit code $code). Failing job after SARIF upload." >&2 exit 1 - fi \ No newline at end of file + fi diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint-test.yml similarity index 55% rename from .github/workflows/pr-lint.yml rename to .github/workflows/pr-lint-test.yml index fb1d6f381..bb1454ffc 100644 --- a/.github/workflows/pr-lint.yml +++ b/.github/workflows/pr-lint-test.yml @@ -1,4 +1,4 @@ -name: PR Lint & Security +name: PR Lint, Security and Tests on: pull_request: @@ -10,12 +10,21 @@ on: permissions: contents: read security-events: write + pull-requests: write + checks: write jobs: lint-security: name: Lint & Security (PR) + if: github.event.pull_request.merged != true uses: ./.github/workflows/lint-security-check.yml with: run_php: true run_js: true run_secrets: true + + test-coverage: + name: Tests & Coverage (PHP 8.4) + if: github.event.pull_request.merged != true + uses: ./.github/workflows/test-coverage.yml + secrets: inherit diff --git a/.github/workflows/prod-build.yml b/.github/workflows/prod-build.yml index 0cd341039..36ab361d7 100644 --- a/.github/workflows/prod-build.yml +++ b/.github/workflows/prod-build.yml @@ -20,22 +20,10 @@ env: REPOSITORY_NAMESPACE: nfdi4chem jobs: - lint-security: - name: Lint & Security (reusable) - uses: ./.github/workflows/lint-security-check.yml - permissions: - contents: read - security-events: write - with: - run_php: true - run_js: true - run_secrets: true - # Guard: confirm input and authorize actor guard: name: Access control and confirmation runs-on: ubuntu-latest - needs: [lint-security] steps: - name: Validate actor and confirmation shell: bash @@ -62,11 +50,43 @@ jobs: fi echo "Authorization check passed." + lint-security: + name: Lint & Security + uses: ./.github/workflows/lint-security-check.yml + needs: [guard] + permissions: + contents: read + security-events: write + with: + run_php: true + run_js: true + run_secrets: true + + # Run tests and collect coverage + test-coverage: + name: Tests & Coverage + uses: ./.github/workflows/test-coverage.yml + needs: [guard, lint-security] + secrets: inherit + + # Smoke test Docker images before pushing + smoke-test: + name: Smoke test Docker images + uses: ./.github/workflows/docker-smoke-test.yml + needs: [guard, test-coverage] + # Build and publish Docker images for the production environment - setup-build-publish-deploy-prod: - name: Deploy to prod + build-and-push: + name: Build & push to Docker Hub runs-on: ubuntu-latest - needs: [guard] + needs: [guard, test-coverage, smoke-test] + strategy: + matrix: + image: + - name: app + file: ./deployment/Dockerfile + - name: worker + file: ./deployment/Dockerfile.worker environment: name: Prod steps: @@ -102,34 +122,18 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - # Build + push app image (tags: release, sha, latest). Uses GHA cache. - - name: Build and push App Docker image - uses: docker/build-push-action@v6 - with: - context: . - file: ./deployment/Dockerfile - push: true - build-args: | - RELEASE_VERSION=${{ steps.fetch-latest-release.outputs.tag_name }} - tags: | - ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:app-sha-${{ steps.fetch-latest-release.outputs.sha_short }} - ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:app-${{ steps.fetch-latest-release.outputs.tag_name }} - ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:app-latest - cache-from: type=gha - cache-to: type=gha,mode=max - - # Build + push worker image (tags: release, sha, latest) - - name: Build and push Worker Docker image + # Build and push image + - name: Build and push ${{ matrix.image.name }} image uses: docker/build-push-action@v6 with: context: . - file: ./deployment/Dockerfile.worker + file: ${{ matrix.image.file }} push: true build-args: | RELEASE_VERSION=${{ steps.fetch-latest-release.outputs.tag_name }} tags: | - ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:worker-sha-${{ steps.fetch-latest-release.outputs.sha_short }} - ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:worker-${{ steps.fetch-latest-release.outputs.tag_name }} - ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:worker-latest - cache-from: type=gha - cache-to: type=gha,mode=max \ No newline at end of file + ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ matrix.image.name }}-sha-${{ steps.fetch-latest-release.outputs.sha_short }} + ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ matrix.image.name }}-${{ steps.fetch-latest-release.outputs.tag_name }} + ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ matrix.image.name }}-latest + cache-from: type=gha,scope=${{ matrix.image.name }} + cache-to: type=gha,mode=max,scope=${{ matrix.image.name }} \ No newline at end of file diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml new file mode 100644 index 000000000..f06a487bf --- /dev/null +++ b/.github/workflows/test-coverage.yml @@ -0,0 +1,79 @@ +name: PHPUnit Tests & Coverage Analysis + +on: + workflow_call: + +jobs: + test-coverage: + name: Tests & Coverage (PHP 8.4) + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:17 + env: + POSTGRES_DB: nmrxiv_test + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.4' + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql, bcmath, soap, intl, gd, exif, iconv + coverage: pcov + + - name: Cache Composer packages + uses: actions/cache@v4 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install composer dependencies + run: composer install --ignore-platform-reqs + + - name: Prepare Laravel Application + run: | + php -r "file_exists('.env') || copy('.env.ci', '.env');" + + echo AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID_DEV }} >> .env + echo AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY_DEV }} >> .env + echo MEILISEARCH_KEY=${{ secrets.MEILISEARCH_KEY_DEV }} >> .env + echo MEILISEARCH_PUBLICKEY=${{ secrets.MEILISEARCH_PUBLICKEY_DEV }} >> .env + + php artisan key:generate + php artisan migrate --seed + + - name: Cache Node modules + uses: actions/cache@v4 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install front-end dependencies + run: npm ci + + - name: Build front-end assets + run: npm run build + + - name: Run tests and collect coverage + run: vendor/bin/phpunit --coverage-clover coverage.xml --display-skipped + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + file: ./coverage.xml + flags: unittests + name: codecov-umbrella + fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 3978544ae..b262e1c19 100644 --- a/.gitignore +++ b/.gitignore @@ -2,12 +2,14 @@ /public/hot /public/build /public/storage +/public/vendor +/public/vendor/swagger-api /storage/*.key /storage/pail +/storage/app/spectra_parse /vendor .env .env.production -.env.* .env.backup .phpunit.result.cache docker-compose.override.yml @@ -24,3 +26,8 @@ docs/.vitepress/cache **/caddy frankenphp frankenphp-worker.php + +# Coverage reports +coverage.xml +coverage-report/ +.phpunit.cache diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..2312dc587 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results deleted file mode 100644 index 4a6a82fcb..000000000 --- a/.phpunit.cache/test-results +++ /dev/null @@ -1 +0,0 @@ -{"version":1,"defects":{"Tests\\Feature\\ApiTokenPermissionsTest::test_api_token_permissions_can_be_updated":8,"Tests\\Feature\\AuthenticationTest::test_login_screen_can_be_rendered":8,"Tests\\Feature\\AuthenticationTest::test_users_can_authenticate_using_the_login_screen":8,"Tests\\Feature\\AuthenticationTest::test_users_can_not_authenticate_with_invalid_password":8,"Tests\\Feature\\BrowserSessionsTest::test_other_browser_sessions_can_be_logged_out":8,"Tests\\Feature\\CreateApiTokenTest::test_api_tokens_can_be_created":8,"Tests\\Feature\\CreateTeamTest::test_teams_can_be_created":8,"Tests\\Feature\\DeleteAccountTest::test_user_accounts_can_be_deleted":1,"Tests\\Feature\\DeleteAccountTest::test_correct_password_must_be_provided_before_account_can_be_deleted":1,"Tests\\Feature\\DeleteApiTokenTest::test_api_tokens_can_be_deleted":8,"Tests\\Feature\\DeleteTeamTest::test_teams_can_be_deleted":8,"Tests\\Feature\\DeleteTeamTest::test_personal_teams_cant_be_deleted":8,"Tests\\Feature\\EmailVerificationTest::test_email_verification_screen_can_be_rendered":8,"Tests\\Feature\\EmailVerificationTest::test_email_can_be_verified":8,"Tests\\Feature\\EmailVerificationTest::test_email_can_not_verified_with_invalid_hash":8,"Tests\\Feature\\ExampleTest::test_the_application_returns_a_successful_response":7,"Tests\\Feature\\InviteTeamMemberTest::test_team_members_can_be_invited_to_team":8,"Tests\\Feature\\InviteTeamMemberTest::test_team_member_invitations_can_be_cancelled":8,"Tests\\Feature\\LeaveTeamTest::test_users_can_leave_teams":8,"Tests\\Feature\\LeaveTeamTest::test_team_owners_cant_leave_their_own_team":8,"Tests\\Feature\\PasswordConfirmationTest::test_confirm_password_screen_can_be_rendered":8,"Tests\\Feature\\PasswordConfirmationTest::test_password_can_be_confirmed":8,"Tests\\Feature\\PasswordConfirmationTest::test_password_is_not_confirmed_with_invalid_password":8,"Tests\\Feature\\PasswordResetTest::test_reset_password_link_screen_can_be_rendered":8,"Tests\\Feature\\PasswordResetTest::test_reset_password_link_can_be_requested":8,"Tests\\Feature\\PasswordResetTest::test_reset_password_screen_can_be_rendered":8,"Tests\\Feature\\PasswordResetTest::test_password_can_be_reset_with_valid_token":8,"Tests\\Feature\\ProfileInformationTest::test_profile_information_can_be_updated":8,"Tests\\Feature\\RegistrationTest::test_registration_screen_can_be_rendered":8,"Tests\\Feature\\RegistrationTest::test_registration_screen_cannot_be_rendered_if_support_is_disabled":1,"Tests\\Feature\\RegistrationTest::test_new_users_can_register":8,"Tests\\Feature\\RemoveTeamMemberTest::test_team_members_can_be_removed_from_teams":8,"Tests\\Feature\\RemoveTeamMemberTest::test_only_team_owner_can_remove_team_members":8,"Tests\\Feature\\TwoFactorAuthenticationSettingsTest::test_two_factor_authentication_can_be_enabled":8,"Tests\\Feature\\TwoFactorAuthenticationSettingsTest::test_recovery_codes_can_be_regenerated":8,"Tests\\Feature\\TwoFactorAuthenticationSettingsTest::test_two_factor_authentication_can_be_disabled":8,"Tests\\Feature\\UpdatePasswordTest::test_password_can_be_updated":8,"Tests\\Feature\\UpdatePasswordTest::test_current_password_must_be_correct":8,"Tests\\Feature\\UpdatePasswordTest::test_new_passwords_must_match":8,"Tests\\Feature\\UpdateTeamMemberRoleTest::test_team_member_roles_can_be_updated":8,"Tests\\Feature\\UpdateTeamMemberRoleTest::test_only_team_owner_can_update_team_member_roles":8,"Tests\\Feature\\UpdateTeamNameTest::test_team_names_can_be_updated":8,"Tests\\Feature\\OEmbedTest::it_can_generate_oembed_response_for_study":8,"Tests\\Feature\\OEmbedTest::it_can_generate_oembed_response_for_dataset":8,"Tests\\Feature\\OEmbedTest::it_accepts_custom_width_and_height_parameters":8,"Tests\\Feature\\OEmbedTest::it_handles_study_without_thumbnail":8,"Tests\\Feature\\OEmbedTest::it_returns_400_when_url_parameter_is_missing":8,"Tests\\Feature\\OEmbedTest::it_returns_400_when_url_format_is_invalid":8,"Tests\\Feature\\OEmbedTest::it_returns_400_when_identifier_is_missing_from_url":8,"Tests\\Feature\\OEmbedTest::it_returns_404_when_identifier_cannot_be_resolved":8,"Tests\\Feature\\OEmbedTest::it_returns_404_when_identifier_format_is_invalid":8,"Tests\\Feature\\OEmbedTest::it_can_render_embedded_study_content":8,"Tests\\Feature\\OEmbedTest::it_can_render_embedded_dataset_content":8,"Tests\\Feature\\OEmbedTest::it_returns_400_when_embed_identifier_is_empty":8,"Tests\\Feature\\OEmbedTest::it_returns_404_when_embed_identifier_cannot_be_resolved":8,"Tests\\Feature\\OEmbedTest::it_returns_404_when_embed_identifier_format_is_invalid":8,"Tests\\Feature\\OEmbedTest::it_returns_400_for_unsupported_content_type_in_embed":8,"Tests\\Feature\\OEmbedTest::it_handles_dataset_without_associated_study":8,"Tests\\Feature\\OEmbedTest::it_handles_nmrxiv_prefix_in_identifier":8,"Tests\\Feature\\OEmbedTest::it_handles_case_insensitive_identifiers":8,"Tests\\Feature\\OEmbedTest::it_supports_json_format_parameter":8,"Tests\\Feature\\OEmbedTest::it_handles_server_errors_gracefully":8,"Tests\\Feature\\OEmbedTest::test_it_can_generate_oembed_response_for_study":7,"Tests\\Feature\\OEmbedTest::test_it_can_generate_oembed_response_for_dataset":8,"Tests\\Feature\\OEmbedTest::test_it_accepts_custom_width_and_height_parameters":8,"Tests\\Feature\\OEmbedTest::test_it_handles_study_without_thumbnail":8,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_url_parameter_is_missing":7,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_url_format_is_invalid":7,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_identifier_is_missing_from_url":8,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_identifier_cannot_be_resolved":7,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_identifier_format_is_invalid":7,"Tests\\Feature\\OEmbedTest::test_it_can_render_embedded_study_content":7,"Tests\\Feature\\OEmbedTest::test_it_can_render_embedded_dataset_content":7,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_embed_identifier_is_empty":8,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_embed_identifier_cannot_be_resolved":7,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_embed_identifier_format_is_invalid":7,"Tests\\Feature\\OEmbedTest::test_it_returns_400_for_unsupported_content_type_in_embed":7,"Tests\\Feature\\OEmbedTest::test_it_handles_dataset_without_associated_study":7,"Tests\\Feature\\OEmbedTest::test_it_handles_nmrxiv_prefix_in_identifier":8,"Tests\\Feature\\OEmbedTest::test_it_handles_case_insensitive_identifiers":8,"Tests\\Feature\\OEmbedTest::test_it_supports_json_format_parameter":8,"Tests\\Feature\\OEmbedTest::test_it_handles_server_errors_gracefully":8,"Tests\\Feature\\OEmbedTest::test_it_validates_width_and_height_parameters":7,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_string_with_json_data":7,"Tests\\Unit\\AuthorServiceTest::test_sync_authors_creates_new_authors":8,"Tests\\Unit\\AuthorServiceTest::test_sync_authors_reuses_existing_authors_by_email":8,"Tests\\Unit\\AuthorServiceTest::test_sync_authors_handles_empty_array":8,"Tests\\Unit\\AuthorServiceTest::test_sync_authors_validates_required_fields":8,"Tests\\Unit\\AuthorServiceTest::test_remove_author_from_project_detaches_successfully":8,"Tests\\Unit\\AuthorServiceTest::test_remove_author_from_project_handles_nonexistent_author":8,"Tests\\Unit\\AuthorServiceTest::test_update_contributor_type_changes_role":8,"Tests\\Unit\\AuthorServiceTest::test_update_contributor_type_validates_role":8,"Tests\\Unit\\AuthorServiceTest::test_sync_authors_uses_database_transaction":8,"Tests\\Unit\\AuthorServiceTest::test_sync_authors_creates_composite_index_optimized_queries":8,"Tests\\Unit\\AuthorServiceTest::test_sync_authors_prevents_n_plus_one_queries":8,"Tests\\Unit\\ProcessDraftELNSubmissionProxyTest::test_http_client_uses_proxy_when_configured":8,"Tests\\Unit\\ProcessDraftELNSubmissionProxyTest::test_http_client_works_without_proxy_configuration":8,"Tests\\Feature\\ManageAuthorsTest::test_author_cannot_be_updated_or_detached_if_project_is_public":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_can_be_created_with_submitted_through_field":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_factory_creates_sample_with_null_submitted_through_by_default":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_factory_can_create_sample_with_eln_state":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_factory_can_create_sample_with_custom_submitted_through":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_can_be_updated_with_submitted_through_field":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_submitted_through_field_is_fillable":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_submitted_through_field_accepts_null_values":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_submitted_through_field_accepts_various_string_values":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_can_store_processing_logs_from_draft":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_can_be_created_with_submitted_through_field":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_creates_study_with_null_submitted_through_by_default":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_can_create_study_with_eln_state":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_can_create_study_with_default_eln":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_can_create_study_with_custom_submitted_through":8,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_can_be_updated_with_submitted_through_field":8,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_create_tracking_success":8,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_create_tracking_authentication_failure":5,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_trackings_success":8,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_tracking_by_id_success":8,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_tracking_items_success":8,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_tracking_item_by_name_success":8,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_create_eln_submission_tracking_success":7,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_update_eln_submission_status_success":8,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_api_error_handling":5,"Tests\\Feature\\ELNSubmissionTrackingTest::test_eln_submission_creates_tracking_when_received":7,"Tests\\Feature\\ELNSubmissionTrackingTest::test_study_publication_creates_tracking_when_published":8,"Tests\\Feature\\ELNSubmissionTrackingTest::test_tracking_failure_does_not_break_submission":7,"Tests\\Feature\\ELNSubmissionTrackingTest::test_non_eln_study_publication_does_not_create_tracking":8,"Tests\\Feature\\SearchControllerSecurityTest::test_sql_injection_in_query_parameter":8,"Tests\\Feature\\SearchControllerSecurityTest::test_sql_injection_in_filter_queries":7,"Tests\\Feature\\SearchControllerSecurityTest::test_input_validation":8,"Tests\\Feature\\SearchControllerSecurityTest::test_query_length_limits":8,"Tests\\Feature\\SearchControllerSecurityTest::test_control_character_filtering":8,"Tests\\Feature\\SearchControllerSecurityTest::test_smiles_injection_attempts":7,"Tests\\Feature\\SearchControllerSecurityTest::test_inchi_injection_attempts":8,"Tests\\Feature\\SearchControllerSecurityTest::test_legitimate_queries_still_work":8,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_handles_ranges":5,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_sanitizes_text":5,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_validates_booleans":5,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_validates_database_names":5,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_malicious_filter_queries_handled_safely":5,"Tests\\Unit\\MarkdownSecurityTest::test_md_function_allows_safe_html":7,"Tests\\Unit\\MarkdownSecurityTest::test_md_function_preserves_markdown_formatting":7,"Tests\\Unit\\MarkdownXSSSecurityTest::test_javascript_urls_are_removed":7,"Tests\\Feature\\RouteStructureTest::test_project_route_accepts_valid_identifiers":8,"Tests\\Feature\\RouteStructureTest::test_sample_route_accepts_valid_identifiers":8,"Tests\\Feature\\RouteStructureTest::test_compound_route_accepts_valid_identifiers":8},"times":{"Tests\\Unit\\ExampleTest::test_example":0.003,"Tests\\Feature\\ExampleTest::test_the_application_returns_a_successful_response":0.181,"Tests\\Feature\\ApiTokenPermissionsTest::test_api_token_permissions_can_be_updated":0.047,"Tests\\Feature\\AuthenticationTest::test_login_screen_can_be_rendered":0.035,"Tests\\Feature\\AuthenticationTest::test_users_can_authenticate_using_the_login_screen":0.061,"Tests\\Feature\\AuthenticationTest::test_users_can_not_authenticate_with_invalid_password":0.052,"Tests\\Feature\\BrowserSessionsTest::test_other_browser_sessions_can_be_logged_out":0.099,"Tests\\Feature\\CreateApiTokenTest::test_api_tokens_can_be_created":0.01,"Tests\\Feature\\CreateTeamTest::test_teams_can_be_created":0.011,"Tests\\Feature\\DeleteAccountTest::test_user_accounts_can_be_deleted":0.013,"Tests\\Feature\\DeleteAccountTest::test_correct_password_must_be_provided_before_account_can_be_deleted":0,"Tests\\Feature\\DeleteApiTokenTest::test_api_tokens_can_be_deleted":0.007,"Tests\\Feature\\DeleteTeamTest::test_teams_can_be_deleted":0.071,"Tests\\Feature\\DeleteTeamTest::test_personal_teams_cant_be_deleted":0.211,"Tests\\Feature\\EmailVerificationTest::test_email_verification_screen_can_be_rendered":0.015,"Tests\\Feature\\EmailVerificationTest::test_email_can_be_verified":0.007,"Tests\\Feature\\EmailVerificationTest::test_email_can_not_verified_with_invalid_hash":0.007,"Tests\\Feature\\InviteTeamMemberTest::test_team_members_can_be_invited_to_team":0.019,"Tests\\Feature\\InviteTeamMemberTest::test_team_member_invitations_can_be_cancelled":0.007,"Tests\\Feature\\LeaveTeamTest::test_users_can_leave_teams":0.01,"Tests\\Feature\\LeaveTeamTest::test_team_owners_cant_leave_their_own_team":0.006,"Tests\\Feature\\PasswordConfirmationTest::test_confirm_password_screen_can_be_rendered":0.012,"Tests\\Feature\\PasswordConfirmationTest::test_password_can_be_confirmed":0.047,"Tests\\Feature\\PasswordConfirmationTest::test_password_is_not_confirmed_with_invalid_password":0.209,"Tests\\Feature\\PasswordResetTest::test_reset_password_link_screen_can_be_rendered":0.007,"Tests\\Feature\\PasswordResetTest::test_reset_password_link_can_be_requested":0.216,"Tests\\Feature\\PasswordResetTest::test_reset_password_screen_can_be_rendered":0.216,"Tests\\Feature\\PasswordResetTest::test_password_can_be_reset_with_valid_token":0.229,"Tests\\Feature\\ProfileInformationTest::test_profile_information_can_be_updated":0.078,"Tests\\Feature\\RegistrationTest::test_registration_screen_can_be_rendered":0.006,"Tests\\Feature\\RegistrationTest::test_registration_screen_cannot_be_rendered_if_support_is_disabled":0,"Tests\\Feature\\RegistrationTest::test_new_users_can_register":0.012,"Tests\\Feature\\RemoveTeamMemberTest::test_team_members_can_be_removed_from_teams":0.008,"Tests\\Feature\\RemoveTeamMemberTest::test_only_team_owner_can_remove_team_members":0.009,"Tests\\Feature\\TwoFactorAuthenticationSettingsTest::test_two_factor_authentication_can_be_enabled":0.009,"Tests\\Feature\\TwoFactorAuthenticationSettingsTest::test_recovery_codes_can_be_regenerated":0.009,"Tests\\Feature\\TwoFactorAuthenticationSettingsTest::test_two_factor_authentication_can_be_disabled":0.006,"Tests\\Feature\\UpdatePasswordTest::test_password_can_be_updated":0.048,"Tests\\Feature\\UpdatePasswordTest::test_current_password_must_be_correct":0.086,"Tests\\Feature\\UpdatePasswordTest::test_new_passwords_must_match":0.086,"Tests\\Feature\\UpdateTeamMemberRoleTest::test_team_member_roles_can_be_updated":0.01,"Tests\\Feature\\UpdateTeamMemberRoleTest::test_only_team_owner_can_update_team_member_roles":0.746,"Tests\\Feature\\UpdateTeamNameTest::test_team_names_can_be_updated":0.008,"Tests\\Feature\\OEmbedTest::test_it_can_generate_oembed_response_for_study":0.009,"Tests\\Feature\\OEmbedTest::test_it_can_generate_oembed_response_for_dataset":0.005,"Tests\\Feature\\OEmbedTest::test_it_accepts_custom_width_and_height_parameters":0.005,"Tests\\Feature\\OEmbedTest::test_it_handles_study_without_thumbnail":0.007,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_url_parameter_is_missing":0.005,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_url_format_is_invalid":0.004,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_identifier_is_missing_from_url":0.004,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_identifier_cannot_be_resolved":0.007,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_identifier_format_is_invalid":0.009,"Tests\\Feature\\OEmbedTest::test_it_can_render_embedded_study_content":0.017,"Tests\\Feature\\OEmbedTest::test_it_can_render_embedded_dataset_content":0.013,"Tests\\Feature\\OEmbedTest::test_it_returns_400_when_embed_identifier_is_empty":0.005,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_embed_identifier_cannot_be_resolved":0.004,"Tests\\Feature\\OEmbedTest::test_it_returns_404_when_embed_identifier_format_is_invalid":0.004,"Tests\\Feature\\OEmbedTest::test_it_returns_400_for_unsupported_content_type_in_embed":0.012,"Tests\\Feature\\OEmbedTest::test_it_handles_dataset_without_associated_study":0.006,"Tests\\Feature\\OEmbedTest::test_it_handles_nmrxiv_prefix_in_identifier":0.006,"Tests\\Feature\\OEmbedTest::test_it_handles_case_insensitive_identifiers":0.008,"Tests\\Feature\\OEmbedTest::test_it_supports_json_format_parameter":0.006,"Tests\\Feature\\OEmbedTest::test_it_handles_server_errors_gracefully":0.006,"Tests\\Feature\\OEmbedTest::test_it_returns_500_when_identifier_format_is_invalid":0.004,"Tests\\Feature\\OEmbedTest::test_it_returns_500_when_embed_identifier_format_is_invalid":0.004,"Tests\\Feature\\OEmbedTest::test_it_returns_404_for_unsupported_content_type_in_embed":0.005,"Tests\\Feature\\OEmbedTest::test_it_blocks_private_content_in_oembed":0.007,"Tests\\Feature\\OEmbedTest::test_it_blocks_private_content_in_embed":0.006,"Tests\\Feature\\OEmbedTest::test_it_blocks_external_domain_urls":0.007,"Tests\\Feature\\OEmbedTest::test_it_validates_width_and_height_parameters":0.009,"Tests\\Feature\\OEmbedTest::test_iframe_html_is_properly_sanitized":0.005,"Tests\\Feature\\ManageAuthorsTest::test_author_can_be_created_and_updated":0.025,"Tests\\Feature\\ManageAuthorsTest::test_author_can_be_updated":0.024,"Tests\\Feature\\ManageAuthorsTest::test_author_can_be_detached":0.019,"Tests\\Feature\\ManageAuthorsTest::test_author_cannot_be_updated_or_deleted_by_reviewer":0.016,"Tests\\Feature\\ManageAuthorsTest::test_author_cannot_be_updated_or_detached_if_project_is_public":0.013,"Tests\\Feature\\ManageAuthorsTest::test_role_of_an_author_can_be_updated":0.013,"Tests\\Feature\\ManageAuthorsTest::test_role_of_an_author_cannot_be_updated_by_reviewer":0.011,"Tests\\Feature\\ManageAuthorsTest::test_role_of_an_author_cannot_be_updated_for_random_contributor_types":0.011,"Tests\\Unit\\ProcessDraftELNSubmissionProxyTest::test_http_client_uses_proxy_when_configured":0.067,"Tests\\Unit\\ProcessDraftELNSubmissionProxyTest::test_http_client_works_without_proxy_configuration":0.003,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_string_preserves_newlines":0.003,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_string_removes_problematic_unicode":0,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_string_preserves_ascii_printable":0,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_string_with_json_data":0,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_in_array_preserves_newlines":0,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_in_nmrium_data_preserves_newlines":0,"Tests\\Unit\\HelperFunctionsTest::test_sanitize_unicode_string_converts_escape_sequences":0,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_can_be_created_with_submitted_through_field":0.007,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_factory_creates_sample_with_null_submitted_through_by_default":0.002,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_factory_can_create_sample_with_eln_state":0.002,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_factory_can_create_sample_with_custom_submitted_through":0.002,"Tests\\Feature\\SampleSubmittedThroughTest::test_sample_can_be_updated_with_submitted_through_field":0.002,"Tests\\Feature\\SampleSubmittedThroughTest::test_submitted_through_field_is_fillable":0.001,"Tests\\Feature\\SampleSubmittedThroughTest::test_submitted_through_field_accepts_null_values":0.003,"Tests\\Feature\\SampleSubmittedThroughTest::test_submitted_through_field_accepts_various_string_values":0.01,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_can_be_created_with_submitted_through_field":0.008,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_creates_study_with_null_submitted_through_by_default":0.004,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_can_create_study_with_eln_state":0.003,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_can_create_study_with_default_eln":0.003,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_factory_can_create_study_with_custom_submitted_through":0.003,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_can_be_updated_with_submitted_through_field":0.005,"Tests\\Feature\\SampleSubmittedThroughTest::test_study_can_store_processing_logs_from_draft":0.003,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_create_tracking_success":0.02,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_create_tracking_authentication_failure":0.004,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_trackings_success":0.001,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_tracking_by_id_success":0.001,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_tracking_items_success":0.001,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_get_tracking_item_by_name_success":0.001,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_create_eln_submission_tracking_success":0.001,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_update_eln_submission_status_success":0.001,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_api_error_handling":0.001,"Tests\\Feature\\ELNSubmissionTrackingTest::test_eln_submission_creates_tracking_when_received":0.356,"Tests\\Feature\\ELNSubmissionTrackingTest::test_study_publication_creates_tracking_when_published":0.025,"Tests\\Feature\\ELNSubmissionTrackingTest::test_tracking_failure_does_not_break_submission":0.015,"Tests\\Feature\\ELNSubmissionTrackingTest::test_non_eln_study_publication_does_not_create_tracking":0.007,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_is_enabled_returns_correct_value":0,"Tests\\Unit\\ChemotionRepositoryTrackerServiceTest::test_status_validation":0.001,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_sanitize_query_removes_control_characters":0.003,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_sanitize_query_trims_whitespace":0,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_sanitize_query_limits_length":0,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_sanitize_query_handles_null":0,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_validates_fields":0,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_handles_ranges":0.005,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_sanitizes_text":0,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_validates_booleans":0,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_build_secure_filter_query_validates_database_names":0,"Tests\\Unit\\SearchControllerSecurityUnitTest::test_malicious_filter_queries_handled_safely":0,"Tests\\Feature\\SearchControllerSecurityTest::test_sql_injection_in_query_parameter":0.037,"Tests\\Feature\\SearchControllerSecurityTest::test_sql_injection_in_filter_queries":0.012,"Tests\\Feature\\SearchControllerSecurityTest::test_input_validation":0.008,"Tests\\Feature\\SearchControllerSecurityTest::test_query_length_limits":0.003,"Tests\\Feature\\SearchControllerSecurityTest::test_control_character_filtering":0.003,"Tests\\Feature\\SearchControllerSecurityTest::test_smiles_injection_attempts":0.006,"Tests\\Feature\\SearchControllerSecurityTest::test_inchi_injection_attempts":0.005,"Tests\\Feature\\SearchControllerSecurityTest::test_legitimate_queries_still_work":0.006,"Tests\\Unit\\MarkdownSecurityTest::test_md_function_sanitizes_script_tags":0.004,"Tests\\Unit\\MarkdownSecurityTest::test_md_function_allows_safe_html":0.008,"Tests\\Unit\\MarkdownSecurityTest::test_md_function_handles_empty_input":0,"Tests\\Unit\\MarkdownSecurityTest::test_md_function_prevents_various_xss_attacks":0,"Tests\\Unit\\MarkdownSecurityTest::test_md_function_preserves_markdown_formatting":0,"Tests\\Unit\\MarkdownXSSSecurityTest::test_script_tags_are_removed":0.003,"Tests\\Unit\\MarkdownXSSSecurityTest::test_event_handlers_are_removed":0,"Tests\\Unit\\MarkdownXSSSecurityTest::test_javascript_urls_are_removed":0,"Tests\\Unit\\MarkdownXSSSecurityTest::test_dangerous_html_tags_are_removed":0,"Tests\\Unit\\MarkdownXSSSecurityTest::test_safe_markdown_is_preserved":0,"Tests\\Unit\\MarkdownXSSSecurityTest::test_empty_input_is_handled_safely":0,"Tests\\Unit\\MarkdownXSSSecurityTest::test_sanitize_html_function_prevents_xss":0,"Tests\\Unit\\MarkdownXSSSecurityTest::test_sanitize_html_handles_license_content":0,"Tests\\Feature\\RouteStructureTest::test_new_project_route_structure_is_registered":0.003,"Tests\\Feature\\RouteStructureTest::test_new_sample_route_structure_is_registered":0,"Tests\\Feature\\RouteStructureTest::test_new_compound_route_structure_is_registered":0,"Tests\\Feature\\RouteStructureTest::test_project_route_accepts_valid_identifiers":0.001,"Tests\\Feature\\RouteStructureTest::test_sample_route_accepts_valid_identifiers":0,"Tests\\Feature\\RouteStructureTest::test_compound_route_accepts_valid_identifiers":0}} \ No newline at end of file diff --git a/README.md b/README.md index 56486cb62..4d9eb7041 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-blue.svg)](https://GitHub.com/NFDI4Chem/nmrxiv/graphs/commit-activity) [![GitHub issues](https://img.shields.io/github/issues/NFDI4Chem/nmrxiv.svg)](https://GitHub.com/NFDI4Chem/nmrxiv/issues/) [![GitHub contributors](https://img.shields.io/github/contributors/NFDI4Chem/nmrxiv.svg)](https://GitHub.com/NFDI4Chem/nmrxiv/graphs/contributors/) -![Workflow](https://github.com/NFDI4Chem/nmrxiv/actions/workflows/build.yml/badge.svg) +![Workflow](https://github.com/NFDI4Chem/nmrxiv/actions/workflows/prod-build.yml/badge.svg) ![Workflow](https://github.com/NFDI4Chem/nmrxiv/actions/workflows/release-please.yml/badge.svg) [![Powered by Laravel](https://img.shields.io/badge/Powered%20by-Laravel-red.svg?style=flat&logo=Laravel)](https://laravel.com) diff --git a/app/Actions/Author/SyncProjectAuthors.php b/app/Actions/Author/SyncProjectAuthors.php index c24bb0537..23b4c395d 100644 --- a/app/Actions/Author/SyncProjectAuthors.php +++ b/app/Actions/Author/SyncProjectAuthors.php @@ -7,6 +7,7 @@ use App\Models\Project; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\ValidationException; class SyncProjectAuthors { @@ -18,7 +19,7 @@ public function __construct(private UpdateProject $updater) {} * @param array> $authors * @return array * - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function handle(Project $project, array $authors): array { @@ -64,6 +65,7 @@ private function validateAuthorData(array $authorData): void 'email_id' => ['nullable', 'email', 'max:320'], 'orcid_id' => ['nullable', 'string', 'max:19'], 'affiliation' => ['nullable', 'string', 'max:500'], + 'ror_id' => ['nullable', 'string', 'max:255'], 'contributor_type' => ['nullable', 'string', 'max:50'], ])->validate(); } @@ -105,6 +107,7 @@ private function prepareAuthorAttributes(array $authorData, string $familyName, 'orcid_id' => $authorData['orcid_id'] ?? null, 'email_id' => $authorData['email_id'] ?? null, 'affiliation' => $authorData['affiliation'] ?? null, + 'ror_id' => $authorData['ror_id'] ?? null, ]; } } diff --git a/app/Actions/Citation/SyncCitations.php b/app/Actions/Citation/SyncCitations.php index c846d96fc..cedb45dd6 100644 --- a/app/Actions/Citation/SyncCitations.php +++ b/app/Actions/Citation/SyncCitations.php @@ -8,6 +8,7 @@ use App\Models\User; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\ValidationException; class SyncCitations { @@ -19,7 +20,7 @@ public function __construct(private UpdateProject $updater) {} * @param array> $citations * @return array * - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function sync(Project $project, array $citations, User $user): array { @@ -35,12 +36,9 @@ public function sync(Project $project, array $citations, User $user): array foreach ($citations as $citationData) { $this->validateCitationData($citationData); - $doi = $citationData['doi']; - - if (! is_null($doi)) { - $citation = $this->findOrCreateCitation($project, $citationData, $doi); - $processedCitations[] = $citation; - } + $citation = $this->findOrCreateCitation($project, $citationData); + $this->rememberCitation($project, $citation); + $processedCitations[] = $citation; } DB::transaction(function () use ($project, $processedCitations, $user): void { @@ -55,13 +53,13 @@ public function sync(Project $project, array $citations, User $user): array * * @param array $citationData * - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ private function validateCitationData(array $citationData): void { Validator::make($citationData, [ 'title' => ['required', 'string'], - 'doi' => ['required', 'string'], + 'doi' => ['nullable', 'string'], 'authors' => ['required', 'string'], 'citation_text' => ['nullable', 'string'], ])->validate(); @@ -72,11 +70,31 @@ private function validateCitationData(array $citationData): void * * @param array $citationData */ - private function findOrCreateCitation(Project $project, array $citationData, string $doi): Citation + private function findOrCreateCitation(Project $project, array $citationData): Citation { - $existingCitation = $project->citations->filter(function ($citation) use ($doi) { - return $doi === $citation->doi; - })->first(); + $doi = $this->normalizeDoi($citationData['doi'] ?? null); + $title = $this->normalizeText($citationData['title'] ?? null); + $authors = $this->normalizeText($citationData['authors'] ?? null); + + $existingCitation = null; + + // 1. Try to match by ID first (explicit reference) + if (! empty($citationData['id'])) { + $existingCitation = $project->citations->firstWhere('id', (int) $citationData['id']); + } + + // 2. Try to match by DOI (if not null/empty) + if (! $existingCitation && ! is_null($doi)) { + $existingCitation = $project->citations->firstWhere('doi', $doi); + } + + // 3. Try to match by title + authors (content-based matching for missing DOI) + if (! $existingCitation && ! is_null($title) && ! is_null($authors)) { + $existingCitation = $project->citations->first(function ($citation) use ($title, $authors): bool { + return $this->normalizeText($citation->title) === $title + && $this->normalizeText($citation->authors) === $authors; + }); + } if ($existingCitation) { $existingCitation->update($this->prepareCitationAttributes($citationData)); @@ -96,10 +114,49 @@ private function findOrCreateCitation(Project $project, array $citationData, str private function prepareCitationAttributes(array $citationData): array { return [ - 'doi' => $citationData['doi'] ?? null, - 'title' => $citationData['title'] ?? null, - 'authors' => $citationData['authors'] ?? null, - 'citation_text' => $citationData['citation_text'] ?? null, + 'doi' => $this->normalizeDoi($citationData['doi'] ?? null), + 'title' => $this->normalizeText($citationData['title'] ?? null), + 'authors' => $this->normalizeText($citationData['authors'] ?? null), + 'citation_text' => $this->normalizeText($citationData['citation_text'] ?? null), ]; } + + private function rememberCitation(Project $project, Citation $citation): void + { + $citations = $project->citations; + + if (! $citations->contains('id', $citation->id)) { + $project->setRelation('citations', $citations->push($citation)); + } + } + + private function normalizeDoi(mixed $doi): ?string + { + if (! is_string($doi)) { + return null; + } + + $normalizedDoi = trim($doi); + + if ($normalizedDoi === '') { + return null; + } + + return $normalizedDoi; + } + + private function normalizeText(mixed $value): ?string + { + if (! is_string($value)) { + return null; + } + + $normalizedValue = trim($value); + + if ($normalizedValue === '') { + return null; + } + + return $normalizedValue; + } } diff --git a/app/Actions/Draft/CreateDraft.php b/app/Actions/Draft/CreateDraft.php index c026b0aaa..69ed1629e 100644 --- a/app/Actions/Draft/CreateDraft.php +++ b/app/Actions/Draft/CreateDraft.php @@ -16,7 +16,7 @@ public function execute(User $user, array $options = []): Draft [$user_id, $team_id] = $user->getUserTeamData(); $id = Str::uuid(); - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $path = $this->generateDraftPath($environment, $user_id, $id); $name = $this->generateDraftName($id, $options); diff --git a/app/Actions/Draft/UserDrafts.php b/app/Actions/Draft/UserDrafts.php index c3f7246da..6bbc5ddb4 100644 --- a/app/Actions/Draft/UserDrafts.php +++ b/app/Actions/Draft/UserDrafts.php @@ -28,7 +28,7 @@ public function execute(User $user): Collection } /** - * Find existing default draft without files. + * Find existing default draft without files for the user's current team. */ public function findDefaultDraft(User $user): ?Draft { @@ -36,6 +36,7 @@ public function findDefaultDraft(User $user): ?Draft return Draft::doesntHave('files') ->where('owner_id', $user_id) + ->where('team_id', $team_id) ->first(); } diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php index 39ed30dea..683d5755d 100644 --- a/app/Actions/Fortify/CreateNewUser.php +++ b/app/Actions/Fortify/CreateNewUser.php @@ -17,7 +17,7 @@ class CreateNewUser implements CreatesNewUsers /** * Create a newly registered user. * - * @return \App\Models\User + * @return User */ public function create(array $input) { @@ -39,6 +39,7 @@ public function create(array $input) 'username' => $input['username'], 'orcid_id' => $input['orcid_id'], 'affiliation' => $input['affiliation'], + 'ror_id' => $input['ror_id'] ?? null, 'password' => Hash::make($input['password']), ]), function (User $user) { diff --git a/app/Actions/Fortify/UpdateUserProfileInformation.php b/app/Actions/Fortify/UpdateUserProfileInformation.php index a057a9ec2..c3fa7a35b 100644 --- a/app/Actions/Fortify/UpdateUserProfileInformation.php +++ b/app/Actions/Fortify/UpdateUserProfileInformation.php @@ -25,7 +25,8 @@ public function update($user, array $input) 'username' => ['required', 'string', 'max:255', Rule::unique('users')->ignore($user->id)], 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], 'orcid_id' => ['nullable', 'string', 'max:255'], - 'affiliation' => ['nullable', 'string', 'max:255'], + 'affiliation' => ['nullable', 'string'], + 'ror_id' => ['nullable', 'string', 'max:255'], ])->validateWithBag('updateProfileInformation'); if (isset($input['photo'])) { @@ -44,6 +45,7 @@ public function update($user, array $input) 'email' => $input['email'], 'orcid_id' => $input['orcid_id'], 'affiliation' => $input['affiliation'] ? $input['affiliation'] : null, + 'ror_id' => $input['ror_id'] ?? null, ])->save(); } } @@ -64,6 +66,7 @@ protected function updateVerifiedUser($user, array $input) 'email' => $input['email'], 'orcid_id' => $input['orcid_id'], 'affiliation' => $input['affiliation'], + 'ror_id' => $input['ror_id'] ?? null, ])->save(); $user->sendEmailVerificationNotification(); diff --git a/app/Actions/Jetstream/AddTeamMember.php b/app/Actions/Jetstream/AddTeamMember.php index 2e3b8a6f4..9221bbf61 100644 --- a/app/Actions/Jetstream/AddTeamMember.php +++ b/app/Actions/Jetstream/AddTeamMember.php @@ -48,7 +48,7 @@ protected function validate($team, string $email, ?string $role) 'email' => $email, 'role' => $role, ], $this->rules(), [ - 'email.exists' => __('We were unable to find a registered user with this email address.'), + 'email.exists' => __('Unable to add member with this email address.'), ])->after( $this->ensureUserIsNotAlreadyOnTeam($team, $email) )->validateWithBag('addTeamMember'); @@ -81,7 +81,7 @@ protected function ensureUserIsNotAlreadyOnTeam($team, string $email) $validator->errors()->addIf( $team->hasUserWithEmail($email), 'email', - __('This user already belongs to the team.') + __('Unable to add member with this email address.') ); }; } diff --git a/app/Actions/Jetstream/DeleteUser.php b/app/Actions/Jetstream/DeleteUser.php index 377be6e3f..99b3054ac 100644 --- a/app/Actions/Jetstream/DeleteUser.php +++ b/app/Actions/Jetstream/DeleteUser.php @@ -11,7 +11,7 @@ class DeleteUser implements DeletesUsers /** * The team deleter implementation. * - * @var \Laravel\Jetstream\Contracts\DeletesTeams + * @var DeletesTeams */ protected $deletesTeams; diff --git a/app/Actions/Project/ArchiveProject.php b/app/Actions/Project/ArchiveProject.php index c08b6f5d3..d0a4d1177 100644 --- a/app/Actions/Project/ArchiveProject.php +++ b/app/Actions/Project/ArchiveProject.php @@ -12,14 +12,24 @@ class ArchiveProject * @param mixed $project * @return void */ - public function toggle($project) + public function toggleArchive($project) { $archiveState = ! $project->is_archived; - $project->studies()->update(['is_archived' => $archiveState]); + $project->studies()->update([ + 'is_archived' => $archiveState, + 'status' => $archiveState ? 'archived' : 'published', + ]); + foreach ($project->studies as $study) { - $study->datasets()->update(['is_archived' => $archiveState]); + $study->datasets()->update([ + 'is_archived' => $archiveState, + 'status' => $archiveState ? 'archived' : 'published', + ]); } + $project->is_archived = $archiveState; + $project->status = $archiveState ? 'archived' : 'published'; + if ($project->is_archived) { $project->sendNotification('archival', $this->prepareSendList($project)); } diff --git a/app/Actions/Project/CreateNewProject.php b/app/Actions/Project/CreateNewProject.php index 8de33cca1..6d3e24aad 100644 --- a/app/Actions/Project/CreateNewProject.php +++ b/app/Actions/Project/CreateNewProject.php @@ -15,11 +15,11 @@ class CreateNewProject /** * Create a project. * - * @return \App\Models\Project + * @return Project */ public function create(array $input) { - $license = $input['license']; + $license = $input['license'] ?? null; $errorMessages = [ 'license.required_if' => 'The license field is required when the project is made public.', ]; diff --git a/app/Actions/Project/DeleteProject.php b/app/Actions/Project/DeleteProject.php index ba0272734..1a5075e53 100644 --- a/app/Actions/Project/DeleteProject.php +++ b/app/Actions/Project/DeleteProject.php @@ -6,6 +6,7 @@ use App\Models\Project; use App\Models\User; use Illuminate\Support\Carbon; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Throwable; @@ -30,8 +31,8 @@ public function delete($project) } else { $project->studies()->update(['is_deleted' => true]); foreach ($project->studies as $study) { - $study->update(['is_deleted' => true]); - $study->datasets()->update(['is_deleted' => true]); + $study->update(['is_deleted' => true, 'status' => 'deleted']); + $study->datasets()->update(['is_deleted' => true, 'status' => 'deleted']); } $draft = $project->draft; if ($draft) { @@ -40,6 +41,7 @@ public function delete($project) $project->name = $project->name; $project->deleted_on = Carbon::now(); $project->is_deleted = true; + $project->status = 'deleted'; $project->sendNotification('deletion', $this->prepareSendList($project)); } $project->save(); @@ -106,7 +108,7 @@ public function deleteStudy($study) /** * Delete dataset and related objects. * - * @param \Illuminate\Support\Collection $datasets + * @param Collection $datasets * @return void */ public function deleteDatasets($dataset) @@ -204,9 +206,9 @@ public function deleteFSO(FileSystemObject $filesystemobject) $fsoIds = $this->getChildrenIds($filesystemobject, []); if (Storage::has($filesystemobject->path)) { if ($filesystemobject->type == 'directory') { - Storage::disk(env('FILESYSTEM_DRIVER'))->deleteDirectory($filesystemobject->path); + Storage::disk(config('filesystems.default'))->deleteDirectory($filesystemobject->path); } else { - Storage::disk(env('FILESYSTEM_DRIVER'))->delete($filesystemobject->path); + Storage::disk(config('filesystems.default'))->delete($filesystemobject->path); } FileSystemObject::whereIn('id', $fsoIds)->delete(); } diff --git a/app/Actions/Project/RestoreProject.php b/app/Actions/Project/RestoreProject.php index e6d0564ad..1f119d9cf 100644 --- a/app/Actions/Project/RestoreProject.php +++ b/app/Actions/Project/RestoreProject.php @@ -27,8 +27,10 @@ public function restore($project) $study->datasets()->update(['is_deleted' => false]); } $draft = $project->draft; - $draft->is_deleted = false; - $draft->save(); + if ($draft) { + $draft->is_deleted = false; + $draft->save(); + } $project->is_deleted = false; $project->save(); } diff --git a/app/Actions/Project/UpdateProject.php b/app/Actions/Project/UpdateProject.php index aa9433412..73368b885 100644 --- a/app/Actions/Project/UpdateProject.php +++ b/app/Actions/Project/UpdateProject.php @@ -3,6 +3,7 @@ namespace App\Actions\Project; use App\Models\Project; +use App\Models\User; use App\Models\Validation; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; @@ -15,17 +16,19 @@ class UpdateProject /** * Create a project. * - * @return \App\Models\Project + * @return Project */ public function update(Project $project, array $input) { $errorMessages = [ 'license.required_if' => 'The license field is required when the project is made public.', + 'photo.mimes' => 'The project image must be a file of type: jpg, jpeg, png, gif, webp.', ]; Validator::make($input, [ 'name' => ['required', 'string', 'max:255', Rule::unique('projects') ->where('owner_id', $project->owner_id)->ignore($project->id), ], 'license' => ['required_if:is_public,"true"'], + 'photo' => ['nullable', 'mimes:jpg,jpeg,png,gif,webp', 'max:2048'], ], $errorMessages)->validate(); return DB::transaction(function () use ($input, $project) { @@ -34,7 +37,7 @@ public function update(Project $project, array $input) if (array_key_exists('photo', $input)) { $image = $input['photo']; if (! is_null($image)) { - $s3 = Storage::disk(env('FILESYSTEM_DRIVER_PUBLIC')); + $s3 = Storage::disk(config('filesystems.default_public')); $file_name = uniqid().'.'.$image->getClientOriginalExtension(); $s3filePath = '/projects/'.$file_name; $s3->put($s3filePath, file_get_contents($image), 'public'); @@ -188,7 +191,7 @@ public function updateContributorType(Project $project, $author_id, $role) /** * Attach citations to a project. * - * @param \App\Models\User $user + * @param User $user * @param array $citations * @return void */ diff --git a/app/Actions/Study/AddStudyMember.php b/app/Actions/Study/AddStudyMember.php index dfedef564..2a5fe13b0 100644 --- a/app/Actions/Study/AddStudyMember.php +++ b/app/Actions/Study/AddStudyMember.php @@ -47,7 +47,7 @@ protected function validate($study, string $email, ?string $role) 'email' => $email, 'role' => $role, ], $this->rules(), [ - 'email.exists' => __('We were unable to find a registered user with this email address.'), + 'email.exists' => __('Unable to add member with this email address.'), ])->after( $this->ensureUserIsNotAlreadyOnStudy($study, $email) )->validateWithBag('addStudyMember'); @@ -80,7 +80,7 @@ protected function ensureUserIsNotAlreadyOnStudy($study, string $email) $validator->errors()->addIf( $study->hasUserWithEmail($email), 'email', - __('This user already belongs to the study.') + __('Unable to add member with this email address.') ); }; } diff --git a/app/Actions/Study/CreateNewStudy.php b/app/Actions/Study/CreateNewStudy.php index 2ad507e89..7ffd828ec 100644 --- a/app/Actions/Study/CreateNewStudy.php +++ b/app/Actions/Study/CreateNewStudy.php @@ -14,7 +14,7 @@ class CreateNewStudy /** * Create a study. * - * @return \App\Models\Study + * @return Study */ public function create(array $input) { diff --git a/app/Actions/Study/UpdateStudy.php b/app/Actions/Study/UpdateStudy.php index 5fc4ff16c..3aa600b5d 100644 --- a/app/Actions/Study/UpdateStudy.php +++ b/app/Actions/Study/UpdateStudy.php @@ -4,6 +4,7 @@ use App\Models\Study; use App\Models\Ticker; +use Carbon\Carbon; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; @@ -13,7 +14,7 @@ class UpdateStudy /** * Create a study. * - * @return \App\Models\Study + * @return Study */ public function update(Study $study, array $input) { @@ -29,7 +30,7 @@ public function update(Study $study, array $input) $study->forceFill([ 'name' => $input['name'], 'slug' => Str::slug($input['name'], '-'), - 'description' => $input['description'] ? $input['description'] : $study->description, + 'description' => array_key_exists('description', $input) ? $input['description'] : $study->description, 'color' => array_key_exists('color', $input) ? $input['color'] : $study->color, 'starred' => array_key_exists('starred', $input) ? $input['starred'] : $study->starred, 'location' => array_key_exists('location', $input) ? $input['location'] : $study->location, @@ -56,30 +57,32 @@ public function update(Study $study, array $input) $release_date = Carbon::now()->timestamp; $sample = $study->sample; - $sampleIdentifier = $sample->identifier ? $sample->identifier : null; + if ($sample) { + $sampleIdentifier = $sample->identifier ? $sample->identifier : null; - if ($sampleIdentifier == null) { - $sampleTicker = Ticker::whereType('sample')->first(); - $sampleIdentifier = $sampleTicker->index + 1; - $sample->identifier = $sampleIdentifier; - $sample->save(); + if ($sampleIdentifier == null) { + $sampleTicker = Ticker::whereType('sample')->first(); + $sampleIdentifier = $sampleTicker->index + 1; + $sample->identifier = $sampleIdentifier; + $sample->save(); - $sampleTicker->index = $sampleIdentifier; - $sampleTicker->save(); - } + $sampleTicker->index = $sampleIdentifier; + $sampleTicker->save(); + } - $molecules = $sample->molecules; + $molecules = $sample->molecules; - foreach ($molecules as $molecule) { - $moleculeIdentifier = $molecule->identifier ? $molecule->identifier : null; - if ($moleculeIdentifier == null) { - $moleculeTicker = Ticker::whereType('molecule')->first(); - $moleculeIdentifier = $moleculeTicker->index + 1; - $molecule->identifier = $moleculeIdentifier; - $molecule->save(); + foreach ($molecules as $molecule) { + $moleculeIdentifier = $molecule->identifier ? $molecule->identifier : null; + if ($moleculeIdentifier == null) { + $moleculeTicker = Ticker::whereType('molecule')->first(); + $moleculeIdentifier = $moleculeTicker->index + 1; + $molecule->identifier = $moleculeIdentifier; + $molecule->save(); - $moleculeTicker->index = $moleculeIdentifier; - $moleculeTicker->save(); + $moleculeTicker->index = $moleculeIdentifier; + $moleculeTicker->save(); + } } } } diff --git a/app/Console/Commands/ExtractSpectra.php b/app/Console/Commands/ExtractSpectra.php deleted file mode 100644 index caf108f9f..000000000 --- a/app/Console/Commands/ExtractSpectra.php +++ /dev/null @@ -1,182 +0,0 @@ -get(); - - foreach ($projects as $project) { - echo "\r\n"; - echo $project->identifier; - echo "\r\n"; - $studies = $project->studies; - foreach ($studies as $study) { - echo $study->identifier; - echo "\r\n"; - try { - if (! $study->has_nmrium) { - DB::transaction(function () use ($study) { - $download_url = $study->download_url; - if ($download_url) { - $nmrium_ = $this->processSpectra($download_url); - $parsedSpectra = $nmrium_['data']; - foreach ($parsedSpectra['spectra'] as $spectra) { - unset($spectra['data']); - unset($spectra['meta']); - unset($spectra['originalData']); - unset($spectra['originalInfo']); - } - - $version = $parsedSpectra['version']; - unset($parsedSpectra['version']); - - $nmriumJSON = [ - 'data' => $parsedSpectra, - 'version' => $version, - ]; - - $nmrium = $study->nmrium; - - if ($nmrium) { - $nmrium->nmrium_info = json_encode($nmriumJSON, JSON_UNESCAPED_UNICODE); - $nmrium->save(); - } else { - $nmrium = NMRium::create([ - 'nmrium_info' => json_encode($nmriumJSON, JSON_UNESCAPED_UNICODE), - ]); - $study->nmrium()->save($nmrium); - $study->has_nmrium = true; - $study->save(); - } - } - }); - } - $study = $study->fresh(); - if ($study->has_nmrium) { - $nmriumInfo = $study->nmrium->nmrium_info; - if (count($nmriumInfo['data']['spectra']) == 0) { - echo '--MISSING SPECTRA INFO (NMRIUM JSON)--'; - echo "\r\n"; - } else { - foreach ($study->datasets as $dataset) { - echo $dataset->identifier; - echo "\r\n"; - // echo $dataset->type; - // echo "\r\n"; - if (! $dataset->has_nmrium) { - $nmriumInfo = $study->nmrium->nmrium_info; - $_nmriumJSON = $nmriumInfo; - $fsObject = $dataset->fsObject; - - $studyFSObject = $study->fsObject; - $datasetFSObject = $dataset->fsObject; - - $draft = $study->draft; - - if ($draft && $draft->eln == 'chemotion') { - $path = '/'.$studyFSObject->name.'/'.$datasetFSObject->parent->name.'/'.$datasetFSObject->name; - } else { - $path = '/'.$studyFSObject->name.'/'.$datasetFSObject->name; - } - - $fType = $studyFSObject->type; - - $pathsMatch = false; - $spectrum = []; - $type = []; - foreach ($nmriumInfo['data']['spectra'] as $spectra) { - unset($_nmriumJSON['data']['spectra']); - $files = $spectra['sourceSelector']['files']; - if ($files) { - foreach ($files as $file) { - if (str_contains($file, $fType == 'file' ? $path : $path.'/')) { - $pathsMatch = true; - } - } - } - if ($pathsMatch) { - array_push($spectrum, $spectra); - $experimentDetailsExists = array_key_exists('experiment', $spectra['info']); - if ($experimentDetailsExists) { - $experiment = $spectra['info']['experiment']; - $nucleus = $spectra['info']['nucleus']; - if (is_array($nucleus)) { - $nucleus = implode('-', $nucleus); - } - array_push($type, $experiment.' - '.$nucleus); - } - $pathsMatch = false; - } - } - if (count($spectrum) > 0) { - $_nmriumJSON['data']['spectra'] = $spectrum; - $_nmrium = $dataset->nmrium; - if ($_nmrium) { - $_nmrium->nmrium_info = json_encode($_nmriumJSON, JSON_UNESCAPED_UNICODE); - $dataset->has_nmrium = true; - $_nmrium->save(); - } else { - $_nmrium = NMRium::create([ - 'nmrium_info' => json_encode($_nmriumJSON, JSON_UNESCAPED_UNICODE), - ]); - $dataset->nmrium()->save($_nmrium); - $dataset->has_nmrium = true; - } - } - $uType = array_unique($type); - if (count($uType) == 1) { - $dataset->type = $uType[0]; - } - $dataset->save(); - } - } - } - } - } catch (Exception $e) { - echo 'Caught exception: ', $e->getMessage(), "\n"; - } - - } - } - } - - public function processSpectra($url) - { - $url = urlencode($url); - $response = Http::timeout(300)->post('https://nodejs.nmrxiv.org/spectra-parser', [ - 'urls' => [$url], - 'snapshot' => false, - ]); - - return $response->json(); - } -} diff --git a/app/Console/Commands/ManageFiles.php b/app/Console/Commands/ManageFiles.php index 7ae4d64d5..384b984da 100644 --- a/app/Console/Commands/ManageFiles.php +++ b/app/Console/Commands/ManageFiles.php @@ -7,6 +7,8 @@ use Illuminate\Console\Command; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; +use League\Flysystem\DirectoryAttributes; +use League\Flysystem\FileAttributes; class ManageFiles extends Command { @@ -43,10 +45,10 @@ public function handle(): void public function processFiles($path) { - $listing = Storage::disk(env('FILESYSTEM_DRIVER'))->listContents($path, true); + $listing = Storage::disk(config('filesystems.default'))->listContents($path, true); foreach ($listing as $item) { $path = $item->path(); - if ($item instanceof \League\Flysystem\FileAttributes) { + if ($item instanceof FileAttributes) { $fsObject = FileSystemObject::where([ ['path', '/'.$path], ])->first(); @@ -57,7 +59,7 @@ public function processFiles($path) $fsObject->info = $fsInfo; $fsObject->save(); } - } elseif ($item instanceof \League\Flysystem\DirectoryAttributes) { + } elseif ($item instanceof DirectoryAttributes) { // echo $item->study_id; } } diff --git a/app/Console/Commands/PublishReleasedProjects.php b/app/Console/Commands/PublishReleasedProjects.php index a91c06027..a69b3092f 100644 --- a/app/Console/Commands/PublishReleasedProjects.php +++ b/app/Console/Commands/PublishReleasedProjects.php @@ -32,21 +32,28 @@ class PublishReleasedProjects extends Command public function handle(PublishProject $publisher): int { return DB::transaction(function () use ($publisher) { + $publishedCount = 0; $projects = Project::where([ ['is_public', false], ['release_date', 'IS NOT', null], ])->get(); + foreach ($projects as $project) { $release_date = Carbon::parse($project->release_date); if ($release_date->isPast()) { if (! is_null($project->doi) && ! $project->is_archived) { - // echo($project->identifier); - // echo("\r\n"); + echo $project->identifier; + echo "\r\n"; $publisher->publish($project); Notification::send($project->owner, new DraftProcessedNotification($project)); + $publishedCount++; } } } + + $this->info("Published {$publishedCount} projects."); + + return Command::SUCCESS; }); } } diff --git a/app/Console/Commands/QueueMetadataExtractionBagitGenerationJobs.php b/app/Console/Commands/QueueMetadataExtractionBagitGenerationJobs.php new file mode 100644 index 000000000..78dc66b62 --- /dev/null +++ b/app/Console/Commands/QueueMetadataExtractionBagitGenerationJobs.php @@ -0,0 +1,126 @@ +option('fresh')) { + if ($this->confirm('This will reset all BagIt status for all studies. Continue?', false)) { + Study::query()->update([ + 'metadata_bagit_generation_status' => null, + 'metadata_bagit_generation_logs' => null, + ]); + $this->info('✓ Cleared all existing BagIt status data'); + } else { + return self::SUCCESS; + } + } + + $query = Study::query() + ->where('has_nmrium', true) + ->where('is_public', true) + ->whereNotNull('download_url'); + + // Filter by specific study IDs if provided + if ($ids = $this->option('ids')) { + $studyIds = array_map('trim', explode(',', $ids)); + $query->whereIn('id', $studyIds); + $this->info('Processing '.count($studyIds).' specific study IDs...'); + } + + if ($this->option('retry-failed')) { + // Get failed study IDs from database + $failedStudies = Study::where('metadata_bagit_generation_status', 'failed')->get(); + + if ($failedStudies->isEmpty()) { + $this->warn('No failed jobs to retry.'); + + return self::SUCCESS; + } + + $query->whereIn('id', $failedStudies->pluck('id')); + $this->info('Retrying '.$failedStudies->count().' failed jobs...'); + + // Reset status to pending + Study::where('metadata_bagit_generation_status', 'failed') + ->whereIn('id', $failedStudies->pluck('id')) + ->update(['metadata_bagit_generation_status' => 'pending']); + } elseif (! $this->option('ids')) { + // Only exclude already processed studies when not targeting specific IDs + $query->where(function ($q) { + $q->whereNull('metadata_bagit_generation_status') + ->orWhereIn('metadata_bagit_generation_status', ['failed']); + }); + } + + if ($limit = $this->option('limit')) { + $query->limit((int) $limit); + } + + $studies = $query->get(); + + if ($studies->isEmpty()) { + $this->warn('No eligible studies found to process.'); + + return self::SUCCESS; + } + + $this->info("Found {$studies->count()} studies to process"); + + $bar = $this->output->createProgressBar($studies->count()); + $bar->setFormat('verbose'); + + $jobsDispatched = 0; + + foreach ($studies as $study) { + // Mark as pending with queued timestamp + $study->update([ + 'metadata_bagit_generation_status' => 'pending', + 'metadata_bagit_generation_logs' => [ + 'queued_at' => now()->toIso8601String(), + 'study_identifier' => str_replace('NMRXIV:', '', $study->identifier), + ], + ]); + + // Dispatch job to queue + ProcessMetadataExtractionBagitGenerationJob::dispatch($study->id); + + $jobsDispatched++; + $bar->advance(); + } + + $bar->finish(); + $this->newLine(2); + + $this->info("✓ Successfully dispatched {$jobsDispatched} jobs to the queue"); + + return self::SUCCESS; + } +} diff --git a/app/Console/Commands/SanitizeMolecules.php b/app/Console/Commands/SanitizeMolecules.php index ad6313f94..485ac8fa6 100644 --- a/app/Console/Commands/SanitizeMolecules.php +++ b/app/Console/Commands/SanitizeMolecules.php @@ -3,8 +3,13 @@ namespace App\Console\Commands; use App\Models\Molecule; +use App\Services\CAS\CASService; use Illuminate\Console\Command; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\Client\RequestException; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Log; class SanitizeMolecules extends Command { @@ -13,118 +18,383 @@ class SanitizeMolecules extends Command * * @var string */ - protected $signature = 'nmrxiv:molecules-clean'; + protected $signature = 'nmrxiv:molecules-clean + {--limit= : Limit the number of molecules to process} + {--force : Skip confirmation prompt}'; /** * The console command description. * * @var string */ - protected $description = 'Sanitize molecules'; + protected $description = 'Sanitize and enrich molecule data with PubChem properties, CAS numbers, and standardized structures'; + + /** + * Statistics for tracking progress + */ + private int $processedCount = 0; + + private int $updatedCount = 0; + + private int $errorCount = 0; + + /** + * API rate limiting delay in microseconds (500ms) + */ + private const API_DELAY_MICROSECONDS = 500000; + + public function __construct( + private CASService $casService + ) { + parent::__construct(); + } /** * Execute the console command. */ - public function handle(): void + public function handle(): int { - $molecules = Molecule::all(); - - foreach ($molecules as $molecule) { - echo $molecule->id; - echo "\r\n"; - $inchi = $molecule->standard_inchi; - if ($inchi) { - $data = $this->fetchPubChemIUPACProperties($inchi); - $molecule->synonyms = $data['synonyms']; - $molecule->iupac_name = (array_key_exists('IUPACName', $data['properties']) ? $data['properties']['IUPACName'] : $molecule->iupac_name); - $molecule->molecular_formula = (array_key_exists('MolecularFormula', $data['properties']) ? $data['properties']['MolecularFormula'] : $molecule->molecular_formula); - $molecule->molecular_weight = (array_key_exists('MolecularWeight', $data['properties']) ? $data['properties']['MolecularWeight'] : $molecule->molecular_weight); - $molecule->Save(); - } - if (! $molecule->canonical_smiles) { - echo $molecule->id; - echo "\r\n"; - $molecule->sdf = ' - '.$molecule->sdf; - $standardisedMOL = $this->standardizeMolecule($molecule->sdf); - $molecule->canonical_smiles = array_key_exists('canonical_smiles', $standardisedMOL) ? $standardisedMOL['canonical_smiles'] : null; - $molecule->standard_inchi = array_key_exists('inchi', $standardisedMOL) ? $standardisedMOL['inchi'] : null; - $molecule->inchi_key = array_key_exists('canonicalinchikey_smiles', $standardisedMOL) ? $standardisedMOL['inchikey'] : null; - $molecule->save(); + $totalMolecules = $this->option('limit') + ? min((int) $this->option('limit'), Molecule::count()) + : Molecule::count(); + + $this->info("Processing {$totalMolecules} molecules..."); + + if ($totalMolecules === 0) { + $this->info('No molecules found to process.'); + + return self::SUCCESS; + } + + if (! $this->option('force') && ! $this->confirm('Do you want to continue?', true)) { + $this->info('Operation cancelled.'); + + return self::SUCCESS; + } + + $progressBar = $this->output->createProgressBar($totalMolecules); + $progressBar->start(); + + $query = Molecule::query(); + + if ($this->option('limit')) { + $query->limit((int) $this->option('limit')); + } + + $query->chunk(100, function ($molecules) use ($progressBar) { + foreach ($molecules as $molecule) { + $this->processMolecule($molecule); + $progressBar->advance(); } - if ($molecule->canonical_smiles) { - $cas = $this->fetchCAS($molecule->canonical_smiles); - $molecule->cas = $cas; + }); + + $progressBar->finish(); + $this->newLine(2); + $this->displayStatistics(); + + return self::SUCCESS; + } + + /** + * Process a single molecule + */ + protected function processMolecule(Molecule $molecule): void + { + try { + DB::beginTransaction(); + + $updated = false; + + // Fetch PubChem properties if standard InChI is available + if ($molecule->standard_inchi) { + $updated = $this->enrichWithPubChemData($molecule) || $updated; + } + + // Standardize molecule structure if canonical SMILES is missing + if (! $molecule->canonical_smiles && $molecule->sdf) { + $updated = $this->standardizeMoleculeStructure($molecule) || $updated; + } + + // Fetch CAS number if canonical SMILES is available + if ($molecule->canonical_smiles && ! $molecule->cas) { + $updated = $this->enrichWithCASNumber($molecule) || $updated; + } + + // Only save if something was updated + if ($updated) { $molecule->save(); + $this->updatedCount++; } + + $this->processedCount++; + + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + $this->errorCount++; + + Log::error('Failed to process molecule', [ + 'molecule_id' => $molecule->id, + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + ]); + + $this->warn("Failed to process molecule ID {$molecule->id}: ".$e->getMessage()); } + + // Rate limiting delay + usleep(self::API_DELAY_MICROSECONDS); } - protected function fetchPubChemIUPACProperties($inchi) + /** + * Enrich molecule with PubChem data + */ + protected function enrichWithPubChemData(Molecule $molecule): bool { - $pubchemBase = rtrim(config('services.pubchem.base_url'), '/'); - $pubchemPug = trim(config('services.pubchem.pug_rest_path'), '/'); - $cid_response = Http::get($pubchemBase.'/'.$pubchemPug.'/compound/inchi/cids/JSON', [ - 'inchi' => $inchi, - ]); - $cid_data = $cid_response->json(); - $cid = null; - if (array_key_exists('IdentifierList', $cid_data)) { - $cids = $cid_data['IdentifierList']['CID']; - $cid = $cids[0]; - } - $synonyms = ''; - $properties = []; - if ($cid) { - $synonyms_response = Http::get($pubchemBase.'/'.$pubchemPug.'/compound/cid/'.$cid.'/Synonyms/JSON'); - $synonyms_data = $synonyms_response->json(); - if (! array_key_exists('Fault', $synonyms_data)) { - $synonyms = implode(',', $synonyms_data['InformationList']['Information'][0]['Synonym']); + try { + $data = $this->fetchPubChemIUPACProperties($molecule->standard_inchi); + + if (empty($data['synonyms']) && empty($data['properties'])) { + return false; + } + + $updated = false; + + if (! empty($data['synonyms']) && $molecule->synonyms !== $data['synonyms']) { + $molecule->synonyms = $data['synonyms']; + $updated = true; + } + + if (! empty($data['properties']['IUPACName']) && ! $molecule->iupac_name) { + $molecule->iupac_name = $data['properties']['IUPACName']; + $updated = true; + } + + if (! empty($data['properties']['MolecularFormula']) && ! $molecule->molecular_formula) { + $molecule->molecular_formula = $data['properties']['MolecularFormula']; + $updated = true; } - $properties_response = Http::get($pubchemBase.'/'.$pubchemPug.'/compound/cid/'.$cid.'/property/IUPACName,MolecularWeight,MolecularFormula/JSON'); - $properties_data = $properties_response->json(); - if (! array_key_exists('Fault', $properties_data)) { - $properties = $properties_data['PropertyTable']['Properties'][0]; + if (! empty($data['properties']['MolecularWeight']) && ! $molecule->molecular_weight) { + $molecule->molecular_weight = (float) $data['properties']['MolecularWeight']; + $updated = true; } + + return $updated; + } catch (\Exception $e) { + Log::warning('Failed to fetch PubChem data', [ + 'molecule_id' => $molecule->id, + 'inchi' => $molecule->standard_inchi, + 'error' => $e->getMessage(), + ]); + + return false; } + } - return [ - 'synonyms' => $synonyms, - 'properties' => $properties, - ]; + /** + * Standardize molecule structure + */ + protected function standardizeMoleculeStructure(Molecule $molecule): bool + { + try { + $standardisedMOL = $this->standardizeMolecule($molecule->sdf); + + if (empty($standardisedMOL)) { + return false; + } + + $updated = false; + + if (! empty($standardisedMOL['canonical_smiles'])) { + $molecule->canonical_smiles = $standardisedMOL['canonical_smiles']; + $updated = true; + } + + if (! empty($standardisedMOL['inchi'])) { + $molecule->standard_inchi = $standardisedMOL['inchi']; + $updated = true; + } + + if (! empty($standardisedMOL['inchikey'])) { + $molecule->inchi_key = $standardisedMOL['inchikey']; + $updated = true; + } + + return $updated; + } catch (\Exception $e) { + Log::warning('Failed to standardize molecule', [ + 'molecule_id' => $molecule->id, + 'error' => $e->getMessage(), + ]); + + return false; + } } - protected function fetchCAS($smiles) + /** + * Enrich molecule with CAS number + */ + protected function enrichWithCASNumber(Molecule $molecule): bool { try { - $ccBase = rtrim(config('services.common_chemistry.base_url'), '/'); - $ccApi = trim(config('services.common_chemistry.api_path'), '/'); - $response = Http::get($ccBase.'/'.$ccApi.'/search', [ - 'q' => $smiles, + $cas = $this->fetchCAS($molecule->canonical_smiles); + + if ($cas) { + $molecule->cas = $cas; + + return true; + } + + return false; + } catch (\Exception $e) { + Log::warning('Failed to fetch CAS number', [ + 'molecule_id' => $molecule->id, + 'smiles' => $molecule->canonical_smiles, + 'error' => $e->getMessage(), ]); - if (! $response->failed()) { - $data = $response->json(); - if ($data['count'] > 0) { - $cas = $data['results'][0]['rn']; - return $cas; + return false; + } + } + + /** + * Fetch PubChem IUPAC properties + * + * @return array{synonyms: string, properties: array} + */ + protected function fetchPubChemIUPACProperties(string $inchi): array + { + $pubchemBase = rtrim(config('services.pubchem.base_url'), '/'); + $pubchemPug = trim(config('services.pubchem.pug_rest_path'), '/'); + + try { + // Fetch CID from InChI with retry + $cidResponse = Http::retry(3, 1000) + ->timeout(30) + ->get($pubchemBase.'/'.$pubchemPug.'/compound/inchi/cids/JSON', [ + 'inchi' => $inchi, + ]); + + $cidResponse->throw(); + $cidData = $cidResponse->json(); + + if (! isset($cidData['IdentifierList']['CID'][0])) { + return ['synonyms' => '', 'properties' => []]; + } + + $cid = $cidData['IdentifierList']['CID'][0]; + + // Fetch synonyms + $synonyms = ''; + try { + $synonymsResponse = Http::retry(3, 1000) + ->timeout(30) + ->get($pubchemBase.'/'.$pubchemPug.'/compound/cid/'.$cid.'/Synonyms/JSON'); + + $synonymsResponse->throw(); + $synonymsData = $synonymsResponse->json(); + + if (isset($synonymsData['InformationList']['Information'][0]['Synonym'])) { + $synonyms = implode(',', $synonymsData['InformationList']['Information'][0]['Synonym']); } + } catch (RequestException $e) { + Log::debug('Failed to fetch PubChem synonyms', ['cid' => $cid, 'error' => $e->getMessage()]); } - } catch (\Illuminate\Http\Client\ConnectionException $e) { - echo 'timed out: '.$smiles; + + // Fetch properties + $properties = []; + try { + $propertiesResponse = Http::retry(3, 1000) + ->timeout(30) + ->get($pubchemBase.'/'.$pubchemPug.'/compound/cid/'.$cid.'/property/IUPACName,MolecularWeight,MolecularFormula/JSON'); + + $propertiesResponse->throw(); + $propertiesData = $propertiesResponse->json(); + + if (isset($propertiesData['PropertyTable']['Properties'][0])) { + $properties = $propertiesData['PropertyTable']['Properties'][0]; + } + } catch (RequestException $e) { + Log::debug('Failed to fetch PubChem properties', ['cid' => $cid, 'error' => $e->getMessage()]); + } + + return [ + 'synonyms' => $synonyms, + 'properties' => $properties, + ]; + } catch (RequestException $e) { + throw new \RuntimeException("Failed to fetch PubChem data for InChI: {$e->getMessage()}", 0, $e); + } + } + + /** + * Fetch CAS number from SMILES + */ + protected function fetchCAS(string $smiles): ?string + { + if (! config('services.cas.api_token')) { + return null; + } + + try { + return $this->casService->searchCASBySmiles($smiles); + } catch (\Exception $e) { + Log::debug('Failed to fetch CAS', [ + 'smiles' => $smiles, + 'error' => $e->getMessage(), + ]); + + return null; } } - protected function standardizeMolecule($mol) + /** + * Standardize molecule structure + * + * @return array|null + */ + protected function standardizeMolecule(string $mol): ?array { try { $stdUrl = config('services.chemistry_standardize.url'); - $response = Http::post($stdUrl, $mol); + + if (! $stdUrl) { + return null; + } + + $response = Http::retry(3, 1000) + ->timeout(30) + ->post($stdUrl, $mol); + + $response->throw(); return $response->json(); - } catch (\Illuminate\Http\Client\ConnectionException $e) { - echo 'timed out: '.$mol; + } catch (ConnectionException $e) { + Log::warning('Chemistry standardize API connection failed', ['error' => $e->getMessage()]); + + return null; + } catch (RequestException $e) { + Log::warning('Chemistry standardize API request failed', ['error' => $e->getMessage()]); + + return null; } } + + /** + * Display processing statistics + */ + protected function displayStatistics(): void + { + $this->info('Molecule sanitization completed!'); + $this->newLine(); + $this->table( + ['Metric', 'Count'], + [ + ['Processed', $this->processedCount], + ['Updated', $this->updatedCount], + ['Errors', $this->errorCount], + ] + ); + } } diff --git a/app/Console/Commands/SanitizeProjects.php b/app/Console/Commands/SanitizeProjects.php index 1a4370d4e..f07c80068 100644 --- a/app/Console/Commands/SanitizeProjects.php +++ b/app/Console/Commands/SanitizeProjects.php @@ -93,7 +93,7 @@ public function cleanProjects() $user_id = $project->owner->id; $team_id = $project->team_id; $id = Str::uuid(); - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $path = preg_replace( '~//+~', '/', @@ -169,7 +169,7 @@ public function cleanDrafts() $user_id = $project->owner->id; $team_id = $project->team_id; $id = Str::uuid(); - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $path = preg_replace( '~//+~', '/', @@ -362,7 +362,7 @@ public function updateFilesStatus() } if ($fsObject->path && $fsObject->type == 'file') { - $exists = Storage::disk(env('FILESYSTEM_DRIVER'))->exists($fsObject->path); + $exists = Storage::disk(config('filesystems.default'))->exists($fsObject->path); if (! $exists) { $fsObject->status = 'missing'; } else { @@ -382,7 +382,7 @@ public function updateFilePaths() if (! $fsObject->path) { $project = $fsObject->project; if ($project) { - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $path = preg_replace( '~//+~', '/', @@ -431,7 +431,7 @@ public function moveFolder($fsObject, $project, $draft) if ($fsObjectChild->type == 'file') { $newFilePath = '/'.$draft->path.$fsObjectChild->relative_url; if ($fsObjectChild->path && $newFilePath && $fsObjectChild->path != $newFilePath) { - Storage::disk(env('FILESYSTEM_DRIVER'))->move($fsObjectChild->path, $newFilePath); + Storage::disk(config('filesystems.default'))->move($fsObjectChild->path, $newFilePath); $fsObjectChild->path = $newFilePath; $fsObjectChild->draft_id = $draft->id; $fsObjectChild->save(); diff --git a/app/Console/Commands/UnpublishProjects.php b/app/Console/Commands/UnpublishProjects.php index 1a653c5ef..88bce7329 100644 --- a/app/Console/Commands/UnpublishProjects.php +++ b/app/Console/Commands/UnpublishProjects.php @@ -41,7 +41,7 @@ public function handle(UnPublishProject $unpublisher): int $user_id = $project->owner->id; $team_id = $project->team_id; $id = Str::uuid(); - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $path = preg_replace( '~//+~', '/', @@ -102,7 +102,7 @@ public function moveFolder($fsObject, $project, $draft) if ($fsObjectChild->type == 'file') { $newFilePath = '/'.$draft->path.$fsObjectChild->relative_url; if ($fsObjectChild->path && $newFilePath && $fsObjectChild->path != $newFilePath) { - Storage::disk(env('FILESYSTEM_DRIVER'))->move($fsObjectChild->path, $newFilePath); + Storage::disk(config('filesystems.default'))->move($fsObjectChild->path, $newFilePath); $fsObjectChild->path = $newFilePath; $fsObjectChild->draft_id = $draft->id; $fsObjectChild->save(); diff --git a/app/Console/Commands/UpdateDOI.php b/app/Console/Commands/UpdateDOI.php index 806648b43..07242cc61 100644 --- a/app/Console/Commands/UpdateDOI.php +++ b/app/Console/Commands/UpdateDOI.php @@ -27,7 +27,7 @@ class UpdateDOI extends Command /** * The DOI service instance. * - * @var \App\Services\DOI\DOIService + * @var DOIService */ protected $doiService; diff --git a/app/Console/Commands/UpdateProjectStatuses.php b/app/Console/Commands/UpdateProjectStatuses.php new file mode 100644 index 000000000..d00badb7d --- /dev/null +++ b/app/Console/Commands/UpdateProjectStatuses.php @@ -0,0 +1,126 @@ +option('dry-run'); + + if ($isDryRun) { + $this->info('🔍 DRY RUN MODE - No changes will be made'); + } else { + $this->info('🚀 LIVE MODE - Project statuses will be updated'); + } + + $this->newLine(); + + return DB::transaction(function () use ($isDryRun) { + $now = Carbon::now(); + $updatedCount = 0; + + // Get all projects with their current data + $projects = Project::all(); + $this->info("📊 Found {$projects->count()} total projects to analyze"); + + // Track updates by status type + $statusCounts = [ + 'deleted' => 0, + 'archived' => 0, + 'embargo' => 0, + 'published' => 0, + 'draft' => 0, + ]; + + foreach ($projects as $project) { + $newStatus = $this->determineProjectStatus($project, $now); + $oldStatus = $project->status; + + if ($newStatus !== $oldStatus) { + $this->info("📝 Project {$project->id} ({$project->name}): '{$oldStatus}' → '{$newStatus}'"); + + if (! $isDryRun) { + $project->update(['status' => $newStatus]); + } + + $updatedCount++; + $statusCounts[$newStatus]++; + } else { + $this->line("✓ Project {$project->id} already has correct status: '{$newStatus}'"); + } + } + + $this->newLine(); + $this->info('📈 Status Distribution:'); + foreach ($statusCounts as $status => $count) { + if ($count > 0) { + $this->line(" • {$status}: {$count} projects"); + } + } + + $this->newLine(); + if ($isDryRun) { + $this->info("🔍 DRY RUN COMPLETE: {$updatedCount} projects would be updated"); + $this->info('💡 Run without --dry-run to apply changes'); + } else { + $this->info("✅ SUCCESS: Updated {$updatedCount} project statuses"); + } + + return 0; + }); + } + + /** + * Determine the correct status for a project based on its flags + */ + private function determineProjectStatus(Project $project, Carbon $now): string + { + // Priority order based on business logic: + + // 1. If deleted, status is 'deleted' + if ($project->is_deleted) { + return 'deleted'; + } + + // 2. If archived, status is 'archived' + if ($project->is_archived) { + return 'archived'; + } + + // 3. If public, status is 'published' + if ($project->is_public) { + return 'published'; + } + + // 4. If has future release_date, status is 'embargo' + if ($project->release_date && Carbon::parse($project->release_date)->isAfter($now)) { + return 'embargo'; + } + + // 5. Default to 'draft' for everything else + return 'draft'; + } +} diff --git a/app/Events/AddingProjectMember.php b/app/Events/AddingProjectMember.php index 580791b07..67b6214bc 100644 --- a/app/Events/AddingProjectMember.php +++ b/app/Events/AddingProjectMember.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -11,20 +12,29 @@ class AddingProjectMember { use Dispatchable, InteractsWithSockets, SerializesModels; + /** + * The project instance. + */ + public $project; + + /** + * The user instance. + */ + public $user; + /** * Create a new event instance. - * - * @return void */ - public function __construct() + public function __construct($project, $user) { - // + $this->project = $project; + $this->user = $user; } /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/AddingStudyMember.php b/app/Events/AddingStudyMember.php index 52299bbb9..82479f0e1 100644 --- a/app/Events/AddingStudyMember.php +++ b/app/Events/AddingStudyMember.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/DraftCompleted.php b/app/Events/DraftCompleted.php index 9611c0545..ef6f6ca9f 100644 --- a/app/Events/DraftCompleted.php +++ b/app/Events/DraftCompleted.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/DraftProcessed.php b/app/Events/DraftProcessed.php index 8d37cc89d..c7592fe05 100644 --- a/app/Events/DraftProcessed.php +++ b/app/Events/DraftProcessed.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Foundation\Events\Dispatchable; @@ -28,7 +29,7 @@ public function __construct($project, $sendTo) /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/InvitingTeamMember.php b/app/Events/InvitingTeamMember.php index b1962dee9..8ff8dcf95 100644 --- a/app/Events/InvitingTeamMember.php +++ b/app/Events/InvitingTeamMember.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/ProjectArchival.php b/app/Events/ProjectArchival.php index 25805ef89..8c40ce03c 100644 --- a/app/Events/ProjectArchival.php +++ b/app/Events/ProjectArchival.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Foundation\Events\Dispatchable; @@ -26,7 +27,7 @@ public function __construct($project, $sendTo) /** * Get the channels the event should broadcast on. * - * @return array + * @return array */ public function broadcastOn(): array { diff --git a/app/Events/ProjectDeletion.php b/app/Events/ProjectDeletion.php index 2ed4b9010..642079d15 100644 --- a/app/Events/ProjectDeletion.php +++ b/app/Events/ProjectDeletion.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Foundation\Events\Dispatchable; @@ -26,7 +27,7 @@ public function __construct($project, $sendTo) /** * Get the channels the event should broadcast on. * - * @return array + * @return array */ public function broadcastOn(): array { diff --git a/app/Events/ProjectInvite.php b/app/Events/ProjectInvite.php index 1097d3be3..22e8eba70 100644 --- a/app/Events/ProjectInvite.php +++ b/app/Events/ProjectInvite.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Foundation\Events\Dispatchable; @@ -26,7 +27,7 @@ public function __construct($invitedUser, $invitation) /** * Get the channels the event should broadcast on. * - * @return array + * @return array */ public function broadcastOn(): array { diff --git a/app/Events/ProjectMemberAdded.php b/app/Events/ProjectMemberAdded.php index 5958d717c..026318aa0 100644 --- a/app/Events/ProjectMemberAdded.php +++ b/app/Events/ProjectMemberAdded.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -11,20 +12,29 @@ class ProjectMemberAdded { use Dispatchable, InteractsWithSockets, SerializesModels; + /** + * The project instance. + */ + public $project; + + /** + * The user instance. + */ + public $user; + /** * Create a new event instance. - * - * @return void */ - public function __construct() + public function __construct($project, $user) { - // + $this->project = $project; + $this->user = $user; } /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/ProjectMemberRemoved.php b/app/Events/ProjectMemberRemoved.php index 44405cf72..f683af1e9 100644 --- a/app/Events/ProjectMemberRemoved.php +++ b/app/Events/ProjectMemberRemoved.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/ProjectMemberUpdated.php b/app/Events/ProjectMemberUpdated.php index 2fcf4c1d4..1cd4074bf 100644 --- a/app/Events/ProjectMemberUpdated.php +++ b/app/Events/ProjectMemberUpdated.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/StudyInvite.php b/app/Events/StudyInvite.php index 5f386b859..26daa12ad 100644 --- a/app/Events/StudyInvite.php +++ b/app/Events/StudyInvite.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Foundation\Events\Dispatchable; @@ -26,7 +27,7 @@ public function __construct($invitedUser, $invitation) /** * Get the channels the event should broadcast on. * - * @return array + * @return array */ public function broadcastOn(): array { diff --git a/app/Events/StudyMemberAdded.php b/app/Events/StudyMemberAdded.php index 95885ce17..e94b8613b 100644 --- a/app/Events/StudyMemberAdded.php +++ b/app/Events/StudyMemberAdded.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/StudyMemberRemoved.php b/app/Events/StudyMemberRemoved.php index a7630bdf7..a51259bb2 100644 --- a/app/Events/StudyMemberRemoved.php +++ b/app/Events/StudyMemberRemoved.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/StudyMemberUpdated.php b/app/Events/StudyMemberUpdated.php index b7bb1ebe8..e785b2491 100644 --- a/app/Events/StudyMemberUpdated.php +++ b/app/Events/StudyMemberUpdated.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; @@ -24,7 +25,7 @@ public function __construct() /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Events/StudyPublish.php b/app/Events/StudyPublish.php index a751cd325..9078d942d 100644 --- a/app/Events/StudyPublish.php +++ b/app/Events/StudyPublish.php @@ -2,6 +2,7 @@ namespace App\Events; +use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Foundation\Events\Dispatchable; @@ -28,7 +29,7 @@ public function __construct($studies, $sendTo) /** * Get the channels the event should broadcast on. * - * @return \Illuminate\Broadcasting\Channel|array + * @return Channel|array */ public function broadcastOn(): array { diff --git a/app/Helper.php b/app/Helper.php index b32279497..347390c71 100644 --- a/app/Helper.php +++ b/app/Helper.php @@ -1,6 +1,7 @@ firstOrFail(); } elseif ($namespace == 'Dataset') { $model = Dataset::where([['identifier', $id]])->firstOrFail(); + } elseif ($namespace == 'Molecule') { + $model = Molecule::where([['identifier', $id]])->firstOrFail(); } return [ diff --git a/app/Http/Controllers/API/Auth/LoginController.php b/app/Http/Controllers/API/Auth/LoginController.php index 7964a0738..8ea21f9d7 100644 --- a/app/Http/Controllers/API/Auth/LoginController.php +++ b/app/Http/Controllers/API/Auth/LoginController.php @@ -88,21 +88,6 @@ class LoginController extends Controller * ), * * @OA\Response( - * response=403, - * description="Account not verified - Email verification required", - * - * @OA\JsonContent( - * - * @OA\Property( - * property="message", - * type="string", - * description="Error message indicating account verification status", - * example="Account is not yet verified. Please verify your email address by clicking on the link we just emailed to you." - * ) - * ) - * ), - * - * @OA\Response( * response=422, * description="Validation error - Invalid input data", * @@ -174,6 +159,10 @@ class LoginController extends Controller */ public function login(Request $request): JsonResponse { + $request->validate([ + 'email' => ['required', 'email'], + 'password' => ['required', 'string'], + ]); if (! Auth::attempt($request->only('email', 'password'))) { return response()->json([ diff --git a/app/Http/Controllers/API/Auth/RegisterController.php b/app/Http/Controllers/API/Auth/RegisterController.php index 12c6ffc44..17ae0b2c5 100644 --- a/app/Http/Controllers/API/Auth/RegisterController.php +++ b/app/Http/Controllers/API/Auth/RegisterController.php @@ -6,6 +6,7 @@ use App\Models\Team; use App\Models\User; use Illuminate\Auth\Events\Verified; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; @@ -258,7 +259,7 @@ class RegisterController extends Controller * * Register new user account * - * @return \Illuminate\Http\JsonResponse + * @return JsonResponse */ public function register(Request $request) { @@ -276,7 +277,7 @@ public function register(Request $request) 'status' => false, 'message' => 'validation error', 'errors' => $validateUserDetails->errors(), - ], 401); + ], 422); } $authUser = auth('sanctum')->user(); diff --git a/app/Http/Controllers/API/Auth/UserController.php b/app/Http/Controllers/API/Auth/UserController.php index 16d1213e1..17830bf8d 100644 --- a/app/Http/Controllers/API/Auth/UserController.php +++ b/app/Http/Controllers/API/Auth/UserController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\API\Auth; use App\Http\Controllers\Controller; +use App\Models\User; use Illuminate\Http\Request; class UserController extends Controller @@ -214,7 +215,7 @@ class UserController extends Controller * * Get current authenticated user information * - * @return \App\Models\User + * @return User */ public function info(Request $request) { diff --git a/app/Http/Controllers/API/Auth/VerificationController.php b/app/Http/Controllers/API/Auth/VerificationController.php index 4c6e944ca..75fa26694 100644 --- a/app/Http/Controllers/API/Auth/VerificationController.php +++ b/app/Http/Controllers/API/Auth/VerificationController.php @@ -7,6 +7,8 @@ use Auth; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Auth\Events\Verified; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; class VerificationController extends Controller @@ -129,7 +131,7 @@ class VerificationController extends Controller * Verify user email address using signed URL * * @param int $user_id - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + * @return RedirectResponse|JsonResponse */ public function verify($user_id, Request $request) { @@ -144,7 +146,9 @@ public function verify($user_id, Request $request) } if ($request->user() && $request->user()->getKey() != $user_id) { - Auth::logout(); + if (method_exists(Auth::guard(), 'logout')) { + Auth::logout(); + } throw new AuthorizationException; } @@ -273,7 +277,7 @@ public function verify($user_id, Request $request) * * Resend email verification link * - * @return \Illuminate\Http\JsonResponse + * @return JsonResponse */ public function resend() { diff --git a/app/Http/Controllers/API/DataController.php b/app/Http/Controllers/API/DataController.php index 15c0f13af..2a1aaccd5 100644 --- a/app/Http/Controllers/API/DataController.php +++ b/app/Http/Controllers/API/DataController.php @@ -9,7 +9,9 @@ use App\Models\Dataset; use App\Models\Project; use App\Models\Study; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Http\Resources\Json\AnonymousResourceCollection; use Spatie\QueryBuilder\QueryBuilder; class DataController extends Controller @@ -56,7 +58,7 @@ class DataController extends Controller * in="query", * description="Sort field with optional direction prefix (-created_at for descending)", * - * @OA\Schema(type="string", enum={"created_at", "-created_at", "identifier", "-identifier", "owner.email", "-owner.email"}, default="-created_at") + * @OA\Schema(type="string", enum={"created_at", "-created_at", "identifier", "-identifier"}, default="-created_at") * ), * * @OA\Parameter( @@ -76,14 +78,6 @@ class DataController extends Controller * ), * * @OA\Parameter( - * name="filter[owner.email]", - * in="query", - * description="Filter by data owner email", - * - * @OA\Schema(type="string", format="email", example="researcher@university.edu") - * ), - * - * @OA\Parameter( * name="filter[doi]", * in="query", * description="Filter by Digital Object Identifier", @@ -252,15 +246,15 @@ class DataController extends Controller * and includes Bioschemas.org metadata for enhanced discoverability. * * @param string $model The data model type (projects|samples|datasets) - * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection + * @return AnonymousResourceCollection */ public function all(Request $request, $model) { $per_page = \Request::get('per_page') ?: 100; $defaultSort = '-created_at'; - $allowedSorts = ['created_at', 'identifier', 'owner.email']; - $allowedFilters = ['name', 'created_at', 'identifier', 'owner.email', 'doi']; + $allowedSorts = ['created_at', 'identifier']; + $allowedFilters = ['name', 'created_at', 'identifier', 'doi']; if ($model === 'projects') { return ProjectResource::collection( QueryBuilder::for(Project::class) @@ -482,7 +476,7 @@ public function all(Request $request, $model) * - Usage statistics and engagement metrics * * @param string $id NMRXIV identifier (P123, S456, D789) - * @return \App\Http\Resources\ProjectResource|\App\Http\Resources\StudyResource|\App\Http\Resources\DatasetResource|\Illuminate\Http\JsonResponse + * @return ProjectResource|StudyResource|DatasetResource|JsonResponse */ public function id(Request $request, $id) { diff --git a/app/Http/Controllers/API/ELNController.php b/app/Http/Controllers/API/ELNController.php index 6af9947da..bb7cd1ca3 100644 --- a/app/Http/Controllers/API/ELNController.php +++ b/app/Http/Controllers/API/ELNController.php @@ -11,6 +11,7 @@ use App\Services\ChemotionRepositoryTrackerService; use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; @@ -21,6 +22,7 @@ class ELNController extends Controller */ const SUPPORTED_ELNS = [ 'chemotion', + 'nobs', ]; /** @@ -29,7 +31,7 @@ class ELNController extends Controller * operationId="uploadELNData", * tags={"ELN Submission"}, * summary="Upload and process data from Electronic Lab Notebook (ELN) systems", - * description="Creates or updates a draft with data from external ELN systems. Currently supports Chemotion. Processes ZIP files containing experimental data and extracts them to organized folder structure.", + * description="Creates or updates a draft with data from external ELN systems. Currently supports Chemotion and NoBs. Processes ZIP files containing experimental data and extracts them to organized folder structure.", * security={{"sanctum": {}}}, * * @OA\Parameter( @@ -40,7 +42,7 @@ class ELNController extends Controller * * @OA\Schema( * type="string", - * enum={"chemotion"}, + * enum={"chemotion", "nobs"}, * example="chemotion" * ) * ), @@ -170,7 +172,7 @@ class ELNController extends Controller * type="array", * * @OA\Items(type="string"), - * example={"chemotion"} + * example={"chemotion", "nobs"} * ) * ) * ), @@ -207,7 +209,7 @@ class ELNController extends Controller * Handle file upload for a specific ELN entry * * @param string $eln - * @return \Illuminate\Http\Response + * @return Response */ public function upload($eln, Request $request) { @@ -355,7 +357,7 @@ public function upload($eln, Request $request) * * @OA\Schema( * type="string", - * enum={"chemotion"}, + * enum={"chemotion", "nobs"}, * example="chemotion" * ) * ), @@ -497,7 +499,7 @@ public function upload($eln, Request $request) * type="array", * * @OA\Items(type="string"), - * example={"chemotion"} + * example={"chemotion", "nobs"} * ) * ) * ), @@ -540,7 +542,7 @@ public function upload($eln, Request $request) * * @param string $eln * @param string $external_id - * @return \Illuminate\Http\Response + * @return Response */ public function status($eln, $external_id) { diff --git a/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasController.php b/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasController.php index c941d3788..f0fc20ded 100644 --- a/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasController.php +++ b/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasController.php @@ -12,6 +12,7 @@ use App\Models\User; use Carbon\Carbon; use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use Spatie\SchemaOrg\Schema; @@ -240,7 +241,7 @@ class BioschemasController extends Controller * * @param string $username NMRXIV username * @param string $projectName Project slug identifier - * @return \Illuminate\Http\JsonResponse + * @return JsonResponse */ // public function modelSchemaByName(Request $request, $username, $projectName, $studyName = null, $datasetName = null) @@ -487,7 +488,7 @@ class BioschemasController extends Controller * - Scientific workflow interoperability * * @param string $identifier NMRXIV public identifier (P123, S456, D789) - * @return \Illuminate\Http\JsonResponse + * @return JsonResponse */ public function modelSchemaByID(Request $request, $identifier) { @@ -577,7 +578,7 @@ public function getSample($study) $sampleSchema['dct:conformsTo'] = BioschemasHelper::conformsTo(['https://bioschemas.org/types/ChemicalSubstance/0.3-RELEASE-2019_09_02']); $sampleSchema->name($sample->name); $sampleSchema->description($sample->description); - $sampleSchema->url(env('APP_URL').'/'.explode(':', $study->identifier ? $study->identifier : ':')[1]); + $sampleSchema->url(config('app.url').'/'.explode(':', $study->identifier ? $study->identifier : ':')[1]); $sampleSchema->hasBioChemEntityPart($this->prepareMoleculesSchemas($sample)); return $sampleSchema; @@ -791,7 +792,7 @@ public function datasetLite($dataset) $datasetSchema->description($dataset->description); $datasetSchema->keywords($nmriumInfo[0]); $datasetSchema->license($dataset->study->license->url); - $datasetSchema->url(env('APP_URL').'/'.explode(':', $dataset->identifier ? $dataset->identifier : ':')[1]); + $datasetSchema->url(config('app.url').'/'.explode(':', $dataset->identifier ? $dataset->identifier : ':')[1]); $datasetSchema->dateCreated($dataset->created_at ? $dataset->created_at->toISOString() : null); $datasetSchema->dateModified($dataset->updated_at ? $dataset->updated_at->toISOString() : null); $datasetSchema->datePublished($dataset->release_date ? Carbon::parse($dataset->release_date)->toISOString() : null); @@ -846,7 +847,7 @@ public function studyLite($study) $studySchema->description($study->description); $studySchema->keywords(BioschemasHelper::getTags($study)); $studySchema->license($study->license->url); - $studySchema->url(env('APP_URL').'/'.explode(':', $study->identifier ? $study->identifier : ':')[1]); + $studySchema->url(config('app.url').'/'.explode(':', $study->identifier ? $study->identifier : ':')[1]); $studySchema->dateCreated($study->created_at ? $study->created_at->toISOString() : null); $studySchema->dateModified($study->updated_at ? $study->updated_at->toISOString() : null); $studySchema->datePublished($study->release_date ? Carbon::parse($study->release_date)->toISOString() : null); @@ -894,7 +895,7 @@ public function projectLite($project) $projectSchema->keywords(BioschemasHelper::getTags($project)); $projectSchema->license($project->license->url); $projectSchema->publisher(BioschemasHelper::preparePublisher()); - $projectSchema->url(env('APP_URL').'/'.explode(':', $project->identifier ? $project->identifier : ':')[1]); + $projectSchema->url(config('app.url').'/'.explode(':', $project->identifier ? $project->identifier : ':')[1]); $projectSchema->dateCreated($project->created_at ? $project->created_at->toISOString() : null); $projectSchema->dateModified($project->updated_at ? $project->updated_at->toISOString() : null); $projectSchema->datePublished($project->release_date ? Carbon::parse($project->release_date)->toISOString() : null); diff --git a/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasHelper.php b/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasHelper.php index bdb4710c2..4b772ee4e 100644 --- a/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasHelper.php +++ b/app/Http/Controllers/API/Schemas/Bioschemas/BioschemasHelper.php @@ -146,7 +146,7 @@ public static function prepareCitations($model) */ public static function prepareDataDownload($dataset) { - $url = env('APP_URL'); + $url = config('app.url'); $user = $dataset->owner->username; if (property_exists($dataset, 'project')) { $slug = $dataset->project->slug; @@ -175,8 +175,8 @@ public static function prepareDataDownload($dataset) public static function preparePublisher() { $publisherSchema = Schema::Organization(); - $publisherSchema->name(env('APP_NAME')); - $publisherSchema->url(env('APP_URL')); + $publisherSchema->name(config('app.name')); + $publisherSchema->url(config('app.url')); return $publisherSchema; } @@ -192,8 +192,8 @@ public static function preparePublisher() public static function prepareDataCatalogLite() { $dataCatalogSchema = Schema::DataCatalog(); - $dataCatalogSchema->name(env('APP_NAME')); - $dataCatalogSchema->url(env('APP_URL')); + $dataCatalogSchema->name(config('app.name')); + $dataCatalogSchema->url(config('app.url')); return $dataCatalogSchema; } diff --git a/app/Http/Controllers/API/Schemas/Bioschemas/DataCatalogController.php b/app/Http/Controllers/API/Schemas/Bioschemas/DataCatalogController.php index cda487f81..29d8688a8 100644 --- a/app/Http/Controllers/API/Schemas/Bioschemas/DataCatalogController.php +++ b/app/Http/Controllers/API/Schemas/Bioschemas/DataCatalogController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\API\Schemas\Bioschemas; use App\Http\Controllers\Controller; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Config; use Spatie\SchemaOrg\Schema; @@ -246,7 +247,7 @@ class DataCatalogController extends Controller * - Compliance with funding agency data sharing requirements * - Support for systematic reviews and meta-analyses in chemistry * - * @return \Illuminate\Http\JsonResponse DataCatalog schema representing NMRXIV repository + * @return JsonResponse DataCatalog schema representing NMRXIV repository */ public function dataCatalogSchema(Request $request) { @@ -254,13 +255,13 @@ public function dataCatalogSchema(Request $request) $contributors = $this->prepareContributors(); $nmrXivProvider = Schema::Organization(); - $nmrXivProvider->name(Config::get('schemas.bioschema.provider')); - $nmrXivProvider->url(Config::get('schemas.bioschema.provider_url')); + $nmrXivProvider->name(Config::get('schemas.bioschemas.provider')); + $nmrXivProvider->url(Config::get('schemas.bioschemas.provider_url')); $dataCatalogSchema = Schema::DataCatalog(); - $dataCatalogSchema['@id'] = url(Config::get('app.url')); + $dataCatalogSchema['@id'] = Config::get('app.url'); $dataCatalogSchema['dct:conformsTo'] = BioschemasHelper::conformsTo(['https://schema.org/DataCatalog']); - $dataCatalogSchema->description(env('APP_DESCRIPTION')); + $dataCatalogSchema->description(Config::get('app.description', 'NMRXIV is an open-access preprint repository for sharing and discovering nuclear magnetic resonance (NMR) spectroscopy data.')); $dataCatalogSchema->keywords($keywords); $dataCatalogSchema->name(Config::get('app.name')); $dataCatalogSchema->provider($nmrXivProvider); diff --git a/app/Http/Controllers/API/Schemas/DataCite/DataCiteController.php b/app/Http/Controllers/API/Schemas/DataCite/DataCiteController.php index 0c0f3dfcc..3a515f089 100644 --- a/app/Http/Controllers/API/Schemas/DataCite/DataCiteController.php +++ b/app/Http/Controllers/API/Schemas/DataCite/DataCiteController.php @@ -7,6 +7,7 @@ use App\Models\Project; use App\Models\Study; use App\Models\User; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; class DataCiteController extends Controller @@ -363,7 +364,7 @@ class DataCiteController extends Controller * * @param string $username NMRXIV username * @param string $projectName Project slug identifier - * @return \Illuminate\Http\JsonResponse + * @return JsonResponse */ // public function modelSchemaByName(Request $request, $username, $projectName, $studyName = null, $datasetName = null) @@ -620,7 +621,7 @@ class DataCiteController extends Controller * - **Datasets**: Specific NMR experiments and spectroscopic data * * @param string $identifier NMRXIV public identifier (P123, S456, D789) - * @return \Illuminate\Http\JsonResponse + * @return JsonResponse */ public function modelSchemaByID(Request $request, $identifier) { diff --git a/app/Http/Controllers/API/SearchController.php b/app/Http/Controllers/API/SearchController.php index c164e7363..6d780d316 100644 --- a/app/Http/Controllers/API/SearchController.php +++ b/app/Http/Controllers/API/SearchController.php @@ -5,6 +5,7 @@ use App\Http\Controllers\Controller; use App\Models\Molecule; use Illuminate\Database\QueryException; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; @@ -225,7 +226,7 @@ class SearchController extends Controller * - **Tags**: Classification-based search * - **Filters**: Property-based filtering * - * @return \Illuminate\Pagination\LengthAwarePaginator|\Illuminate\Http\JsonResponse + * @return LengthAwarePaginator|JsonResponse */ public function search(Request $request) { diff --git a/app/Http/Controllers/Admin/AnnouncementController.php b/app/Http/Controllers/Admin/AnnouncementController.php index e3d13cea1..25d6d2d1d 100644 --- a/app/Http/Controllers/Admin/AnnouncementController.php +++ b/app/Http/Controllers/Admin/AnnouncementController.php @@ -6,16 +6,18 @@ use App\Models\Announcement; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use Inertia\Inertia; +use Pages\Announcement\Index; class AnnouncementController extends Controller { /** * Show all the list of Announcements created. * - * @return \Pages\Announcement\Index + * @return Index */ public function index(Request $request) { @@ -44,7 +46,7 @@ public function index(Request $request) /** * Create the new entry for the announcement. * - * @return \Illuminate\Http\Response + * @return Response */ public function create(Request $request) { @@ -84,7 +86,7 @@ public function create(Request $request) /** * Update the specified announcement in the storage. * - * @return \Illuminate\Http\Response + * @return Response */ public function update(Request $request, Announcement $announcement) { @@ -117,7 +119,7 @@ public function update(Request $request, Announcement $announcement) /** * Remove the specified announcement from the storage. * - * @return \Illuminate\Http\Response + * @return Response */ public function destroy(Request $request, Announcement $announcement) { diff --git a/app/Http/Controllers/Admin/UsersController.php b/app/Http/Controllers/Admin/UsersController.php index 131469a06..d69fa5c36 100644 --- a/app/Http/Controllers/Admin/UsersController.php +++ b/app/Http/Controllers/Admin/UsersController.php @@ -4,15 +4,21 @@ use App\Actions\Fortify\CreateNewUser; use App\Actions\Fortify\PasswordValidationRules; +use App\Actions\Fortify\UpdateUserProfileInformation; use App\Http\Controllers\Controller; use App\Models\User; use Illuminate\Auth\Events\Registered; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Inertia\Inertia; use Laravel\Fortify\Contracts\UpdatesUserProfileInformation; +use Pages\Console\Users\Create; +use Pages\Console\Users\Edit; +use Pages\Console\Users\Index; use Spatie\Permission\Models\Role; class UsersController extends Controller @@ -22,7 +28,7 @@ class UsersController extends Controller /** * Render the index page with list of users. * - * @return \Pages\Console\Users\Index + * @return Index */ public function index(Request $request) { @@ -42,6 +48,7 @@ public function index(Request $request) 'role' => $user->getRoleNames(), 'orcid_id' => $user->orcid_id, 'affiliation' => $user->affiliation, + 'ror_id' => $user->ror_id, ]; }), 'roles' => Role::orderBy('name') @@ -54,7 +61,7 @@ public function index(Request $request) /** * Render the create user page. * - * @return \Pages\Console\Users\Create + * @return Create */ public function create() { @@ -70,7 +77,7 @@ public function create() /** * Store the newly created user. * - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function store(Request $request, CreateNewUser $creator) { @@ -83,7 +90,7 @@ public function store(Request $request, CreateNewUser $creator) /** * Render the edit user page. * - * @return \Pages\Console\Users\Edit + * @return Edit */ public function edit(User $user) { @@ -97,6 +104,7 @@ public function edit(User $user) 'profile_photo_url' => $user->profile_photo_url, 'orcid_id' => $user->orcid_id, 'affiliation' => $user->affiliation, + 'ror_id' => $user->ror_id, ], ]); @@ -105,8 +113,8 @@ public function edit(User $user) /** * Save the updated user info. * - * @param \App\Actions\Fortify\UpdateUserProfileInformation $updater - * @return \Illuminate\Http\RedirectResponse + * @param UpdateUserProfileInformation $updater + * @return RedirectResponse */ public function update(User $user, Request $request, UpdatesUserProfileInformation $updater) { @@ -118,7 +126,7 @@ public function update(User $user, Request $request, UpdatesUserProfileInformati /** * Save the updated password for the user. * - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function updatePassword(User $user, Request $request) { @@ -136,7 +144,7 @@ public function updatePassword(User $user, Request $request) /** * Save the updated role for the user. * - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function updateRole(User $user, Request $request) { @@ -162,7 +170,7 @@ public function updateRole(User $user, Request $request) /** * Check if user has password. * - * @return \Illuminate\Http\Response + * @return Response */ public function checkPassword(Request $request) { @@ -180,7 +188,7 @@ public function checkPassword(Request $request) /** * Delete the profile photo. * - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function destroyPhoto(User $user, Request $request) { @@ -193,7 +201,7 @@ public function destroyPhoto(User $user, Request $request) * Mark notification as read. * * @param int $id - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function markNotificationAsRead(User $user, Request $request) { @@ -210,7 +218,7 @@ public function markNotificationAsRead(User $user, Request $request) * Mark all notification as read. * * @param User $user - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function markAllNotificationAsRead(Request $request) { diff --git a/app/Http/Controllers/ApplicationController.php b/app/Http/Controllers/ApplicationController.php index 022a698db..fe8557380 100644 --- a/app/Http/Controllers/ApplicationController.php +++ b/app/Http/Controllers/ApplicationController.php @@ -42,7 +42,10 @@ public function resolveCompound(Request $request, $identifier) if ($model && $namespace === 'Molecule') { // Redirect to spectra page with compound parameter for now // This maintains the current compound viewing functionality - return redirect('/spectra?compound='.substr($identifier, 1)); + // Use getRawOriginal to get the numeric identifier without NMRXIV:M prefix + $compoundId = $model->getRawOriginal('identifier'); + + return redirect('/spectra?compound='.$compoundId); } else { abort(404, 'Compound not found'); } @@ -102,6 +105,7 @@ public function resolve(Request $request, $identifier) } } elseif ($namespace == 'Study') { $study = $model; + $study->load('studyAuthors'); // Eager load authors $project = $study->project; $tab = 'study'; } elseif ($namespace == 'Dataset') { @@ -147,7 +151,7 @@ public function resolve(Request $request, $identifier) } else { return Inertia::render('Public/Sample/Show', [ 'tab' => $tab, - 'study' => (new StudyResource($study))->lite(false, ['tags', 'sample', 'datasets', 'molecules', 'owner', 'license']), + 'study' => (new StudyResource($study))->lite(false, ['tags', 'sample', 'datasets', 'molecules', 'owner', 'license', 'authors']), ]); break; } diff --git a/app/Http/Controllers/Auth/SocialController.php b/app/Http/Controllers/Auth/SocialController.php index 754f7cbe2..1619de34d 100644 --- a/app/Http/Controllers/Auth/SocialController.php +++ b/app/Http/Controllers/Auth/SocialController.php @@ -7,6 +7,7 @@ use App\Models\Team; use App\Models\User; use Illuminate\Auth\Events\Registered; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Redirect; use Laravel\Socialite\Facades\Socialite; @@ -17,7 +18,7 @@ class SocialController extends Controller /** * Redirect the user to the GitHub authentication page. * - * @return \Illuminate\Http\Response + * @return Response */ public function redirectToProvider($service) { @@ -31,7 +32,7 @@ public function redirectToProvider($service) /** * Obtain the user information from GitHub. * - * @return \Illuminate\Http\Response + * @return Response */ public function handleProviderCallback($service) { diff --git a/app/Http/Controllers/CASController.php b/app/Http/Controllers/CASController.php new file mode 100644 index 000000000..e60b81970 --- /dev/null +++ b/app/Http/Controllers/CASController.php @@ -0,0 +1,45 @@ +validate([ + 'cas_rn' => 'required|string|max:20', + ]); + + $casNumber = $request->input('cas_rn'); + + // Check if API token is configured + if (! Config::get('services.cas.api_token')) { + return response()->json([ + 'error' => 'CAS Service not configured', + ], 500); + } + + try { + $data = $this->casService->getCASDetails($casNumber); + + return response()->json($data); + + } catch (\Exception $e) { + return response()->json([ + 'error' => 'Unable to retrieve CAS details. Please verify the CAS number and try again.', + ], 400); + } + } +} diff --git a/app/Http/Controllers/DatasetController.php b/app/Http/Controllers/DatasetController.php index 64afcaeaa..246dcf6c0 100644 --- a/app/Http/Controllers/DatasetController.php +++ b/app/Http/Controllers/DatasetController.php @@ -19,11 +19,15 @@ public function publicDatasetView(Request $request, $slug) { $dataset = Dataset::where('slug', $slug)->firstOrFail(); - if ($dataset->is_public) { - return Inertia::render('Public/Dataset', [ - 'dataset' => $dataset, - ]); + if (! $dataset->is_public) { + return response()->json([ + 'message' => 'Unauthorized', + ], 401); } + + return Inertia::render('Public/Dataset', [ + 'dataset' => $dataset, + ]); } public function fetchNMRium(Request $request, Dataset $dataset) @@ -142,12 +146,12 @@ public function snapshot(Request $request, Dataset $dataset) if ($content) { if ($study->project) { $path = '/projects/'.$study->project->uuid.'/'.$study->uuid.'/'.$dataset->slug.'.svg'; - Storage::disk(env('FILESYSTEM_DRIVER_PUBLIC'))->put($path, $content, 'public'); + Storage::disk(config('filesystems.default_public'))->put($path, $content, 'public'); $dataset->dataset_photo_path = $path; $dataset->save(); } else { $path = '/samples/'.$study->uuid.'/'.$dataset->slug.'.svg'; - Storage::disk(env('FILESYSTEM_DRIVER_PUBLIC'))->put($path, $content, 'public'); + Storage::disk(config('filesystems.default_public'))->put($path, $content, 'public'); $dataset->dataset_photo_path = $path; $dataset->save(); } diff --git a/app/Http/Controllers/DownloadController.php b/app/Http/Controllers/DownloadController.php index ef3faab47..9c79961ac 100644 --- a/app/Http/Controllers/DownloadController.php +++ b/app/Http/Controllers/DownloadController.php @@ -66,7 +66,7 @@ public function downloadSet(Request $request, $username, $project, $study = null $fsObj = new FileSystemObject; $fsObj->type = 'directory'; $fsObj->name = $project->slug; - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $fsObj->path = $environment.'/'.$project->uuid; $fsObj->key = $project->uuid; $fsObj->relative_url = '/'.$project->uuid; @@ -92,12 +92,12 @@ public function downloadFromProject(Request $request, $username, $project, $key $s3Client = $this->storageClient(); - $bucket = $request->input('bucket') ?: config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.bucket'); + $bucket = $request->input('bucket') ?: config('filesystems.disks.'.config('filesystems.default').'.bucket'); $s3keys = []; if ($fsObj->type == 'file') { - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); if (Storage::has($path)) { array_push($s3keys, substr($fsObj->path, 1)); } @@ -164,19 +164,20 @@ function () use ($s3keys, $bucket, $fsObj) { /** * Get the S3 storage client instance. * - * @return \Aws\S3\S3Client + * @return S3Client */ protected function storageClient() { + $diskName = config('filesystems.default'); $config = [ - 'region' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.region'), + 'region' => config('filesystems.disks.'.$diskName.'.region'), 'version' => 'latest', 'use_path_style_endpoint' => true, - 'url' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.endpoint'), - 'endpoint' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.endpoint'), + 'url' => config('filesystems.disks.'.$diskName.'.endpoint'), + 'endpoint' => config('filesystems.disks.'.$diskName.'.endpoint'), 'credentials' => [ - 'key' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.key'), - 'secret' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.secret'), + 'key' => config('filesystems.disks.'.$diskName.'.key'), + 'secret' => config('filesystems.disks.'.$diskName.'.secret'), ], ]; diff --git a/app/Http/Controllers/DraftController.php b/app/Http/Controllers/DraftController.php index eb9e2fc8a..a3be54cba 100644 --- a/app/Http/Controllers/DraftController.php +++ b/app/Http/Controllers/DraftController.php @@ -9,8 +9,11 @@ use App\Models\Draft; use App\Models\FileSystemObject; use App\Models\Project; +use App\Models\User; use Illuminate\Http\JsonResponse; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; /** @@ -52,7 +55,7 @@ public function all(Request $request): JsonResponse /** * Process draft and convert to project structure. * - * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse + * @return Response|JsonResponse|RedirectResponse */ public function process(Request $request, Draft $draft) { @@ -81,6 +84,24 @@ public function missingFiles(Request $request, Draft $draft): JsonResponse return response()->json($missingFilesData); } + /** + * Get a single draft by ID with ownership verification. + */ + public function show(Request $request, Draft $draft): JsonResponse + { + /** @var User $user */ + $user = Auth::user(); + [$user_id] = $user->getUserTeamData(); + + if ($draft->owner_id !== $user_id) { + abort(403); + } + + return response()->json([ + 'draft' => $draft->load('Tags'), + ]); + } + /** * Update draft properties. */ diff --git a/app/Http/Controllers/FileSystemController.php b/app/Http/Controllers/FileSystemController.php index 7a9857cad..1503bf9bc 100644 --- a/app/Http/Controllers/FileSystemController.php +++ b/app/Http/Controllers/FileSystemController.php @@ -9,10 +9,12 @@ use App\Services\ELNMetadataServiceFactory; use App\Services\FileSystemObjectService; use App\Services\StorageSignedUrlService; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; +use Illuminate\Validation\ValidationException; /** * Handle file system operations and signed URL generation for file uploads. @@ -30,8 +32,8 @@ public function __construct( /** * Generate signed URLs for draft file uploads. * - * @throws \Illuminate\Validation\ValidationException - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws ValidationException + * @throws ModelNotFoundException */ public function signedDraftStorageURL(Request $request): JsonResponse { @@ -71,8 +73,8 @@ public function signedDraftStorageURL(Request $request): JsonResponse /** * Generate signed URLs for project file uploads. * - * @throws \Illuminate\Validation\ValidationException - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws ValidationException + * @throws ModelNotFoundException */ public function signedStorageURL(Request $request): JsonResponse { @@ -108,7 +110,7 @@ public function signedStorageURL(Request $request): JsonResponse /** * Delete a filesystem object and all its children recursively. * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws ModelNotFoundException */ public function deleteFSO(Request $request, Draft $draft, FileSystemObject $filesystemobject): JsonResponse { diff --git a/app/Http/Controllers/OrcidController.php b/app/Http/Controllers/OrcidController.php new file mode 100644 index 000000000..3af51001d --- /dev/null +++ b/app/Http/Controllers/OrcidController.php @@ -0,0 +1,86 @@ +input('q'); + + if (! $query) { + return response()->json(['error' => 'Query parameter is required'], 400); + } + + try { + $response = Http::withHeaders([ + 'Accept' => 'application/json', + ])->get(config('orcid.base_url').'/search', [ + 'q' => $query, + ]); + + if ($response->failed()) { + return response()->json([ + 'error' => 'Failed to fetch ORCID search results', + 'message' => $response->json('error-desc.value') ?? 'ORCID API returned an error', + ], $response->status()); + } + + return response()->json($response->json()); + } catch (\Exception $e) { + return response()->json(['error' => 'Failed to fetch ORCID search results'], 500); + } + } + + public function person(string $orcidId): JsonResponse + { + if (! $orcidId) { + return response()->json(['error' => 'ORCID ID is required'], 400); + } + + try { + $response = Http::withHeaders([ + 'Accept' => 'application/json', + ])->get(config('orcid.base_url').'/'.$orcidId.'/person'); + + if ($response->failed()) { + return response()->json([ + 'error' => 'Failed to fetch person data', + 'message' => $response->json('error-desc.value') ?? 'ORCID API returned an error', + ], $response->status()); + } + + return response()->json($response->json()); + } catch (\Exception $e) { + return response()->json(['error' => 'Failed to fetch person data'], 500); + } + } + + public function employment(string $orcidId): JsonResponse + { + if (! $orcidId) { + return response()->json(['error' => 'ORCID ID is required'], 400); + } + + try { + $response = Http::withHeaders([ + 'Accept' => 'application/json', + ])->get(config('orcid.base_url').'/'.$orcidId.'/employments'); + + if ($response->failed()) { + return response()->json([ + 'error' => 'Failed to fetch employment data', + 'message' => $response->json('error-desc.value') ?? 'ORCID API returned an error', + ], $response->status()); + } + + return response()->json($response->json()); + } catch (\Exception $e) { + return response()->json(['error' => 'Failed to fetch employment data'], 500); + } + } +} diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 58f1f9481..a8a0135ff 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -199,7 +199,7 @@ public function settings(Request $request, Project $project) return Inertia::render('Project/Settings', [ 'project' => $project, - 'schema' => $environment = env('SCHEMA_VERSION', 'local'), + 'schema' => config('app.schema_version', 'beta'), 'projectPermissions' => [ 'canDeleteProject' => Gate::check('deleteProject', $project), ], @@ -251,7 +251,7 @@ public function toggleArchive(Request $request, StatefulGuard $guard, Project $p ]); } - $creator->toggle($project); + $creator->toggleArchive($project); return redirect()->route('dashboard')->with('success', 'Project archive state updated successfully'); } @@ -324,12 +324,21 @@ public function validationReport(Request $request, Project $project) public function publish(Request $request, Project $project, PublishProject $publisher, UpdateProject $updater) { + if (! Gate::forUser($request->user())->allows('publishProject', $project)) { + return response()->json(['message' => 'Forbidden'], 403); + } + if ($project) { $input = $request->all(); - $release_date = $input['release_date']; + $release_date = $request->get('release_date'); $enableProjectMode = $request->get('enableProjectMode'); if ($enableProjectMode) { $validation = $project->validation; + if (! $validation) { + return response()->json([ + 'errors' => 'Project validation not found. Please ensure the project is properly configured.', + ], 422); + } $validation->process(); $validation = $validation->fresh(); if ($validation['report']['project']['status']) { @@ -351,16 +360,20 @@ public function publish(Request $request, Project $project, PublishProject $publ } } else { $draft = $project->draft; - $draft->project_enabled = false; - $draft->save(); + if ($draft) { + $draft->project_enabled = false; + $draft->save(); + } $project->release_date = $request->get('release_date'); $project->status = 'queued'; $project->save(); $validation = $project->validation; - $validation->process(); - $validation = $validation->fresh(); + if ($validation) { + $validation->process(); + $validation = $validation->fresh(); + } foreach ($project->studies as $study) { $study->license_id = $project->license_id; @@ -373,9 +386,11 @@ public function publish(Request $request, Project $project, PublishProject $publ $status = true; - foreach ($validation['report']['project']['studies'] as $study) { - if (! $study['status']) { - $status = false; + if ($validation && isset($validation['report']['project']['studies'])) { + foreach ($validation['report']['project']['studies'] as $study) { + if (! $study['status']) { + $status = false; + } } } // add license check @@ -398,7 +413,7 @@ public function publish(Request $request, Project $project, PublishProject $publ public function store(Request $request, CreateNewProject $creator) { - if (! Gate::forUser($request->user())->check('createProject', $project)) { + if (! Gate::forUser($request->user())->allows('createProject', Project::class)) { throw new AuthorizationException; } diff --git a/app/Http/Controllers/ProjectInvitationController.php b/app/Http/Controllers/ProjectInvitationController.php index 28dc8adfc..37b157c06 100644 --- a/app/Http/Controllers/ProjectInvitationController.php +++ b/app/Http/Controllers/ProjectInvitationController.php @@ -5,6 +5,7 @@ use App\Actions\Project\AddProjectMember; use App\Models\ProjectInvitation; use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -14,7 +15,7 @@ class ProjectInvitationController extends Controller * Accept a project invitation. * * @param \Laravel\Jetstream\ProjectInvitation $invitation - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function acceptInvitation(Request $request, ProjectInvitation $invitation) { @@ -36,7 +37,7 @@ public function acceptInvitation(Request $request, ProjectInvitation $invitation * Cancel the given project invitation. * * @param \Laravel\Jetstream\ProjectInvitation $invitation - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function destroyInvitation(Request $request, ProjectInvitation $invitation) { diff --git a/app/Http/Controllers/ProjectMemberController.php b/app/Http/Controllers/ProjectMemberController.php index a347c4148..a81106b2d 100644 --- a/app/Http/Controllers/ProjectMemberController.php +++ b/app/Http/Controllers/ProjectMemberController.php @@ -7,6 +7,7 @@ use App\Actions\Project\UpdateProjectMemberRole; use App\Models\Project; use App\Models\User; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; class ProjectMemberController extends Controller @@ -15,7 +16,7 @@ class ProjectMemberController extends Controller * Add a new team member to a project. * * @param int $projectId - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function memberStore(Request $request, $projectId) { @@ -37,7 +38,7 @@ public function memberStore(Request $request, $projectId) * * @param int $projectId * @param int $userId - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function updateMemberRole(Request $request, $projectId, $userId) { @@ -56,7 +57,7 @@ public function updateMemberRole(Request $request, $projectId, $userId) * * @param int $projectId * @param int $userId - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function removeMember(Request $request, $projectId, $userId) { diff --git a/app/Http/Controllers/RorController.php b/app/Http/Controllers/RorController.php new file mode 100644 index 000000000..74d2b6133 --- /dev/null +++ b/app/Http/Controllers/RorController.php @@ -0,0 +1,63 @@ +all(), [ + 'query' => 'required|string|min:3|max:255', + ]); + + if ($validator->fails()) { + return response()->json([ + 'error' => 'Invalid search query', + 'messages' => $validator->errors(), + ], 422); + } + + $query = $request->input('query'); + + try { + $response = Http::timeout(10) + ->acceptJson() + ->get(config('ror.api_url', 'https://api.ror.org/organizations'), [ + 'query' => $query, + ]); + + if ($response->successful()) { + return response()->json($response->json()); + } + + Log::warning('ROR API request failed', [ + 'status' => $response->status(), + 'body' => $response->body(), + ]); + + return response()->json([ + 'error' => 'Failed to fetch organizations', + 'items' => [], + ], $response->status()); + } catch (\Exception $e) { + Log::error('ROR API exception', [ + 'message' => $e->getMessage(), + 'query' => $query, + ]); + + return response()->json([ + 'error' => 'An error occurred while searching for organizations', + 'items' => [], + ], 500); + } + } +} diff --git a/app/Http/Controllers/StudyController.php b/app/Http/Controllers/StudyController.php index eb538299f..c77f36489 100644 --- a/app/Http/Controllers/StudyController.php +++ b/app/Http/Controllers/StudyController.php @@ -13,7 +13,6 @@ use App\Models\Sample; use App\Models\Study; use App\Models\User; -use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Contracts\Auth\StatefulGuard; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -65,6 +64,8 @@ public function store(Request $request, CreateNewStudy $creator) public function update(Request $request, UpdateStudy $updater, Study $study) { + Gate::authorize('updateStudy', $study); + $updater->update($study, $request->all()); $study = $study->fresh(); @@ -78,12 +79,10 @@ public function update(Request $request, UpdateStudy $updater, Study $study) public function show(Request $request, Study $study, GetLicense $getLicense) { - if (! Gate::forUser($request->user())->check('viewStudy', $study)) { - throw new AuthorizationException; - } + Gate::forUser($request->user())->authorize('viewStudy', $study); $project = $study->project; - $team = $project->nonPersonalTeam; + $team = $project?->nonPersonalTeam; $license = null; if ($study->license_id) { $license = $getLicense->getLicensebyId($study->license_id); @@ -102,12 +101,10 @@ public function protocols(Request $request, Study $study) public function datasets(Request $request, Study $study) { - if (! Gate::forUser($request->user())->check('viewStudy', $study)) { - throw new AuthorizationException; - } + Gate::forUser($request->user())->authorize('viewStudy', $study); $project = $study->project; - $team = $project->team; + $team = $project?->team; return $this->renderTabView('Datasets', $study, $team, $project, null, null, false); } @@ -117,7 +114,7 @@ public function preview2(Request $request, $obfuscationCode, Study $study, $mode switch ($model) { case 'study': $project = Project::where([['is_archived', false], ['obfuscationcode', $obfuscationCode]])->firstOrFail(); - $team = $project->nonPersonalTeam; + $team = $project?->nonPersonalTeam; $license = null; if ($study->license_id) { $license = $getLicense->getLicensebyId($study->license_id); @@ -128,7 +125,7 @@ public function preview2(Request $request, $obfuscationCode, Study $study, $mode break; case 'files': $project = Project::where([['is_archived', false], ['obfuscationcode', $obfuscationCode]])->firstOrFail(); - $team = $project->nonPersonalTeam; + $team = $project?->nonPersonalTeam; $studyFSObject = $study->fsObject; return $this->renderTabView('Files', $study, $team, $project, null, $studyFSObject, true); @@ -136,7 +133,7 @@ public function preview2(Request $request, $obfuscationCode, Study $study, $mode break; case 'datasets': $project = Project::where([['is_archived', false], ['obfuscationcode', $obfuscationCode]])->firstOrFail(); - $team = $project->nonPersonalTeam; + $team = $project?->nonPersonalTeam; return $this->renderTabView('Datasets', $study, $team, $project, null, null, true); @@ -149,9 +146,9 @@ public function renderTabView($tab, $study, $team, $project, $license, $studyFSO switch ($tab) { case 'About': return Inertia::render('Study/About', [ - 'study' => $study->load('users', 'owner', 'studyInvitations', 'tags', 'sample.molecules'), + 'study' => $study->load('users', 'owner', 'studyInvitations', 'tags', 'sample.molecules', 'studyAuthors'), 'team' => $team ? $team->load('users', 'owner') : null, - 'project' => $project ? $project->load('users', 'owner') : null, + 'project' => $project ? $project->load('users', 'owner', 'authors') : null, 'members' => $study->allUsers(), 'preview' => $preview, 'availableRoles' => array_values(Jetstream::$roles), @@ -208,13 +205,15 @@ public function renderTabView($tab, $study, $team, $project, $license, $studyFSO public function moleculeStore(Request $request, Study $study) { + Gate::forUser($request->user())->authorize('updateStudy', $study); + $sample = $study->sample; if (! $sample) { $sample = Sample::create([ 'name' => $study->name.'_sample', 'slug' => Str::slug($study->name.'_sample', '-'), 'study_id' => $study->id, - 'project_id' => $study->project->id, + 'project_id' => $study->project ? $study->project->id : null, ]); $study->sample()->save($sample); } @@ -277,6 +276,8 @@ public function nmriumVersions(Request $request, Study $study) public function nmriumInfo(Request $request, Study $study) { + Gate::forUser($request->user())->authorize('updateStudy', $study); + // $version = $request->get('version'); // $spectra = $request->get('spectra'); // $molecules = $nmriumInfo['data']['molecules']; @@ -380,12 +381,10 @@ public function moleculeDetach(Request $request, Study $study, Molecule $molecul public function files(Request $request, Study $study) { - if (! Gate::forUser($request->user())->check('viewStudy', $study)) { - throw new AuthorizationException; - } + Gate::forUser($request->user())->authorize('viewStudy', $study); $project = $study->project; - $team = $project->nonPersonalTeam; + $team = $project?->nonPersonalTeam; $studyFSObject = $study->fsObject; return $this->renderTabView('Files', $study, $team, $project, null, $studyFSObject, false); @@ -393,9 +392,7 @@ public function files(Request $request, Study $study) public function annotations(Request $request, Study $study) { - if (! Gate::forUser($request->user())->check('viewStudy', $study)) { - throw new AuthorizationException; - } + Gate::forUser($request->user())->authorize('viewStudy', $study); $studyFSObject = FileSystemObject::with('children') ->where([ @@ -439,7 +436,7 @@ public function file(Request $request, $code, Study $study, $filename) } else { if ($file) { - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $path = preg_replace( '~//+~', '/', @@ -497,6 +494,8 @@ public function Notifications(Request $request, Study $study) public function settings(Request $request, Study $study) { + Gate::forUser($request->user())->authorize('viewStudy', $study); + return Inertia::render('Study/Settings', [ 'study' => $study, 'project' => $study->project, @@ -508,6 +507,8 @@ public function destroy( StatefulGuard $guard, Study $study ) { + Gate::forUser($request->user())->authorize('deleteStudy', $study); + $confirmed = app(ConfirmPassword::class)( $guard, $request->user(), @@ -545,10 +546,12 @@ public function toggleStarred(Request $request, Study $study) public function snapshot(Request $request, Study $study) { + Gate::forUser($request->user())->authorize('updateStudy', $study); + $content = $request->get('img'); if ($content) { $path = '/projects/'.$study->project->uuid.'/'.$study->slug.'.svg'; - Storage::disk(env('FILESYSTEM_DRIVER_PUBLIC'))->put($path, $content, 'public'); + Storage::disk(config('filesystems.default_public'))->put($path, $content, 'public'); $study->study_photo_path = $path; $study->save(); } diff --git a/app/Http/Controllers/StudyInvitationController.php b/app/Http/Controllers/StudyInvitationController.php index 809895185..7461355cc 100644 --- a/app/Http/Controllers/StudyInvitationController.php +++ b/app/Http/Controllers/StudyInvitationController.php @@ -5,6 +5,7 @@ use App\Actions\Study\AddStudyMember; use App\Models\StudyInvitation; use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -14,7 +15,7 @@ class StudyInvitationController extends Controller * Accept a study invitation. * * @param \Laravel\Jetstream\StudyInvitation $invitation - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function acceptInvitation(Request $request, StudyInvitation $invitation) { @@ -36,7 +37,7 @@ public function acceptInvitation(Request $request, StudyInvitation $invitation) * Cancel the given study invitation. * * @param \Laravel\Jetstream\StudyInvitation $invitation - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function destroyInvitation(Request $request, StudyInvitation $invitation) { diff --git a/app/Http/Controllers/StudyMemberController.php b/app/Http/Controllers/StudyMemberController.php index fe68dfa8a..3e9b61753 100644 --- a/app/Http/Controllers/StudyMemberController.php +++ b/app/Http/Controllers/StudyMemberController.php @@ -7,6 +7,7 @@ use App\Actions\Study\UpdateStudyMemberRole; use App\Models\Study; use App\Models\User; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; class StudyMemberController extends Controller @@ -15,7 +16,7 @@ class StudyMemberController extends Controller * Add a new team member to a study. * * @param int $studyId - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function memberStore(Request $request, $studyId) { @@ -37,7 +38,7 @@ public function memberStore(Request $request, $studyId) * * @param int $studyId * @param int $userId - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function updateMemberRole(Request $request, $studyId, $userId) { @@ -56,7 +57,7 @@ public function updateMemberRole(Request $request, $studyId, $userId) * * @param int $studyId * @param int $userId - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function removeMember(Request $request, $studyId, $userId) { diff --git a/app/Http/Controllers/SupportBubbleController.php b/app/Http/Controllers/SupportBubbleController.php new file mode 100644 index 000000000..96c417ef3 --- /dev/null +++ b/app/Http/Controllers/SupportBubbleController.php @@ -0,0 +1,46 @@ +input('subject'), + $request->input('message'), + $request->input('email'), + $request->input('name'), + $request->input('url'), + $request->ip(), + $request->userAgent(), + $request + )); + + return response()->view('support-bubble::success'); + + } catch (\Exception $e) { + Log::error('Support bubble submission failed', [ + 'error' => $e->getMessage(), + 'ip' => $request->ip(), + 'data' => $request->only(['email', 'subject']), + ]); + + return response()->json([ + 'success' => false, + 'message' => 'An error occurred while processing your request. Please try again.', + ], 500); + } + } +} diff --git a/app/Http/Controllers/TeamController.php b/app/Http/Controllers/TeamController.php index 5effac6eb..4bc5ea5e1 100644 --- a/app/Http/Controllers/TeamController.php +++ b/app/Http/Controllers/TeamController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use Illuminate\Contracts\Auth\StatefulGuard; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; use Laravel\Fortify\Actions\ConfirmPassword; @@ -19,7 +20,7 @@ class TeamController extends Controller * Delete the given team. * * @param int $teamId - * @return \Illuminate\Http\RedirectResponse + * @return RedirectResponse */ public function destroy(Request $request, StatefulGuard $guard, $teamId) { diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index e4d527f77..e72302123 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -42,46 +42,46 @@ public function share(Request $request) $user = $request->user(); return array_merge(parent::share($request), [ - 'flash' => [ - 'message' => fn () => $request->session()->get('message'), - ], - 'auth.user.permissions' => fn () => $user ? - $user->getPermissionsViaRoles()->pluck('name') - : null, 'flash' => function () use ($request) { return [ + 'message' => $request->session()->get('message'), 'success' => $request->session()->get('success'), 'error' => $request->session()->get('error'), ]; }, + 'auth.user.permissions' => fn () => $user ? + $user->getPermissionsViaRoles()->pluck('name') + : null, 'auth.user.roles' => fn () => $user ? $user->getRoleNames() : null, 'auth.user.teamRole' => fn () => $user ? $user->teamRole($user->currentTeam) : null, 'auth.user.notifications' => fn () => $user ? $user->unreadNotifications : null, - 'twitter' => (env('TWITTER_CLIENT_ID') !== null && env('TWITTER_CLIENT_ID') !== ''), - 'github' => (env('GITHUB_CLIENT_ID') !== null && env('GITHUB_CLIENT_ID') !== ''), - 'orcid' => (env('ORCID_CLIENT_ID') !== null && env('ORCID_CLIENT_ID') !== ''), - 'nfdiaai' => (env('NFDIAAI_CLIENT_ID') !== null && env('NFDIAAI_CLIENT_ID') !== ''), + 'twitter' => (config('services.twitter.client_id') !== null && config('services.twitter.client_id') !== ''), + 'github' => (config('services.github.client_id') !== null && config('services.github.client_id') !== ''), + 'orcid' => (config('services.orcid.client_id') !== null && config('services.orcid.client_id') !== ''), + 'nfdiaai' => (config('services.regapp.client_id') !== null && config('services.regapp.client_id') !== ''), 'config.announcements' => Schema::hasTable('announcements') ? Announcement::active() : null, - 'url' => env('APP_URL'), - 'nmriumURL' => env('NMRIUM_URL'), + 'url' => config('app.url'), + 'nmriumURL' => config('external-links.nmrium_url'), 'team' => $user ? $user->currentTeam : null, - 'environment' => env('APP_ENV'), - 'MEILISEARCH_HOST' => (env('MEILISEARCH_HOST')), - 'MEILISEARCH_PUBLICKEY' => (env('MEILISEARCH_PUBLICKEY')), - 'SCOUT_PREFIX' => (env('SCOUT_PREFIX')), - 'europemcWSApi' => (env('EUROPEMC_WS_API')), - 'dataciteURL' => env('DATACITE_ENDPOINT'), - 'coolOffPeriod' => env('COOL_OFF_PERIOD'), - 'mailFromAddress' => env('MAIL_FROM_ADDRESS'), - 'orcidSearchApi' => env('ORCID_ID_SEARCH_API'), - 'orcidPersonApi' => env('ORCID_ID_PERSON_API'), - 'orcidEmploymentApi' => env('ORCID_ID_EMPLOYMENT_API'), - 'CM_API' => env('CM_API'), - 'CROSSREF_API' => env('CROSSREF_API'), - 'DATACITE_API' => env('DATACITE_API'), + 'environment' => config('app.env'), + 'MEILISEARCH_HOST' => config('scout.meilisearch.host'), + 'MEILISEARCH_PUBLICKEY' => config('scout.meilisearch.public_key'), + 'SCOUT_PREFIX' => config('scout.prefix'), + 'europemcWSApi' => config('external-links.europemc_ws_api'), + 'dataciteURL' => config('doi.datacite.endpoint'), + 'coolOffPeriod' => config('nmrxiv.cool_off_period'), + 'mailFromAddress' => config('mail.from.address'), + 'chemistryStandardizeUrl' => config('services.chemistry_standardize.url'), + 'orcidSearchApi' => config('orcid.search_api'), + 'orcidPersonApi' => config('orcid.person_api'), + 'michiStandardsUrl' => config('external-links.michi_standards_url'), + 'orcidEmploymentApi' => config('orcid.employment_api'), + 'CM_API' => config('external-links.cm_api'), + 'CROSSREF_API' => config('external-links.crossref_api'), + 'DATACITE_API' => config('external-links.datacite_api'), ]); } } diff --git a/app/Http/Middleware/XFrameOptions.php b/app/Http/Middleware/XFrameOptions.php index 9b4e237f6..b22d47e1b 100644 --- a/app/Http/Middleware/XFrameOptions.php +++ b/app/Http/Middleware/XFrameOptions.php @@ -11,7 +11,7 @@ class XFrameOptions /** * Handle an incoming request. * - * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next + * @param Closure(Request): (Response) $next */ public function handle(Request $request, Closure $next): Response { diff --git a/app/Http/Requests/SupportBubbleRequest.php b/app/Http/Requests/SupportBubbleRequest.php new file mode 100644 index 000000000..f44e40c99 --- /dev/null +++ b/app/Http/Requests/SupportBubbleRequest.php @@ -0,0 +1,267 @@ +|string> + */ + public function rules(): array + { + return [ + 'email' => [ + 'required', + 'email', + 'max:255', + function ($attribute, $value, $fail) { + // Block disposable email domains + $disposableDomains = [ + '10minutemail.com', '10minutemail.net', 'guerrillamail.com', + 'mailinator.com', 'yopmail.com', 'tempmail.org', 'throwaway.email', + 'temp-mail.org', 'getnada.com', 'maildrop.cc', + ]; + + $domain = substr(strrchr($value, '@'), 1); + if (in_array(strtolower($domain), $disposableDomains)) { + $fail('Please use a permanent email address. Temporary email services are not allowed.'); + } + + // Extract username part (before @) + $username = substr($value, 0, strpos($value, '@')); + + // Enhanced gibberish detection for email usernames + if ($this->isGibberishEmail($username)) { + $fail('Please enter a valid email address. Random characters are not allowed.'); + } + + // Block suspicious patterns (original check) + if (preg_match('/^[a-z0-9]{10,20}@gmail\.com$/i', $value)) { + $fail('Please enter a valid email address. Random characters are not allowed.'); + } + }, + ], + 'name' => [ + 'nullable', + 'string', + 'max:255', + function ($attribute, $value, $fail) { + if ($value && $this->containsGibberish($value)) { + $fail('The name contains invalid characters or patterns.'); + } + }, + ], + 'subject' => [ + 'required', + 'string', + 'max:255', + 'min:3', + function ($attribute, $value, $fail) { + if ($this->containsGibberish($value)) { + $fail('The subject must contain meaningful text.'); + } + + // Check for excessive special characters + if (preg_match_all('/[^a-zA-Z0-9\s]/', $value) > strlen($value) * 0.3) { + $fail('The subject contains too many special characters.'); + } + }, + ], + 'message' => [ + 'required', + 'string', + 'max:2000', + 'min:10', + function ($attribute, $value, $fail) { + if ($this->containsGibberish($value)) { + $fail('The message must contain meaningful text.'); + } + + // Check for excessive special characters + if (preg_match_all('/[^a-zA-Z0-9\s\.\,\!\?\-]/', $value) > strlen($value) * 0.2) { + $fail('The message contains too many special characters.'); + } + + // Check for minimum word count + $wordCount = str_word_count($value); + if ($wordCount < 3) { + $fail('The message must contain at least 3 words.'); + } + }, + ], + 'url' => 'nullable|url|max:255', + 'g-recaptcha-response' => [ + function ($attribute, $value, $fail) { + if (config('services.recaptcha.site_key') && empty($value)) { + $fail('Please complete the CAPTCHA verification.'); + + return; + } + if (config('services.recaptcha.site_key') && ! empty($value)) { + $rule = new RecaptchaRule; + $rule->validate($attribute, $value, $fail); + } + }, + ], + ]; + } + + /** + * Get custom messages for validation errors. + */ + public function messages(): array + { + return [ + 'subject.min' => 'The subject must be at least 3 characters long.', + 'message.min' => 'The message must be at least 10 characters long.', + 'email.required' => 'An email address is required.', + 'email.email' => 'Please enter a valid email address format (e.g., name@domain.com).', + 'subject.required' => 'A subject is required.', + 'message.required' => 'A message is required.', + ]; + } + + /** + * Check if text contains gibberish or random character patterns + */ + protected function containsGibberish(string $text): bool + { + // Allow common words and normal text + if (strlen($text) < 15) { + return false; // Don't check short text like "Hello" + } + + // Check for random character patterns (like "αχΥηΤrvnIbuQzoGkkbYqjEr") + // High ratio of consonants without vowels + $consonantRatio = preg_match_all('/[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]/', $text); + $vowelRatio = preg_match_all('/[aeiouAEIOU]/', $text); + + if (strlen($text) > 20 && $vowelRatio == 0) { + return true; + } + + if (strlen($text) > 15 && $consonantRatio / max(strlen($text), 1) > 0.85) { + return true; + } + + // Check for mixed scripts (Latin + Greek/Cyrillic like in spam) + $hasLatin = preg_match('/[a-zA-Z]/', $text); + $hasGreek = preg_match('/[\x{0370}-\x{03FF}]/u', $text); + $hasCyrillic = preg_match('/[\x{0400}-\x{04FF}]/u', $text); + + if (($hasLatin && $hasGreek) || ($hasLatin && $hasCyrillic)) { + return true; + } + + // Check for alternating case patterns (like "αχΥηΤrvnIbu") + if (preg_match('/([a-z][A-Z]){4,}|([A-Z][a-z]){4,}/', $text)) { + return true; + } + + // Check for sequences of random characters + if (preg_match('/[a-zA-Z]{20,}/', $text) && ! preg_match('/\s/', $text)) { + return true; + } + + return false; + } + + /** + * Check if email username contains gibberish patterns + */ + protected function isGibberishEmail(string $username): bool + { + // Allow common email patterns first + if (strlen($username) < 6) { + return false; // Allow short usernames like "john", "mary" + } + + // Check for too many consecutive consonants (like "jkdkfjdks") + if (preg_match('/[bcdfghjklmnpqrstvwxyz]{4,}/i', $username)) { + return true; + } + + // Check for alternating consonant patterns without vowels + $consonantCount = preg_match_all('/[bcdfghjklmnpqrstvwxyz]/i', $username); + $vowelCount = preg_match_all('/[aeiou]/i', $username); + + // If username is mostly consonants (>80%) and longer than 6 chars, likely gibberish + if (strlen($username) > 6 && $consonantCount > 0 && ($vowelCount / max($consonantCount, 1)) < 0.25) { + return true; + } + + // Check for patterns like repeated character groups "jkjk", "dkdk" + if (preg_match('/(.{2,3})\1{2,}/', $username)) { + return true; + } + + // Check for keyboard patterns like "qwerty", "asdf", etc. + $keyboardPatterns = [ + 'qwert', 'asdf', 'zxcv', 'uiop', 'hjkl', 'bnm', + 'poiu', 'lkjh', 'mnbv', 'rewq', 'fdsa', 'vcxz', + ]; + + foreach ($keyboardPatterns as $pattern) { + if (stripos($username, $pattern) !== false) { + return true; + } + } + + // Check for completely random character sequences + // If no vowels and more than 8 characters, likely random + if (strlen($username) > 8 && $vowelCount == 0) { + return true; + } + + return false; + } + + /** + * Handle a failed validation attempt. + */ + protected function failedValidation(Validator $validator): void + { + // Log suspicious attempts for monitoring + if ($this->containsSpamIndicators()) { + Log::warning('Potential spam attempt blocked on support bubble', [ + 'ip' => $this->ip(), + 'user_agent' => $this->userAgent(), + 'data' => $this->only(['email', 'subject', 'message']), + 'errors' => $validator->errors()->toArray(), + ]); + } + + parent::failedValidation($validator); + } + + /** + * Check if the request contains spam indicators + */ + protected function containsSpamIndicators(): bool + { + $email = $this->input('email', ''); + $subject = $this->input('subject', ''); + $message = $this->input('message', ''); + + // Check for the specific patterns seen in the spam + return $this->containsGibberish($subject) || + $this->containsGibberish($message) || + preg_match('/^[a-z0-9]{10,20}@gmail\.com$/i', $email); + } +} diff --git a/app/Http/Resources/AuthorResource.php b/app/Http/Resources/AuthorResource.php index 646a82a78..ed96439cf 100644 --- a/app/Http/Resources/AuthorResource.php +++ b/app/Http/Resources/AuthorResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class AuthorResource extends JsonResource @@ -9,7 +10,7 @@ class AuthorResource extends JsonResource /** * Transform the author resource into an array. * - * @param \Illuminate\Http\Request $request + * @param Request $request * @return array */ public function toArray($request): array @@ -25,9 +26,13 @@ public function toArray($request): array 'affiliation' => $this->affiliation, 'contributor_type' => $this->whenPivotLoaded('author_project', function () { return $this->pivot->contributor_type; + }) ?? $this->whenPivotLoaded('author_study', function () { + return $this->pivot->contributor_type; }), 'sort_order' => $this->whenPivotLoaded('author_project', function () { return $this->pivot->sort_order; + }) ?? $this->whenPivotLoaded('author_study', function () { + return $this->pivot->sort_order; }), 'created_at' => $this->created_at?->toISOString(), 'updated_at' => $this->updated_at?->toISOString(), diff --git a/app/Http/Resources/CitationResource.php b/app/Http/Resources/CitationResource.php index b52080b65..1c404c5b0 100644 --- a/app/Http/Resources/CitationResource.php +++ b/app/Http/Resources/CitationResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class CitationResource extends JsonResource @@ -9,7 +10,7 @@ class CitationResource extends JsonResource /** * Transform the citation resource into an array. * - * @param \Illuminate\Http\Request $request + * @param Request $request * @return array */ public function toArray($request): array diff --git a/app/Http/Resources/DatasetResource.php b/app/Http/Resources/DatasetResource.php index f43983eb8..40e9c85c3 100644 --- a/app/Http/Resources/DatasetResource.php +++ b/app/Http/Resources/DatasetResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class DatasetResource extends JsonResource @@ -23,8 +25,8 @@ public function lite(bool $lite, ?array $properties = []): self /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { diff --git a/app/Http/Resources/FileSystemObjectResource.php b/app/Http/Resources/FileSystemObjectResource.php index fce0a8e7d..c2e76698e 100644 --- a/app/Http/Resources/FileSystemObjectResource.php +++ b/app/Http/Resources/FileSystemObjectResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class FileSystemObjectResource extends JsonResource @@ -9,8 +11,8 @@ class FileSystemObjectResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { diff --git a/app/Http/Resources/LicenseResource.php b/app/Http/Resources/LicenseResource.php index 05d4e667b..c75e6ed91 100644 --- a/app/Http/Resources/LicenseResource.php +++ b/app/Http/Resources/LicenseResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class LicenseResource extends JsonResource @@ -9,8 +11,8 @@ class LicenseResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { diff --git a/app/Http/Resources/ProjectResource.php b/app/Http/Resources/ProjectResource.php index 793430c34..ae30e69f3 100644 --- a/app/Http/Resources/ProjectResource.php +++ b/app/Http/Resources/ProjectResource.php @@ -3,6 +3,8 @@ namespace App\Http\Resources; use App\Models\FileSystemObject; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class ProjectResource extends JsonResource @@ -24,8 +26,8 @@ public function lite(bool $lite, ?array $properties = []): self /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { diff --git a/app/Http/Resources/SampleResource.php b/app/Http/Resources/SampleResource.php index 46922821d..acd4ede8e 100644 --- a/app/Http/Resources/SampleResource.php +++ b/app/Http/Resources/SampleResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class SampleResource extends JsonResource @@ -9,8 +11,8 @@ class SampleResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { diff --git a/app/Http/Resources/StudyResource.php b/app/Http/Resources/StudyResource.php index 4aa2c4b40..1d05e3974 100644 --- a/app/Http/Resources/StudyResource.php +++ b/app/Http/Resources/StudyResource.php @@ -2,13 +2,15 @@ namespace App\Http\Resources; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class StudyResource extends JsonResource { private bool $lite = true; - private array $properties = ['sample', 'users', 'license']; + private array $properties = ['sample', 'users', 'license', 'authors']; public function lite(bool $lite, ?array $properties = []): self { @@ -23,8 +25,8 @@ public function lite(bool $lite, ?array $properties = []): self /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { @@ -33,7 +35,7 @@ public function toArray($request): array 'name' => $this->name, 'slug' => $this->slug, 'description' => $this->description, - 'molecules' => $this->sample->molecules, + 'molecules' => $this->sample ? $this->sample->molecules : [], 'team' => $this->when(! ($this->team && $this->team->personal_team), $this->team), 'photo_url' => $this->study_photo_url, 'tags' => $this->tags, @@ -112,6 +114,18 @@ function () { ), ]; }), + $this->mergeWhen(! $this->lite, function () { + return [ + $this->mergeWhen( + in_array('authors', $this->properties), + function () { + return [ + 'authors' => $this->studyAuthors ? AuthorResource::collection($this->studyAuthors) : [], + ]; + } + ), + ]; + }), ]; } } diff --git a/app/Http/Resources/TeamResource.php b/app/Http/Resources/TeamResource.php index fd1c38c6f..378aba3bc 100644 --- a/app/Http/Resources/TeamResource.php +++ b/app/Http/Resources/TeamResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class TeamResource extends JsonResource @@ -9,8 +11,8 @@ class TeamResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php index f1d59d26c..27ce26607 100644 --- a/app/Http/Resources/UserResource.php +++ b/app/Http/Resources/UserResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource @@ -9,8 +11,8 @@ class UserResource extends JsonResource /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable + * @param Request $request + * @return array|Arrayable|\JsonSerializable */ public function toArray($request): array { diff --git a/app/Jobs/ArchiveProject.php b/app/Jobs/ArchiveProject.php index a5a5bf54b..52c01387c 100644 --- a/app/Jobs/ArchiveProject.php +++ b/app/Jobs/ArchiveProject.php @@ -24,7 +24,7 @@ class ArchiveProject implements ShouldBeUnique, ShouldQueue /** * The project instance. * - * @var \App\Models\Project + * @var Project */ public $project; @@ -63,7 +63,7 @@ public function handle(): void $fsObject = new FileSystemObject; $fsObject->type = 'directory'; $fsObject->name = $project->slug; - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $fsObject->path = $environment.'/'.$project->uuid; $fsObject->key = $project->uuid; $fsObject->status = 'present'; @@ -73,11 +73,11 @@ public function handle(): void if ($fsObject && $fsObject->status != 'missing') { $path = $fsObject->path; $s3Client = $this->storageClient(); - $bucket = config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.bucket'); + $bucket = config('filesystems.disks.'.config('filesystems.default').'.bucket'); $s3keys = []; - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); if ($fsObject->type == 'file') { - if (Storage::disk(env('FILESYSTEM_DRIVER'))->exists($path)) { + if (Storage::disk(config('filesystems.default'))->exists($path)) { array_push($s3keys, substr($fsObject->path, 1)); } } else { @@ -163,8 +163,8 @@ public function handle(): void $zip->finish(); fclose($archiveDestination); - Storage::disk(env('FILESYSTEM_DRIVER'))->setVisibility($zipFilePath, 'public'); - $url = Storage::disk(env('FILESYSTEM_DRIVER'))->url($zipFilePath); + Storage::disk(config('filesystems.default'))->setVisibility($zipFilePath, 'public'); + $url = Storage::disk(config('filesystems.default'))->url($zipFilePath); $project->download_url = $url; $project->internal_status = 'complete'; $project->save(); @@ -181,19 +181,20 @@ public function handle(): void /** * Get the S3 storage client instance. * - * @return \Aws\S3\S3Client + * @return S3Client */ protected function storageClient() { + $diskName = config('filesystems.default'); $config = [ - 'region' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.region'), + 'region' => config('filesystems.disks.'.$diskName.'.region'), 'version' => 'latest', 'use_path_style_endpoint' => true, - 'url' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.endpoint'), - 'endpoint' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.endpoint'), + 'url' => config('filesystems.disks.'.$diskName.'.endpoint'), + 'endpoint' => config('filesystems.disks.'.$diskName.'.endpoint'), 'credentials' => [ - 'key' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.key'), - 'secret' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.secret'), + 'key' => config('filesystems.disks.'.$diskName.'.key'), + 'secret' => config('filesystems.disks.'.$diskName.'.secret'), ], ]; diff --git a/app/Jobs/ArchiveStudy.php b/app/Jobs/ArchiveStudy.php index 7cb918a86..5982c4715 100644 --- a/app/Jobs/ArchiveStudy.php +++ b/app/Jobs/ArchiveStudy.php @@ -24,7 +24,7 @@ class ArchiveStudy implements ShouldBeUnique, ShouldQueue /** * The project instance. * - * @var \App\Models\Project + * @var Project */ public $project; @@ -84,7 +84,7 @@ public function handle(): void Log::info("Study {$study->id}: Using filesystem driver: {$filesystemDriver}, bucket: {$bucket}"); $s3keys = []; - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $relative_URL = $fsObject->relative_url; if ($fsObject->type == 'file') { Log::info("Study {$study->id}: Processing single file"); @@ -298,7 +298,7 @@ private function generateS3Url(string $filePath, string $filesystemDriver, strin // protected function standardizeMolecule($mol) // { - // $response = Http::post('https://api.cheminf.studio/latest/chem/standardize', $mol); + // $response = Http::post(config('services.chemistry_standardize.url'), $mol); // return $response->json(); // } @@ -318,19 +318,20 @@ private function generateS3Url(string $filePath, string $filesystemDriver, strin /** * Get the S3 storage client instance. * - * @return \Aws\S3\S3Client + * @return S3Client */ protected function storageClient() { + $diskName = config('filesystems.default'); $config = [ - 'region' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.region'), + 'region' => config('filesystems.disks.'.$diskName.'.region'), 'version' => 'latest', 'use_path_style_endpoint' => true, - 'url' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.endpoint'), - 'endpoint' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.endpoint'), + 'url' => config('filesystems.disks.'.$diskName.'.endpoint'), + 'endpoint' => config('filesystems.disks.'.$diskName.'.endpoint'), 'credentials' => [ - 'key' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.key'), - 'secret' => config('filesystems.disks.'.env('FILESYSTEM_DRIVER').'.secret'), + 'key' => config('filesystems.disks.'.$diskName.'.key'), + 'secret' => config('filesystems.disks.'.$diskName.'.secret'), ], ]; diff --git a/app/Jobs/DataBackupJob.php b/app/Jobs/DataBackupJob.php index bf6610da3..a612674a3 100644 --- a/app/Jobs/DataBackupJob.php +++ b/app/Jobs/DataBackupJob.php @@ -30,9 +30,9 @@ public function handle(): void Artisan::call('backup:run --only-db'); // Define the bucket name and prefix. - $bucket = env('AWS_BUCKET'); - $prefix = env('APP_ENV').'/database'; - $disk = Storage::disk(env('FILESYSTEM_DRIVER')); + $bucket = config('filesystems.disks.ceph.bucket'); + $prefix = config('app.env').'/database'; + $disk = Storage::disk(config('filesystems.default')); // Get the contents of the bucket with the specified prefix. $contents = $disk->listContents($prefix, false); @@ -46,9 +46,9 @@ public function handle(): void // Set the visibility to public $disk->setVisibility($latestFile['path'], 'public'); - } - // Print the URL of the latest file. - echo 'Download the file from URL '.$latestFile['path']; + // Print the URL of the latest file. + echo 'Download the file from URL '.$latestFile['path']; + } } } diff --git a/app/Jobs/DeleteProjects.php b/app/Jobs/DeleteProjects.php index 18da96375..5855aeae3 100644 --- a/app/Jobs/DeleteProjects.php +++ b/app/Jobs/DeleteProjects.php @@ -18,7 +18,7 @@ class DeleteProjects implements ShouldQueue /** * The project instance. * - * @var \App\Models\Project + * @var Project */ private $project; @@ -40,9 +40,9 @@ public function handle(DeleteProject $deleteProject): void $project = $this->project; $deletedOn = $project->deleted_on; $diffInDays = null; - $coolOffPeriod = (int) env('COOL_OFF_PERIOD', '30'); + $coolOffPeriod = config('nmrxiv.cool_off_period'); if ($deletedOn) { - $diffInDays = Carbon::parse($deletedOn)->diffInDays(Carbon::now()); + $diffInDays = (int) Carbon::parse($deletedOn)->diffInDays(Carbon::now()); // Sending reminder to user 1 week and 1 day before. if ($diffInDays == ($coolOffPeriod - 7) || $diffInDays == ($coolOffPeriod - 1)) { $project->sendNotification('deletionReminder', $this->prepareSendList($project)); diff --git a/app/Jobs/ProcessDraftELNSubmission.php b/app/Jobs/ProcessDraftELNSubmission.php index 5c2b0b221..50182fd86 100644 --- a/app/Jobs/ProcessDraftELNSubmission.php +++ b/app/Jobs/ProcessDraftELNSubmission.php @@ -2,15 +2,16 @@ namespace App\Jobs; +use App\Actions\Author\SyncProjectAuthors; use App\Actions\Draft\DraftProcessingLogger; use App\Actions\Draft\ProcessDraft; use App\Http\Controllers\FileSystemController; +use App\Models\Author; use App\Models\Draft; use App\Models\FileSystemObject; use App\Models\License; use App\Models\Molecule; use App\Models\Sample; -use App\Services\AuthorService; use App\Services\ChemotionRepositoryTrackerService; use App\Services\ELNMetadataServiceFactory; use App\Services\FileSystemObjectService; @@ -54,7 +55,8 @@ public function handle( try { $logger->log($draft, 'info', 'Starting ELN submission processing'); - if (strtolower($draft->eln) !== 'chemotion') { + // Check if ELN is supported + if (! in_array(strtolower($draft->eln), ['chemotion', 'nobs'])) { $logger->log($draft, 'info', "ELN not supported: {$draft->eln}"); return; @@ -364,47 +366,89 @@ private function attachMetadataToStudy($project, array $studyMetadata, DraftProc }) ->first(); + // If no direct match found, try to find studies within the sample folder + $studiesInSample = collect(); if (! $study) { - $logger->log($project->draft, 'error', 'Study not found: '.$studyName); + $logger->log($project->draft, 'info', 'Direct study not found. Looking for studies within sample folder: '.$studyName); + + // Find all studies whose name starts with the analysis folders in this sample + // The folder structure is: sample_X/analysis_Y/dataset_Z + // Studies are created with names like "dataset_Z" + $folderName = $studyMetadata['folderName'] ?? $studyName; + + // Get analysis IDs from the metadata datasets + $analysisIds = []; + if (isset($studyMetadata['chemical_substance']['datasets'])) { + foreach ($studyMetadata['chemical_substance']['datasets'] as $dataset) { + if (isset($dataset['analyses'])) { + $analysisIds[] = $dataset['analyses']; + } + if (isset($dataset['datasets']) && is_array($dataset['datasets'])) { + foreach ($dataset['datasets'] as $datasetId) { + $studiesInSample->push($project->studies()->where('name', $datasetId)->first()); + } + } + } + } - return; + $studiesInSample = $studiesInSample->filter(); + + if ($studiesInSample->isEmpty()) { + $logger->log($project->draft, 'error', 'No studies found for sample folder: '.$studyName); + + return; + } + + $logger->log($project->draft, 'info', 'Found '.$studiesInSample->count().' studies in sample folder'); + } else { + $studiesInSample = collect([$study]); } - // Get the draft to access processing logs - $draft = $project->draft; - $processingLogs = $draft ? $draft->process_logs : []; + // Process metadata for each study in the sample + foreach ($studiesInSample as $study) { + if (! $study) { + continue; + } - $study->update([ - 'name' => $studyMetadata['name'].' ('.$studyName.')', - 'external_url' => $studyMetadata['url'], - 'tracking_item_name' => $studyMetadata['tracking_item_name'], - 'processing_logs' => $processingLogs, - ]); + // Get the draft to access processing logs + $draft = $project->draft; + $processingLogs = $draft ? $draft->process_logs : []; - // update STATUS_PROCESSED in Chemotion Repository Tracker - $trackerService = app(ChemotionRepositoryTrackerService::class); - $trackerService->updateElnSubmissionStatus( - submissionId: $study->tracking_item_name, - newStatus: ChemotionRepositoryTrackerService::STATUS_PROCESSED, - additionalMetadata: $studyMetadata, - ownerName: $study->owner->first_name.' '.$study->owner->last_name, - ownerEmail: $study->owner->email - ); + $study->update([ + 'name' => $studyMetadata['name'].' ('.$study->name.')', + 'external_url' => $studyMetadata['url'], + 'tracking_item_name' => $studyMetadata['tracking_item_name'], + 'processing_logs' => $processingLogs, + ]); - $logger->log($project->draft, 'info', 'Attaching metadata to study: '.$study->name); + $logger->log($project->draft, 'info', 'Attaching metadata to study: '.$study->name); - $this->updateStudyDescription($study, $studyMetadata, $logger); + $this->updateStudyDescription($study, $studyMetadata, $logger); - $this->attachLicenseToStudy($study, $studyMetadata, $logger); + $this->attachLicenseToStudy($study, $studyMetadata, $logger); - $this->attachKeywordsToStudy($study, $studyMetadata, $logger); + $this->attachKeywordsToStudy($study, $studyMetadata, $logger); - $this->attachAuthorsToStudy($study, $studyMetadata['authors'], $logger); + $this->attachAuthorsToStudy($study, $studyMetadata['authors'], $logger); - // $this->attachCitationsToStudy($study, $studyMetadata['citation'] ?? [], $logger); + $this->attachCitationsToStudy($study, $studyMetadata['citation'] ?? [], $logger); - if (isset($studyMetadata['chemical_substance']['molecule'])) { - $this->attachMoleculesToStudy($study, [$studyMetadata['chemical_substance']['molecule']], $logger); + if (isset($studyMetadata['chemical_substance']['molecule'])) { + $this->attachMoleculesToStudy($study, [$studyMetadata['chemical_substance']['molecule']], $logger); + } + } + + // update STATUS_PROCESSED in Chemotion Repository Tracker (only once for the first study) + if ($studiesInSample->isNotEmpty()) { + $firstStudy = $studiesInSample->first(); + $trackerService = app(ChemotionRepositoryTrackerService::class); + $trackerService->updateElnSubmissionStatus( + submissionId: $firstStudy->tracking_item_name, + newStatus: ChemotionRepositoryTrackerService::STATUS_PROCESSED, + additionalMetadata: $studyMetadata, + ownerName: $firstStudy->owner->first_name.' '.$firstStudy->owner->last_name, + ownerEmail: $firstStudy->owner->email + ); } } catch (\Exception $e) { @@ -450,8 +494,11 @@ private function attachAuthorsToStudy($study, array $authors, DraftProcessingLog } if (! empty($authorData)) { - $authorService = app(AuthorService::class); - $authorService->syncAuthors($project, $authorData); + // Sync authors to project + app(SyncProjectAuthors::class)->handle($project, $authorData); + + // Also sync authors directly to the study for independent studies + $this->syncStudyAuthors($study, $authorData, $logger); } } catch (\Exception $e) { @@ -459,31 +506,75 @@ private function attachAuthorsToStudy($study, array $authors, DraftProcessingLog } } + /** + * Sync authors to study. + */ + private function syncStudyAuthors($study, array $authorData, DraftProcessingLogger $logger): void + { + try { + $authorIds = []; + + foreach ($authorData as $index => $data) { + // Find existing author by ORCID or name + $author = null; + + if (! empty($data['orcid_id'])) { + $author = Author::where('orcid_id', $data['orcid_id'])->first(); + } + + if (! $author) { + $author = Author::where('given_name', $data['given_name']) + ->where('family_name', $data['family_name']) + ->first(); + } + + // Create if not found + if (! $author) { + $author = Author::create([ + 'given_name' => $data['given_name'], + 'family_name' => $data['family_name'], + 'email_id' => $data['email_id'], + 'orcid_id' => $data['orcid_id'], + 'affiliation' => $data['affiliation'], + ]); + } + + $authorIds[$author->id] = [ + 'contributor_type' => $data['contributor_type'], + 'sort_order' => $index + 1, + ]; + } + + // Sync authors to study + $study->studyAuthors()->sync($authorIds); + + $logger->log($study->project->draft, 'info', 'Synced '.count($authorIds).' authors to study: '.$study->name); + + } catch (\Exception $e) { + $logger->log($study->project->draft, 'error', 'Failed to sync authors to study: '.$e->getMessage()); + } + } + /** * Attach citations to study. */ - private function attachCitationsToStudy($study, array $citations): void + private function attachCitationsToStudy($study, array $citations, DraftProcessingLogger $logger): void { if (empty($citations)) { + $logger->log($study->project->draft, 'info', 'No citations found for study: '.$study->name); + return; } try { - // Store citations as JSON in study metadata $study->update([ - 'citations' => json_encode($citations), + 'citations' => $citations, ]); - Log::info('Attached citations to study', [ - 'study_id' => $study->id, - 'citations_count' => count($citations), - ]); + $logger->log($study->project->draft, 'info', 'Attached '.count($citations).' citations to study: '.$study->name); } catch (\Exception $e) { - Log::error('Failed to attach citations to study', [ - 'study_id' => $study->id, - 'error' => $e->getMessage(), - ]); + $logger->log($study->project->draft, 'error', 'Failed to attach citations to study: '.$e->getMessage()); } } diff --git a/app/Jobs/ProcessMetadataExtractionBagitGenerationJob.php b/app/Jobs/ProcessMetadataExtractionBagitGenerationJob.php new file mode 100644 index 000000000..d71c923e2 --- /dev/null +++ b/app/Jobs/ProcessMetadataExtractionBagitGenerationJob.php @@ -0,0 +1,475 @@ +tries = config('nmrxiv.spectra_parsing.job_tries', 3); + $this->timeout = config('nmrxiv.spectra_parsing.job_timeout', 600); + $this->retries = config('nmrxiv.spectra_parsing.retry_count', 3); + } + + /** + * Execute the job. + */ + public function handle(): void + { + try { + $study = Study::with('datasets')->find($this->studyId); + + if (! $study) { + throw new \Exception("Study {$this->studyId} not found"); + } + + // Mark as processing + $study->update([ + 'metadata_bagit_generation_status' => 'processing', + 'metadata_bagit_generation_logs' => array_merge((array) ($study->metadata_bagit_generation_logs ?: []), [ + 'started_at' => now()->toIso8601String(), + ]), + ]); + + Log::info("Processing metadata extraction for study {$study->id} ({$study->identifier})"); + + // Process the study with BagIt structure + $result = $this->processStudy($study); + + // Mark as completed with metadata + $study->update([ + 'metadata_bagit_generation_status' => 'completed', + 'metadata_bagit_generation_logs' => array_merge((array) ($study->metadata_bagit_generation_logs ?: []), [ + 'completed_at' => now()->toIso8601String(), + 'storage_path' => $result['location'], + 'image_count' => $result['imageCount'], + ]), + ]); + + Log::info("Successfully processed study {$study->id} ({$study->identifier}): {$result['imageCount']} images saved to {$result['location']}"); + } catch (\Exception $e) { + Log::error("Failed to process study {$this->studyId}: {$e->getMessage()}"); + + // Mark as failed with error message + $study = Study::find($this->studyId); + if ($study) { + $study->update([ + 'metadata_bagit_generation_status' => 'failed', + 'metadata_bagit_generation_logs' => array_merge((array) ($study->metadata_bagit_generation_logs ?: []), [ + 'failed_at' => now()->toIso8601String(), + 'error_message' => $e->getMessage(), + ]), + ]); + } + + // Don't rethrow - let the job complete so it doesn't retry infinitely + } + } + + /** + * Process a single study with BagIt structure. + */ + protected function processStudy(Study $study): array + { + // Remove NMRXIV: prefix if present (e.g., "NMRXIV:S1295" -> "S1295") + $studyIdentifier = str_replace('NMRXIV:', '', $study->identifier); + $disk = Storage::disk(config('nmrxiv.spectra_parsing.storage_disk', 'local')); + $basePath = config('nmrxiv.spectra_parsing.storage_path', 'spectra_parse'); + $baseDir = "{$basePath}/{$studyIdentifier}"; + $dataDir = "{$baseDir}/data"; + $zipPath = null; + + try { + // Step 1: Download ZIP file + Log::info("Step 1/7: Downloading ZIP file for study {$study->id}"); + $zipPath = $this->downloadWithRetry($study->download_url, $this->retries); + + // Step 2: Extract ZIP to data directory + Log::info('Step 2/7: Extracting ZIP archive...'); + $studyName = $this->extractZip($zipPath, $disk->path($dataDir)); + + // Step 3: Call NMRKit API + Log::info('Step 3/7: Calling NMRKit API...'); + $jsonData = $this->callNMRKitAPI($study->download_url, $this->retries); + + // Step 4: Fetch Bio-Schema + Log::info('Step 4/7: Fetching bio-schema...'); + $bioSchema = null; + try { + $bioSchema = $this->fetchBioSchema($studyIdentifier, $this->retries); + } catch (\Exception $e) { + Log::warning("Bio-schema fetch failed: {$e->getMessage()}. Continuing without bio-schema..."); + } + + // Step 5: Create nmrxiv-meta structure + Log::info('Step 5/7: Creating nmrxiv-meta structure...'); + $metaDir = "{$dataDir}/{$studyName}/nmrxiv-meta"; + $imagesDir = "{$metaDir}/images"; + + if (! $disk->exists($metaDir)) { + $disk->makeDirectory($metaDir, 0755, true); + } + + // Clean up old images directory to prevent duplicates from previous runs + if ($disk->exists($imagesDir)) { + // Delete all PNG files in the images directory + $oldImages = $disk->files($imagesDir); + foreach ($oldImages as $oldImage) { + $disk->delete($oldImage); + } + Log::info('Cleaned up '.count($oldImages).' old image files'); + } else { + $disk->makeDirectory($imagesDir, 0755, true); + } + + // Clean up spectra data + if (isset($jsonData['data']['spectra']) && is_array($jsonData['data']['spectra'])) { + foreach ($jsonData['data']['spectra'] as &$spectra) { + unset($spectra['data']); + unset($spectra['meta']); + unset($spectra['originalData']); + unset($spectra['originalInfo']); + } + unset($spectra); + } + + // Extract and save images as PNG files + $imageCount = 0; + if (isset($jsonData['images']) && is_array($jsonData['images'])) { + foreach ($jsonData['images'] as $imageData) { + if (isset($imageData['id']) && isset($imageData['image'])) { + $imageId = $imageData['id']; + $base64Data = $imageData['image']; + + // Save PNG file + $pngPath = "{$imagesDir}/{$imageId}.png"; + $this->savePNGFromBase64($base64Data, $disk->path($pngPath)); + $imageCount++; + } + } + } + + // Save S{identifier}.nmrium (full API response with base64 images intact) + $nmriumPath = "{$metaDir}/{$studyIdentifier}.nmrium"; + $formattedJson = json_encode($jsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $disk->put($nmriumPath, $formattedJson); + + // Save bio-schema.json + if ($bioSchema !== null) { + $bioSchemaPath = "{$metaDir}/bio-schema.json"; + $bioSchemaJson = json_encode($bioSchema, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $disk->put($bioSchemaPath, $bioSchemaJson); + } + + // Step 6: Generate BagIt manifests + Log::info('Step 6/7: Generating BagIt manifests...'); + $this->generateBagItManifests($disk->path($baseDir)); + + return [ + 'imageCount' => $imageCount, + 'location' => $disk->path($baseDir), + ]; + } finally { + // Step 7: Cleanup temporary files (always runs, even on exception) + if ($zipPath && file_exists($zipPath)) { + Log::info('Step 7/7: Cleaning up temporary ZIP file...'); + @unlink($zipPath); + } + } + } + + /** + * Download file with retry logic. + */ + protected function downloadWithRetry(string $url, int $retries): string + { + $attempt = 0; + $lastException = null; + + while ($attempt < $retries) { + try { + $attempt++; + Log::debug("Download attempt {$attempt}/{$retries}..."); + + $tempPath = storage_path('app/temp_'.uniqid().'.zip'); + $timeout = config('nmrxiv.spectra_parsing.download_timeout', 300); + $response = Http::timeout($timeout)->get($url); + + if (! $response->successful()) { + throw new \Exception("Download failed with status {$response->status()}"); + } + + file_put_contents($tempPath, $response->body()); + + return $tempPath; + } catch (\Exception $e) { + $lastException = $e; + if ($attempt < $retries) { + Log::warning("Download failed: {$e->getMessage()}. Retrying..."); + sleep(2); + } + } + } + + throw new \Exception("Download failed after {$retries} attempts: ".$lastException->getMessage()); + } + + /** + * Extract ZIP file and return the study name. + */ + protected function extractZip(string $zipPath, string $extractTo): string + { + $zip = new ZipArchive; + + if ($zip->open($zipPath) !== true) { + throw new \Exception("Failed to open ZIP file: {$zipPath}"); + } + + // Get the root folder name from first entry + $studyName = null; + if ($zip->numFiles > 0) { + $firstEntry = $zip->getNameIndex(0); + $parts = explode('/', $firstEntry); + $studyName = $parts[0]; + } + + if (! $studyName) { + throw new \Exception('Could not determine study name from ZIP'); + } + + // Extract all files + $zip->extractTo($extractTo); + $zip->close(); + + return $studyName; + } + + /** + * Call NMRKit API with retry logic. + */ + protected function callNMRKitAPI(string $url, int $retries): array + { + $attempt = 0; + $lastException = null; + + while ($attempt < $retries) { + try { + $attempt++; + Log::debug("NMRKit API attempt {$attempt}/{$retries}..."); + + $timeout = config('nmrxiv.spectra_parsing.api_timeout', 300); + $apiUrl = config('nmrxiv.spectra_parsing.nmrkit_api_url'); + + $response = Http::timeout($timeout) + ->post($apiUrl, [ + 'url' => $url, + 'capture_snapshot' => true, + 'auto_processing' => true, + 'auto_detection' => true, + ]); + + if (! $response->successful()) { + throw new \Exception("API request failed with status {$response->status()}: {$response->body()}"); + } + + return $response->json(); + } catch (\Exception $e) { + $lastException = $e; + if ($attempt < $retries) { + Log::warning("API call failed: {$e->getMessage()}. Retrying..."); + sleep(2); + } + } + } + + throw new \Exception("API call failed after {$retries} attempts: ".$lastException->getMessage()); + } + + /** + * Fetch bio-schema from nmrxiv.org API with retry logic. + */ + protected function fetchBioSchema(string $studyIdentifier, int $retries): array + { + $attempt = 0; + $lastException = null; + $baseUrl = config('nmrxiv.spectra_parsing.bioschema_api_url'); + $url = "{$baseUrl}/{$studyIdentifier}"; + + while ($attempt < $retries) { + try { + $attempt++; + Log::debug("Bio-schema attempt {$attempt}/{$retries}..."); + + $response = Http::timeout(60)->get($url); + + if (! $response->successful()) { + throw new \Exception("Bio-schema request failed with status {$response->status()}"); + } + + return $response->json(); + } catch (\Exception $e) { + $lastException = $e; + if ($attempt < $retries) { + Log::warning("Bio-schema fetch failed: {$e->getMessage()}. Retrying..."); + sleep(2); + } + } + } + + throw new \Exception("Bio-schema fetch failed after {$retries} attempts: ".$lastException->getMessage()); + } + + /** + * Save PNG image from base64 data. + */ + protected function savePNGFromBase64(string $base64Data, string $outputPath): void + { + // Remove data:image/png;base64, prefix if present + $base64Data = preg_replace('/^data:image\/[a-z]+;base64,/', '', $base64Data); + + $imageData = base64_decode($base64Data); + + if ($imageData === false) { + throw new \Exception('Failed to decode base64 image data'); + } + + file_put_contents($outputPath, $imageData); + } + + /** + * Generate BagIt manifests using whikloj/BagItTools library. + */ + protected function generateBagItManifests(string $bagPath): void + { + try { + // Create bag using BagItTools library + $bag = Bag::create($bagPath); + + // Update bag with checksums + $bag->update(); + + // Package the bag (this generates manifests) + $bag->package($bagPath); + + Log::debug('Used BagItTools library for manifest generation'); + } catch (\Exception $e) { + Log::warning("BagIt library failed: {$e->getMessage()}. Falling back to manual generation..."); + + // Fallback: Generate manually + $this->generateBagItManually($bagPath); + } + } + + /** + * Manually generate BagIt manifests. + */ + protected function generateBagItManually(string $bagPath): void + { + // Create bagit.txt + $bagitContent = "BagIt-Version: 1.0\nTag-File-Character-Encoding: UTF-8\n"; + file_put_contents($bagPath.'/bagit.txt', $bagitContent); + + // Create manifest-sha256.txt + $manifestLines = []; + $dataPath = $bagPath.'/data'; + + if (is_dir($dataPath)) { + $files = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dataPath), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($files as $file) { + if ($file->isFile()) { + $relativePath = str_replace($bagPath.'/', '', $file->getPathname()); + $hash = hash_file('sha256', $file->getPathname()); + $manifestLines[] = "{$hash} {$relativePath}"; + } + } + } + + file_put_contents($bagPath.'/manifest-sha256.txt', implode("\n", $manifestLines)."\n"); + + // Create bag-info.txt + $bagInfoContent = 'Payload-Oxum: '.$this->calculatePayloadOxum($dataPath)."\n"; + $bagInfoContent .= 'Bagging-Date: '.date('Y-m-d')."\n"; + $bagInfoContent .= "Bag-Software-Agent: Laravel-Queue-ProcessStudySpectraJob/1.0\n"; + file_put_contents($bagPath.'/bag-info.txt', $bagInfoContent); + + // Create tagmanifest-sha256.txt + $tagManifestLines = []; + foreach (['bagit.txt', 'bag-info.txt', 'manifest-sha256.txt'] as $tagFile) { + $tagFilePath = $bagPath.'/'.$tagFile; + if (file_exists($tagFilePath)) { + $hash = hash_file('sha256', $tagFilePath); + $tagManifestLines[] = "{$hash} {$tagFile}"; + } + } + file_put_contents($bagPath.'/tagmanifest-sha256.txt', implode("\n", $tagManifestLines)."\n"); + + Log::debug('Manual BagIt generation complete'); + } + + /** + * Calculate Payload-Oxum (total bytes.total files). + */ + protected function calculatePayloadOxum(string $dataPath): string + { + $totalBytes = 0; + $totalFiles = 0; + + if (is_dir($dataPath)) { + $files = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dataPath), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($files as $file) { + if ($file->isFile()) { + $totalBytes += $file->getSize(); + $totalFiles++; + } + } + } + + return "{$totalBytes}.{$totalFiles}"; + } +} diff --git a/app/Jobs/ProcessProject.php b/app/Jobs/ProcessProject.php index 960f6da14..3f3a98b8c 100644 --- a/app/Jobs/ProcessProject.php +++ b/app/Jobs/ProcessProject.php @@ -27,7 +27,7 @@ class ProcessProject implements ShouldBeUnique, ShouldQueue /** * The project instance. * - * @var \App\Models\Project + * @var Project */ public $project; @@ -58,7 +58,7 @@ public function handle(AssignIdentifier $assigner, UpdateDOI $updater, PublishPr $draft = $project->draft; if ($draft) { - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $projectPath = preg_replace( '~//+~', @@ -128,7 +128,7 @@ public function moveFolder($fsObject, $draft, $path) $path, $fsObjectChild->path ); - Storage::disk(env('FILESYSTEM_DRIVER'))->move($fsObjectChild->path, $newPath); + Storage::disk(config('filesystems.default'))->move($fsObjectChild->path, $newPath); $fsObjectChild->path = $newPath; $fsObjectChild->save(); } else { diff --git a/app/Jobs/ProcessProjectSpectra.php b/app/Jobs/ProcessProjectSpectra.php deleted file mode 100644 index 7c73d8b8b..000000000 --- a/app/Jobs/ProcessProjectSpectra.php +++ /dev/null @@ -1,303 +0,0 @@ -projectId); - - if (! $project) { - Log::error("Project not found: {$this->projectId}"); - - return; - } - - try { - Log::info("Starting spectra processing for project: {$project->identifier}"); - - $this->processProjectStudies($project); - - Log::info("Successfully completed spectra processing for project: {$project->identifier}"); - - } catch (Exception $e) { - Log::error("Failed to process spectra for project {$project->identifier}: ".$e->getMessage()); - throw $e; - } - } - - /** - * Process all studies in the project. - */ - private function processProjectStudies(Project $project): void - { - $studies = $project->studies; - - foreach ($studies as $study) { - Log::info("Processing study: {$study->identifier}"); - - try { - // Process study-level NMRium data - $this->processStudySpectra($study); - - // Process dataset-level NMRium data - $this->processStudyDatasets($study->fresh()); - - } catch (Exception $e) { - Log::error("Failed to process study {$study->identifier}: ".$e->getMessage()); - - // Continue with other studies instead of failing the entire job - continue; - } - } - } - - /** - * Process spectra for a single study. - */ - private function processStudySpectra($study): void - { - if ($study->has_nmrium) { - return; // Already processed - } - - DB::transaction(function () use ($study) { - $downloadUrl = $study->download_url; - - if (! $downloadUrl) { - Log::warning("No download URL found for study: {$study->identifier}"); - - return; - } - - $nmriumData = $this->processSpectra($downloadUrl); - - if (! $nmriumData || ! isset($nmriumData['data'])) { - Log::warning("No valid spectra data returned for study: {$study->identifier}"); - - return; - } - - $parsedSpectra = $nmriumData['data']; - - // Clean up spectra data - foreach ($parsedSpectra['spectra'] as &$spectra) { - unset($spectra['data']); - unset($spectra['meta']); - unset($spectra['originalData']); - unset($spectra['originalInfo']); - } - - $version = $parsedSpectra['version'] ?? null; - unset($parsedSpectra['version']); - - $nmriumJSON = [ - 'data' => $parsedSpectra, - 'version' => $version, - ]; - - // Create or update NMRium record - $nmrium = $study->nmrium; - - if ($nmrium) { - $nmrium->nmrium_info = json_encode($nmriumJSON, JSON_UNESCAPED_UNICODE); - $nmrium->save(); - } else { - $nmrium = NMRium::create([ - 'nmrium_info' => json_encode($nmriumJSON, JSON_UNESCAPED_UNICODE), - ]); - $study->nmrium()->save($nmrium); - } - - $study->has_nmrium = true; - $study->save(); - - Log::info("Successfully processed study spectra: {$study->identifier}"); - }); - } - - /** - * Process datasets for a study. - */ - private function processStudyDatasets($study): void - { - if (! $study->has_nmrium) { - Log::warning("Study {$study->identifier} has no NMRium data, skipping datasets"); - - return; - } - - $nmriumInfo = json_decode($study->nmrium->nmrium_info, true); - - if (! isset($nmriumInfo['data']['spectra']) || count($nmriumInfo['data']['spectra']) == 0) { - Log::warning("Study {$study->identifier} has no spectra info, skipping datasets"); - - return; - } - - foreach ($study->datasets as $dataset) { - if ($dataset->has_nmrium) { - continue; // Already processed - } - - try { - $this->processDatasetSpectra($dataset, $study, $nmriumInfo); - } catch (Exception $e) { - Log::error("Failed to process dataset {$dataset->identifier}: ".$e->getMessage()); - - continue; - } - } - } - - /** - * Process spectra for a single dataset. - */ - private function processDatasetSpectra($dataset, $study, $nmriumInfo): void - { - $nmriumJSON = $nmriumInfo; - $fsObject = $dataset->fsObject; - $studyFSObject = $study->fsObject; - $datasetFSObject = $dataset->fsObject; - $draft = $study->draft; - - // Determine path based on ELN type - if ($draft && $draft->eln == 'chemotion') { - $path = '/'.$studyFSObject->name.'/'.$datasetFSObject->parent->name.'/'.$datasetFSObject->name; - } else { - $path = '/'.$studyFSObject->name.'/'.$datasetFSObject->name; - } - - $fType = $studyFSObject->type; - $matchingSpectra = []; - $types = []; - - // Find matching spectra for this dataset - foreach ($nmriumInfo['data']['spectra'] as $spectra) { - if ($this->spectraMatchesDataset($spectra, $path, $fType)) { - $matchingSpectra[] = $spectra; - $types[] = $this->extractSpectraType($spectra); - } - } - - if (count($matchingSpectra) > 0) { - // Create dataset-specific NMRium data - unset($nmriumJSON['data']['spectra']); - $nmriumJSON['data']['spectra'] = $matchingSpectra; - - // Create or update NMRium record for dataset - $nmrium = $dataset->nmrium; - - if ($nmrium) { - $nmrium->nmrium_info = json_encode($nmriumJSON, JSON_UNESCAPED_UNICODE); - $nmrium->save(); - } else { - $nmrium = NMRium::create([ - 'nmrium_info' => json_encode($nmriumJSON, JSON_UNESCAPED_UNICODE), - ]); - $dataset->nmrium()->save($nmrium); - } - - $dataset->has_nmrium = true; - - Log::info("Successfully processed dataset spectra: {$dataset->identifier}"); - } else { - Log::info("No matching spectra found for dataset: {$dataset->identifier}"); - } - - // Always update dataset type if unique (regardless of whether spectra were found) - $uniqueTypes = array_unique(array_filter($types)); - if (count($uniqueTypes) == 1) { - $dataset->type = $uniqueTypes[0]; - } - - $dataset->save(); - } - - /** - * Check if spectra matches the dataset path. - */ - private function spectraMatchesDataset($spectra, string $path, string $fType): bool - { - $files = $spectra['sourceSelector']['files'] ?? []; - - if (! $files) { - return false; - } - - foreach ($files as $file) { - $searchPath = $fType == 'file' ? $path : $path.'/'; - if (str_contains($file, $searchPath)) { - return true; - } - } - - return false; - } - - /** - * Extract spectra type from spectra info. - */ - private function extractSpectraType($spectra): ?string - { - if (! isset($spectra['info']['experiment'])) { - return null; - } - - $experiment = $spectra['info']['experiment']; - $nucleus = $spectra['info']['nucleus'] ?? null; - - if (is_array($nucleus)) { - $nucleus = implode('-', $nucleus); - } - - return $nucleus ? "{$experiment} - {$nucleus}" : $experiment; - } - - /** - * Process spectra using external service. - */ - private function processSpectra(string $url): ?array - { - try { - $encodedUrl = urlencode($url); - - $response = Http::timeout(300)->post('https://nodejs.nmrxiv.org/spectra-parser', [ - 'urls' => [$encodedUrl], - 'snapshot' => false, - ]); - - if (! $response->successful()) { - Log::error('Spectra processing service returned error: '.$response->status()); - - return null; - } - - return $response->json(); - - } catch (Exception $e) { - Log::error("Failed to process spectra from URL {$url}: ".$e->getMessage()); - - return null; - } - } -} diff --git a/app/Jobs/ProcessSubmission.php b/app/Jobs/ProcessSubmission.php index 160b5f894..44653dcc9 100644 --- a/app/Jobs/ProcessSubmission.php +++ b/app/Jobs/ProcessSubmission.php @@ -27,7 +27,7 @@ class ProcessSubmission implements ShouldBeUnique, ShouldQueue /** * The project instance. * - * @var \App\Models\Project + * @var Project */ public $project; @@ -58,7 +58,7 @@ public function handle(AssignIdentifier $assigner, UpdateDOI $updater, PublishPr if ($project) { if ($draft) { - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); $projectPath = preg_replace( '~//+~', @@ -99,14 +99,17 @@ public function handle(AssignIdentifier $assigner, UpdateDOI $updater, PublishPr $project->draft_id = null; - $project->status = 'complete'; + $release_date = Carbon::parse($project->release_date); + if ($release_date->isFuture()) { + $project->status = 'embargo'; + } else { + $project->status = 'published'; + } $project->save(); $assigner->assign($project->fresh()); - $release_date = Carbon::parse($project->release_date); - if ($release_date->isPast()) { $projectPublisher->publish($project); } @@ -120,7 +123,7 @@ public function handle(AssignIdentifier $assigner, UpdateDOI $updater, PublishPr if ($project) { $_studies = $project->studies; if ($draft) { - $environment = env('APP_ENV', 'local'); + $environment = config('app.env', 'local'); foreach ($_studies as $study) { // $study->users()->sync($project->user()->getDictionary()); @@ -199,7 +202,7 @@ public function moveFolder($fsObject, $draft, $path) $path, $fsObjectChild->path ); - Storage::disk(env('FILESYSTEM_DRIVER'))->move($fsObjectChild->path, $newPath); + Storage::disk(config('filesystems.default'))->move($fsObjectChild->path, $newPath); $fsObjectChild->path = $newPath; $fsObjectChild->save(); } else { diff --git a/app/Jobs/VerifyFileIntegrityJob.php b/app/Jobs/VerifyFileIntegrityJob.php index 33e3369fc..191df21df 100644 --- a/app/Jobs/VerifyFileIntegrityJob.php +++ b/app/Jobs/VerifyFileIntegrityJob.php @@ -74,34 +74,32 @@ public function handle(FileIntegrityService $integrityService): void // Handle files without existing checksums (calculate initial checksums) if (! $this->fileSystemObject->getPrimaryChecksum()) { - Log::info('No existing checksum found, calculating initial checksums', [ + Log::info('No existing checksum found, skipping verification', [ 'file_id' => $this->fileSystemObject->id, 'file_name' => $this->fileSystemObject->name, ]); try { - // Calculate and store initial checksums - $fileIntegrityService = app(FileIntegrityService::class); - $result = $fileIntegrityService->verifyFileIntegrity($this->fileSystemObject, true); + // Attempt to verify file integrity (will mark as failed if no checksum exists) + $verificationSuccess = $integrityService->verifyFileIntegrity($this->fileSystemObject); - if ($result['success']) { - Log::info('Initial checksums calculated and stored successfully', [ + if ($verificationSuccess) { + Log::info('File integrity verification completed successfully', [ 'file_id' => $this->fileSystemObject->id, 'file_name' => $this->fileSystemObject->name, - 'checksums' => $result['checksums'] ?? null, ]); } else { - Log::error('Failed to calculate initial checksums', [ + Log::warning('File integrity verification failed - no checksum available', [ 'file_id' => $this->fileSystemObject->id, 'file_name' => $this->fileSystemObject->name, - 'error' => $result['error'] ?? 'Unknown error', + 'error' => $this->fileSystemObject->integrity_error, ]); } return; } catch (\Exception $e) { - Log::error('Exception while calculating initial checksums', [ + Log::error('Exception while verifying file without checksum', [ 'file_id' => $this->fileSystemObject->id, 'file_name' => $this->fileSystemObject->name, 'error' => $e->getMessage(), diff --git a/app/Mail/DraftProcessedNotifyAdmins.php b/app/Mail/DraftProcessedNotifyAdmins.php index 1dadab2f6..43c353dac 100644 --- a/app/Mail/DraftProcessedNotifyAdmins.php +++ b/app/Mail/DraftProcessedNotifyAdmins.php @@ -34,13 +34,14 @@ public function __construct($project, $studies) public function build() { $releasedToday = false; - $releaseDate = Carbon::parse($this->project->release_date); - - if ($releaseDate->isToday()) { - $releasedToday = true; - } if ($this->project) { + $releaseDate = Carbon::parse($this->project->release_date); + + if ($releaseDate->isToday()) { + $releasedToday = true; + } + return $this->markdown('vendor.mail.project-published-notify-admins', [ 'url' => url(config('app.url').'/dashboard/projects/'.$this->project->id), 'projectName' => $this->project->name, diff --git a/app/Mail/ProjectDeletion.php b/app/Mail/ProjectDeletion.php index 8d1547b74..2b02e53f8 100644 --- a/app/Mail/ProjectDeletion.php +++ b/app/Mail/ProjectDeletion.php @@ -30,10 +30,10 @@ public function __construct($project) */ public function build() { - $coolOffPeriod = (int) env('COOL_OFF_PERIOD', '30'); + $coolOffPeriod = config('nmrxiv.cool_off_period'); return $this->markdown('vendor.mail.project-deletion', [ - 'url' => url(config('app.url').'/dashboard/projects/'.$this->project->id.'/settings'), + 'url' => url('/dashboard/projects/'.$this->project->id.'/settings'), 'projectName' => $this->project->name, 'deletedOn' => explode(' ', $this->project->deleted_on)[0], 'dueDate' => explode(' ', Carbon::parse($this->project->deleted_on)->addDays($coolOffPeriod))[0], diff --git a/app/Mail/ProjectDeletionReminder.php b/app/Mail/ProjectDeletionReminder.php index b726b406f..30c406e51 100644 --- a/app/Mail/ProjectDeletionReminder.php +++ b/app/Mail/ProjectDeletionReminder.php @@ -30,10 +30,10 @@ public function __construct($project) */ public function build() { - $coolOffPeriod = (int) env('COOL_OFF_PERIOD', '30'); + $coolOffPeriod = config('nmrxiv.cool_off_period'); return $this->markdown('vendor.mail.project-deletion-reminder', [ - 'url' => url(config('app.url').'/dashboard/projects/'.$this->project->id), + 'url' => url('/dashboard/projects/'.$this->project->id), 'projectName' => $this->project->name, 'deletedOn' => explode(' ', $this->project->deleted_on)[0], 'dueDate' => explode(' ', Carbon::parse($this->project->deleted_on)->addDays($coolOffPeriod))[0], diff --git a/app/Mail/ProjectInvitation.php b/app/Mail/ProjectInvitation.php index 409c92759..bba952be4 100644 --- a/app/Mail/ProjectInvitation.php +++ b/app/Mail/ProjectInvitation.php @@ -16,7 +16,7 @@ class ProjectInvitation extends Mailable implements ShouldQueue /** * The project invitation instance. * - * @var \App\Models\ProjectInvitation + * @var ProjectInvitationModel */ public $invitation; diff --git a/app/Mail/StudyInvitation.php b/app/Mail/StudyInvitation.php index 12b10dbde..41e91f22a 100644 --- a/app/Mail/StudyInvitation.php +++ b/app/Mail/StudyInvitation.php @@ -16,7 +16,7 @@ class StudyInvitation extends Mailable implements ShouldQueue /** * The study invitation instance. * - * @var \App\Models\StudyInvitation + * @var StudyInvitationModel */ public $invitation; diff --git a/app/Mail/StudyPublish.php b/app/Mail/StudyPublish.php index caa270da7..96da6fdfc 100644 --- a/app/Mail/StudyPublish.php +++ b/app/Mail/StudyPublish.php @@ -31,7 +31,7 @@ public function __construct($studies) public function build() { $releaseToday = false; - $releaseDate = Carbon::parse($this->studies[0]['release_date']); + $releaseDate = Carbon::parse($this->studies[0]->release_date); if ($releaseDate->isToday()) { $releaseToday = true; diff --git a/app/Mail/TeamInvitation.php b/app/Mail/TeamInvitation.php index e1488a363..dbbf63798 100644 --- a/app/Mail/TeamInvitation.php +++ b/app/Mail/TeamInvitation.php @@ -16,7 +16,7 @@ class TeamInvitation extends Mailable implements ShouldQueue /** * The study invitation instance. * - * @var \App\Models\TeamInvitation + * @var TeamInvitationModel */ public $invitation; diff --git a/app/Models/Author.php b/app/Models/Author.php index 111409ed0..16352f267 100644 --- a/app/Models/Author.php +++ b/app/Models/Author.php @@ -13,7 +13,7 @@ class Author extends Model /** * Projects that belongs to authors. * - * @return \Illuminate\Database\Eloquent\Relations\belongsToMany + * @return BelongsToMany */ protected $fillable = [ 'title', @@ -22,10 +22,16 @@ class Author extends Model 'family_name', 'email_id', 'affiliation', + 'ror_id', ]; public function projects(): BelongsToMany { return $this->belongsToMany(Project::class); } + + public function studies(): BelongsToMany + { + return $this->belongsToMany(Study::class, 'author_study'); + } } diff --git a/app/Models/Dataset.php b/app/Models/Dataset.php index 30b19d9f3..3c529251d 100644 --- a/app/Models/Dataset.php +++ b/app/Models/Dataset.php @@ -52,6 +52,17 @@ class Dataset extends Model implements Auditable 'dataset_photo_url', ]; + /** + * The attributes that should be cast. + */ + protected function casts(): array + { + return [ + 'starred' => 'boolean', + 'is_public' => 'boolean', + ]; + } + /** * Get the dataset identifier */ @@ -70,19 +81,19 @@ protected function identifier(): Attribute public function getDatasetPhotoUrlAttribute() { return $this->dataset_photo_path - ? Storage::disk(env('FILESYSTEM_DRIVER_PUBLIC'))->url($this->dataset_photo_path) + ? Storage::disk(config('filesystems.default_public'))->url($this->dataset_photo_path) : ''; } protected function getPublicUrlAttribute() { // return env('APP_URL', null).'/datasets/'.urlencode($this->slug); - return env('APP_URL', null).'/dataset/D'.$this->getRawOriginal('identifier'); + return config('app.url').'/dataset/D'.$this->getRawOriginal('identifier'); } protected function getPrivateUrlAttribute() { - return env('APP_URL', null).'/datasets/'.urlencode($this->url); + return config('app.url').'/datasets/'.urlencode($this->url); } public function study(): BelongsTo diff --git a/app/Models/HasDOI.php b/app/Models/HasDOI.php index 8ea41df87..d151fb13b 100644 --- a/app/Models/HasDOI.php +++ b/app/Models/HasDOI.php @@ -6,7 +6,7 @@ trait HasDOI { public function generateDOI($doiService) { - $doi_host = env('DOI_HOST', null); + $doi_host = config('doi.host'); if (! is_null($doi_host)) { $identifier = $this->getIdentifier($this, 'identifier'); @@ -71,7 +71,7 @@ public function generateDOI($doiService) */ public function updateDOIMetadata($doiService) { - $doi_host = env('DOI_HOST', null); + $doi_host = config('doi.host'); if (! is_null($doi_host)) { $doi = $this->doi; diff --git a/app/Models/Molecule.php b/app/Models/Molecule.php index 84390bb0c..26481c562 100644 --- a/app/Models/Molecule.php +++ b/app/Models/Molecule.php @@ -46,7 +46,7 @@ protected function identifier(): Attribute protected function getPublicUrlAttribute() { - return env('APP_URL', null).'/compound/M'.$this->getRawOriginal('identifier'); + return config('app.url').'/compound/M'.$this->getRawOriginal('identifier'); } public function samples(): BelongsToMany diff --git a/app/Models/NMRium.php b/app/Models/NMRium.php index b402ccb26..9e10f4cd2 100644 --- a/app/Models/NMRium.php +++ b/app/Models/NMRium.php @@ -19,6 +19,8 @@ class NMRium extends Model protected $fillable = [ 'nmrium_info', + 'nmriumable_id', + 'nmriumable_type', 'dataset_id', ]; diff --git a/app/Models/Project.php b/app/Models/Project.php index 8cad91ce9..e573e7773 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -16,6 +16,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Notification; use Laravel\Scout\Searchable; use Maize\Markable\Markable; @@ -42,6 +43,9 @@ class Project extends Model implements Auditable 'starred', 'location', 'is_public', + 'is_deleted', + 'is_archived', + 'status', 'obfuscationcode', 'description', 'type', @@ -79,7 +83,7 @@ class Project extends Model implements Auditable public function getProjectPhotoUrlAttribute() { return $this->project_photo_path - ? Storage::disk(env('FILESYSTEM_DRIVER_PUBLIC'))->url($this->project_photo_path) + ? Storage::disk(config('filesystems.default_public'))->url($this->project_photo_path) : ''; } @@ -159,7 +163,7 @@ public function owner(): BelongsTo /** * Get all of the project's users including its owner. * - * @return \Illuminate\Support\Collection + * @return Collection */ public function allUsers() { @@ -180,7 +184,7 @@ public function users(): BelongsToMany /** * Determine if the given user belongs to the project. * - * @param \App\Models\User $user + * @param User $user * @return bool */ public function hasUser($user) @@ -253,7 +257,7 @@ public function projectInvitations(): HasMany /** * Remove the given user from the project. * - * @param \App\Models\User $user + * @param User $user * @return void */ public function removeUser($user) @@ -264,12 +268,12 @@ public function removeUser($user) protected function getPublicUrlAttribute() { // return env('APP_URL', null).'/projects/'.$this->owner->username.'/'.urlencode($this->slug); - return env('APP_URL', null).'/project/P'.$this->getRawOriginal('identifier'); + return config('app.url').'/project/P'.$this->getRawOriginal('identifier'); } protected function getPrivateUrlAttribute() { - return env('APP_URL', null).'/projects/'.urlencode($this->url); + return config('app.url').'/projects/'.urlencode($this->url); } /** diff --git a/app/Models/ProjectInvitation.php b/app/Models/ProjectInvitation.php index 024c8096e..d0ec49e9f 100644 --- a/app/Models/ProjectInvitation.php +++ b/app/Models/ProjectInvitation.php @@ -2,17 +2,21 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class ProjectInvitation extends Model { + use HasFactory; + /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ + 'project_id', 'email', 'role', 'message', diff --git a/app/Models/Schemas/Study.php b/app/Models/Schemas/Study.php index c9d7b5976..05284317b 100644 --- a/app/Models/Schemas/Study.php +++ b/app/Models/Schemas/Study.php @@ -3,6 +3,14 @@ namespace App\Models\Schemas; use Spatie\SchemaOrg\BaseType; +use Spatie\SchemaOrg\Contracts\BioChemEntityContract; +use Spatie\SchemaOrg\Contracts\CreativeWorkContract; +use Spatie\SchemaOrg\Contracts\DefinedTermContract; +use Spatie\SchemaOrg\Contracts\MedicalEntityContract; +use Spatie\SchemaOrg\Contracts\OrganizationContract; +use Spatie\SchemaOrg\Contracts\PersonContract; +use Spatie\SchemaOrg\Contracts\PropertyValueContract; +use Spatie\SchemaOrg\Contracts\ThingContract; /** * A body of structured information describing some topic(s) of interest. @@ -17,7 +25,7 @@ class Study extends BaseType * in that HTML 5 provides a special mechanism for indicating authorship via * the rel tag. That is equivalent to this and may be used interchangeably. * - * @param \Spatie\SchemaOrg\Contracts\OrganizationContract|\Spatie\SchemaOrg\Contracts\OrganizationContract[]|\Spatie\SchemaOrg\Contracts\PersonContract|\Spatie\SchemaOrg\Contracts\PersonContract[] $author + * @param OrganizationContract|OrganizationContract[]|PersonContract|PersonContract[] $author * @return static * * @see https://schema.org/author @@ -60,7 +68,7 @@ public function description($description) * strings or as URL (URI) links. See [background * notes](/docs/datamodel.html#identifierBg) for more details. * - * @param \Spatie\SchemaOrg\Contracts\PropertyValueContract|\Spatie\SchemaOrg\Contracts\PropertyValueContract[]|string|string[] $identifier + * @param PropertyValueContract|PropertyValueContract[]|string|string[] $identifier * @return static * * @see https://schema.org/identifier @@ -88,7 +96,7 @@ public function name($name) * functional genomics or earth science. Those domains can also have an ontology * reference. * - * @param \Spatie\SchemaOrg\Contracts\PropertyValueContract|\Spatie\SchemaOrg\Contracts\PropertyValueContract[]|string|string[] $studyDomain + * @param PropertyValueContract|PropertyValueContract[]|string|string[] $studyDomain * @return static */ public function studyDomain($studyDomain) @@ -100,7 +108,7 @@ public function studyDomain($studyDomain) * A subject of the study, i.e. one of the medical conditions, therapies, devices, * drugs, etc. investigated by the study. * - * @param \Spatie\SchemaOrg\Contracts\BioChemEntityContract|\Spatie\SchemaOrg\Contracts\MedicalEntityContract[] $studySubject + * @param BioChemEntityContract|MedicalEntityContract[] $studySubject * @return static */ public function studySubject($studySubject) @@ -111,7 +119,7 @@ public function studySubject($studySubject) /** * The subject matter of the content. * - * @param \Spatie\SchemaOrg\Contracts\ThingContract|\Spatie\SchemaOrg\Contracts\ThingContract[] $about + * @param ThingContract|ThingContract[] $about * @return static * * @see https://schema.org/about @@ -131,7 +139,7 @@ public function about($about) * such data to be provided using those properties, rather than using the generic * property/value mechanism. * - * @param \Spatie\SchemaOrg\Contracts\PropertyValueContract|\Spatie\SchemaOrg\Contracts\PropertyValueContract[] $additionalProperty + * @param PropertyValueContract|PropertyValueContract[] $additionalProperty * @return static * * @see https://schema.org/additionalProperty @@ -145,7 +153,7 @@ public function additionalProperty($additionalProperty) * A citation or reference to another creative work, such as another * publication, web page, scholarly article, etc. * - * @param \Spatie\SchemaOrg\Contracts\CreativeWorkContract|\Spatie\SchemaOrg\Contracts\CreativeWorkContract[]|string|string[] $citation + * @param CreativeWorkContract|CreativeWorkContract[]|string|string[] $citation * @return static * * @see https://schema.org/citation @@ -159,7 +167,7 @@ public function citation($citation) * The creator/author of this CreativeWork. This is the same as the Author * property for CreativeWork. * - * @param \Spatie\SchemaOrg\Contracts\OrganizationContract|\Spatie\SchemaOrg\Contracts\OrganizationContract[]|\Spatie\SchemaOrg\Contracts\PersonContract|\Spatie\SchemaOrg\Contracts\PersonContract[] $creator + * @param OrganizationContract|OrganizationContract[]|PersonContract|PersonContract[] $creator * @return static * * @see https://schema.org/creator @@ -214,7 +222,7 @@ public function startDate($startDate) * a keywords list are typically delimited by commas, or by repeating the * property. * - * @param \Spatie\SchemaOrg\Contracts\DefinedTermContract|\Spatie\SchemaOrg\Contracts\DefinedTermContract[]|string|string[] $keywords + * @param DefinedTermContract|DefinedTermContract[]|string|string[] $keywords * @return static * * @see https://schema.org/keywords @@ -228,7 +236,7 @@ public function keywords($keywords) * TA process performed as part of an experiment or wider study, i.e. intentionally * designed. These processes can have ontology URL attached to. * - * @param \Spatie\SchemaOrg\Contracts\PropertyValueContract|\Spatie\SchemaOrg\Contracts\PropertyValueContract[]|string|string[] $studyProcess + * @param PropertyValueContract|PropertyValueContract[]|string|string[] $studyProcess * @return static */ public function studyProcess($studyProcess) diff --git a/app/Models/Study.php b/app/Models/Study.php index 8de2b3fb9..f053f2ec4 100644 --- a/app/Models/Study.php +++ b/app/Models/Study.php @@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\MorphOne; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use Laravel\Scout\Searchable; @@ -38,6 +39,7 @@ class Study extends Model implements Auditable 'starred', 'location', 'is_public', + 'is_archived', 'obfuscationcode', 'description', 'type', @@ -60,6 +62,11 @@ class Study extends Model implements Auditable 'external_url', 'processing_logs', 'tracking_item_name', + 'doi', + 'identifier', + 'validation_id', + 'metadata_bagit_generation_status', + 'metadata_bagit_generation_logs', ]; /** @@ -68,10 +75,13 @@ class Study extends Model implements Auditable protected function casts(): array { return [ - 'authors' => 'array', 'citations' => 'array', 'molecules' => 'array', 'processing_logs' => 'array', + 'metadata_bagit_generation_logs' => 'array', + 'starred' => 'boolean', + 'is_public' => 'boolean', + 'is_archived' => 'boolean', ]; } @@ -131,7 +141,7 @@ protected function identifier(): Attribute public function getStudyPhotoUrlAttribute() { return $this->study_photo_path - ? Storage::disk(env('FILESYSTEM_DRIVER_PUBLIC'))->url($this->study_photo_path) + ? Storage::disk(config('filesystems.default_public'))->url($this->study_photo_path) : ''; } @@ -173,12 +183,12 @@ public function project(): BelongsTo protected function getPublicUrlAttribute() { // return env('APP_URL', null).'/projects/'.$this->owner->username.'/'.urlencode($this->project->slug).'?tab=study&id='.$this->slug; - return env('APP_URL', null).'/sample/S'.$this->getRawOriginal('identifier'); + return config('app.url').'/sample/S'.$this->getRawOriginal('identifier'); } protected function getPrivateUrlAttribute() { - return env('APP_URL', null).'/studies/'.urlencode($this->url); + return config('app.url').'/studies/'.urlencode($this->url); } public function draft(): BelongsTo @@ -261,7 +271,7 @@ public function owner(): BelongsTo /** * Get all of the study's users including its owner. * - * @return \Illuminate\Support\Collection + * @return Collection */ public function allUsers() { @@ -296,7 +306,7 @@ public function molecules() /** * Remove the given user from the study. * - * @param \App\Models\User $user + * @param User $user * @return void */ public function removeUser($user) @@ -311,9 +321,7 @@ public function removeUser($user) */ public function shouldBeSearchable() { - if ($this->is_public && ! $this->is_archived) { - return true; - } + return $this->is_public && ! $this->is_archived; } /** @@ -335,6 +343,25 @@ public function license(): BelongsTo return $this->belongsTo(License::class, 'license_id'); } + /** + * Get all of the authors that belong to the study. + */ + public function studyAuthors(): BelongsToMany + { + return $this->belongsToMany(Author::class) + ->withPivot('contributor_type', 'sort_order')->orderBy('sort_order', 'asc'); + } + + /** + * Accessor for authors attribute (alias for studyAuthors relationship). + */ + protected function authors(): Attribute + { + return Attribute::make( + get: fn () => $this->studyAuthors, + ); + } + public function scopeFilter($query, array $filters) { $query->when($filters['search'] ?? null, function ($query, $search) { diff --git a/app/Models/StudyInvitation.php b/app/Models/StudyInvitation.php index b2882e400..245084341 100644 --- a/app/Models/StudyInvitation.php +++ b/app/Models/StudyInvitation.php @@ -2,17 +2,21 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class StudyInvitation extends Model { + use HasFactory; + /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ + 'study_id', 'email', 'role', 'message', diff --git a/app/Models/TeamInvitation.php b/app/Models/TeamInvitation.php index 90294d426..4c78cff45 100644 --- a/app/Models/TeamInvitation.php +++ b/app/Models/TeamInvitation.php @@ -2,18 +2,22 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Laravel\Jetstream\Jetstream; use Laravel\Jetstream\TeamInvitation as JetstreamTeamInvitation; class TeamInvitation extends JetstreamTeamInvitation { + use HasFactory; + /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ + 'team_id', 'email', 'role', 'invited_by', diff --git a/app/Models/User.php b/app/Models/User.php index 466e0763e..0ebf90e62 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -31,11 +31,11 @@ class User extends Authenticatable implements MustVerifyEmail /** * The attributes that are mass assignable. - * + /** * @var array */ protected $fillable = [ - 'name', 'first_name', 'last_name', 'username', 'email', 'password', 'onboarded', 'orcid_id', 'affiliation', + 'name', 'first_name', 'last_name', 'username', 'email', 'password', 'onboarded', 'orcid_id', 'affiliation', 'ror_id', ]; /** diff --git a/app/Models/Validation.php b/app/Models/Validation.php index 3266d24a1..2b59efb88 100644 --- a/app/Models/Validation.php +++ b/app/Models/Validation.php @@ -242,6 +242,42 @@ public function process() array_push($studiesValidation, $studyReport); } + // Validate citations + $citations = $project->citations; + $citationsValidation = []; + $citationsStatus = true; + + foreach ($citations as $citation) { + $citationReport = [ + 'name' => $citation->title ?? 'Untitled', + 'id' => $citation->id, + ]; + + // Check if DOI is present + $hasDoi = is_string($citation->doi) && trim($citation->doi) !== ''; + + if ($hasDoi) { + $citationReport['doi'] = 'true|required'; + } else { + $citationReport['doi'] = 'false|required'; + $citationsStatus = false; // Citation validation failed + } + + $citationReport['status'] = $hasDoi; + array_push($citationsValidation, $citationReport); + } + + // Set overall citations validation status and store detailed report + if ($citationsStatus) { + $report['project']['citations'] = 'true|required'; + } else { + $report['project']['citations'] = 'false|required'; + $status = false; // Propagate to project status + } + + // Store detailed citations validation data separately + $report['project']['citations_detail'] = $citationsValidation; + $report['project']['studies'] = $studiesValidation; $report['project']['status'] = $status; $project->validation_status = $status; diff --git a/app/Policies/ProjectPolicy.php b/app/Policies/ProjectPolicy.php index 4abc9afde..b27908aa7 100644 --- a/app/Policies/ProjectPolicy.php +++ b/app/Policies/ProjectPolicy.php @@ -72,6 +72,20 @@ public function updateProject(User $user, Project $project) return $user->canUpdateProject($project); } + /** + * Determine whether the user can publish the model. + * + * @return mixed + */ + public function publishProject(User $user, Project $project) + { + if ($project->is_public || $project->is_archived || $project->is_deleted || $project->is_published) { + return false; + } + + return $user->canUpdateProject($project); + } + /** * Determine whether the user can delete the model. * diff --git a/app/Policies/StudyPolicy.php b/app/Policies/StudyPolicy.php index 079c70b8d..87da593c8 100644 --- a/app/Policies/StudyPolicy.php +++ b/app/Policies/StudyPolicy.php @@ -35,12 +35,16 @@ public function viewAny(User $user): bool * * @return mixed */ - public function viewStudy(User $user, Study $study) + public function viewStudy(?User $user, Study $study) { - if (is_null($user) && $study->is_public) { + if ($study->is_public) { return true; } + if (is_null($user)) { + return false; + } + return $user->belongsToStudy($study); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 6ff96d88d..474ba212b 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,10 @@ namespace App\Providers; +use App\Services\FileIntegrityService; +use App\Services\FileSystemObjectService; +use App\Services\PathGeneratorService; +use App\Services\StorageSignedUrlService; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Event; @@ -42,10 +46,10 @@ class AppServiceProvider extends ServiceProvider public function register(): void { // Register filesystem services - $this->app->singleton(\App\Services\PathGeneratorService::class); - $this->app->singleton(\App\Services\StorageSignedUrlService::class); - $this->app->singleton(\App\Services\FileIntegrityService::class); - $this->app->bind(\App\Services\FileSystemObjectService::class); + $this->app->singleton(PathGeneratorService::class); + $this->app->singleton(StorageSignedUrlService::class); + $this->app->singleton(FileIntegrityService::class); + $this->app->bind(FileSystemObjectService::class); } /** diff --git a/app/Providers/CASServiceProvider.php b/app/Providers/CASServiceProvider.php new file mode 100644 index 000000000..572cae577 --- /dev/null +++ b/app/Providers/CASServiceProvider.php @@ -0,0 +1,40 @@ +app->bind(CASService::class, function ($app) { + $provider = config('services.cas.provider'); + if ($provider === 'CAS_CommonChemistry') { + return new CommonChemistry; + } + throw new \Exception('Invalid CAS provider: '.$provider); + }); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index fbef8d473..465a89e10 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -6,8 +6,10 @@ use App\Events\StudyPublish; use App\Listeners\SendDraftProcessedNotification; use App\Listeners\StudyPublish as StudyPublishListener; +use App\Services\Socialite\NFDIAAI\Provider; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Event; +use SocialiteProviders\Manager\SocialiteWasCalled; class EventServiceProvider extends ServiceProvider { @@ -43,9 +45,9 @@ public function boot(): void // Manually register event listeners as fallback Event::listen(DraftProcessed::class, SendDraftProcessedNotification::class); Event::listen(StudyPublish::class, StudyPublishListener::class); - Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) { + Event::listen(function (SocialiteWasCalled $event) { // Canonical slug for NFDI AAI provider is 'regapp' (matches IdP registered callback URI) - $event->extendSocialite('regapp', \App\Services\Socialite\NFDIAAI\Provider::class); + $event->extendSocialite('regapp', Provider::class); }); } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index b2b03e02a..8ed782052 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -73,5 +73,23 @@ protected function configureRateLimiting(): void RateLimiter::for('api', function (Request $request) { return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); }); + + // Support bubble rate limiting to prevent spam + RateLimiter::for('support-bubble', function (Request $request) { + // Skip rate limiting in testing environment + if (app()->environment('testing')) { + return Limit::none(); + } + + return [ + // Allow 5 submissions per minute per IP + Limit::perMinute(1)->by($request->ip()), + // Allow 20 submissions per hour per IP + Limit::perHour(5)->by($request->ip()), + // Allow 50 submissions per day per IP + Limit::perDay(20)->by($request->ip()), + + ]; + }); } } diff --git a/app/Services/AuthorService.php b/app/Services/AuthorService.php deleted file mode 100644 index e9c707402..000000000 --- a/app/Services/AuthorService.php +++ /dev/null @@ -1,145 +0,0 @@ -load('authors'); - - $processedAuthors = []; - - foreach ($authors as $authorData) { - $this->validateAuthorData($authorData); - - $familyName = $authorData['family_name']; - $givenName = $authorData['given_name']; - - if (! is_null($familyName) && ! is_null($givenName)) { - $author = $this->findOrCreateAuthor($project, $authorData, $familyName, $givenName); - $author->contributor_type = $authorData['contributor_type'] ?? 'Researcher'; - $processedAuthors[] = $author; - } - } - - // Use database transaction for bulk operations - DB::transaction(function () use ($project, $processedAuthors): void { - $this->updater->attachAuthor($project, $processedAuthors); - }); - - // Reload the relationship to get fresh pivot data - $project->load('authors'); - - return $processedAuthors; - } - - /** - * Remove author from project. - */ - public function removeAuthorFromProject(Project $project, int $authorId): void - { - DB::transaction(function () use ($project, $authorId): void { - $this->updater->detachAuthor($project, $authorId); - }); - } - - /** - * Update contributor type for an author in a project. - */ - public function updateContributorType(Project $project, int $authorId, string $role): bool - { - $contributorTypes = Config::get('doi.'.Config::get('doi.default').'.contributor_types'); - - if (! in_array($role, $contributorTypes)) { - return false; - } - - $this->updater->updateContributorType($project, $authorId, $role); - - return true; - } - - /** - * Validate author data against validation rules. - * - * - * @throws \Illuminate\Validation\ValidationException - */ - private function validateAuthorData(array $authorData): void - { - Validator::make($authorData, [ - 'given_name' => ['required', 'string', 'max:255'], - 'family_name' => ['required', 'string', 'max:255'], - 'title' => ['nullable', 'string', 'max:100'], - 'email_id' => ['nullable', 'email', 'max:320'], - 'orcid_id' => ['nullable', 'string', 'max:19'], - 'affiliation' => ['nullable', 'string', 'max:500'], - 'contributor_type' => ['nullable', 'string', 'max:50'], - ])->validate(); - } - - /** - * Find existing author for project or create new one. - */ - private function findOrCreateAuthor(Project $project, array $authorData, string $familyName, string $givenName): Author - { - $existingAuthor = Author::query() - ->whereHas('projects', function ($query) use ($project): void { - $query->where('projects.id', $project->id); - }) - ->where('family_name', $familyName) - ->where('given_name', $givenName) - ->first(); - - if ($existingAuthor) { - $existingAuthor->update($this->prepareAuthorAttributes($authorData, $familyName, $givenName)); - - return $existingAuthor; - } - - return Author::create($this->prepareAuthorAttributes($authorData, $familyName, $givenName)); - } - - /** - * Prepare author attributes for create or update operations. - */ - private function prepareAuthorAttributes(array $authorData, string $familyName, string $givenName): array - { - return [ - 'title' => $authorData['title'] ?? null, - 'given_name' => $givenName, - 'family_name' => $familyName, - 'orcid_id' => $authorData['orcid_id'] ?? null, - 'email_id' => $authorData['email_id'] ?? null, - 'affiliation' => $authorData['affiliation'] ?? null, - ]; - } -} diff --git a/app/Services/CAS/CASService.php b/app/Services/CAS/CASService.php new file mode 100644 index 000000000..3eced8a62 --- /dev/null +++ b/app/Services/CAS/CASService.php @@ -0,0 +1,16 @@ + Config::get('services.cas.base_url'), + 'api_token' => Config::get('services.cas.api_token'), + ]; + } + + /** + * Fetch detailed information for a given CAS registry number + */ + public function getCASDetails(string $casNumber): array + { + try { + $config = $this->getApiConfig(); + + $response = Http::timeout(self::REQUEST_TIMEOUT) + ->withHeaders([ + 'X-API-KEY' => $config['api_token'], + 'Accept' => 'application/json', + 'Content-Type' => 'application/json', + ]) + ->get("{$config['base_url']}/detail", [ + 'cas_rn' => $casNumber, + ]); + + if ($response->successful()) { + $data = $response->json(); + + // Ensure we have valid array data + if (is_array($data)) { + return $data; + } + + throw new \Exception('Invalid response format from CAS API'); + } + + throw new \Exception('Unable to retrieve CAS details. Please verify the CAS number and try again.'); + } catch (\Exception $e) { + throw new \Exception('Unable to retrieve CAS details. Please verify the CAS number and try again.'); + } + } + + /** + * Search for CAS registry number using SMILES molecular structure notation + */ + public function searchCASBySmiles(string $smiles): ?string + { + try { + $config = $this->getApiConfig(); + + $response = Http::timeout(self::REQUEST_TIMEOUT) + ->withHeaders([ + 'X-API-KEY' => $config['api_token'], + 'Accept' => 'application/json', + 'Content-Type' => 'application/json', + ]) + ->get("{$config['base_url']}/search", [ + 'q' => $smiles, + ]); + + if ($response->successful()) { + $data = $response->json(); + + if (isset($data['count']) && $data['count'] > 0 && isset($data['results'][0]['rn'])) { + return $data['results'][0]['rn']; + } + } + + return null; + + } catch (\Exception $e) { + return null; + } + } +} diff --git a/app/Services/ELN/NOBSMetadataService.php b/app/Services/ELN/NOBSMetadataService.php new file mode 100644 index 000000000..ef7fe5737 --- /dev/null +++ b/app/Services/ELN/NOBSMetadataService.php @@ -0,0 +1,460 @@ +id], + ])->first(); + + if (! $publicationMetadataFile) { + Log::warning('Publication metadata file not found', [ + 'draft_id' => $draft->id, + ]); + + return null; + } + + $publicationMetadataContents = $this->fileIntegrityService->downloadFileFromStorage($publicationMetadataFile); + + if ($publicationMetadataContents === null) { + Log::warning('Could not download publication metadata file', [ + 'file_id' => $publicationMetadataFile->id, + 'path' => $publicationMetadataFile->path, + 'draft_id' => $draft->id, + ]); + + return null; + } + + $decodedMetadata = json_decode($publicationMetadataContents, true); + + if (! $decodedMetadata || ! is_array($decodedMetadata)) { + Log::warning('Invalid publication metadata JSON', [ + 'draft_id' => $draft->id, + 'file_id' => $publicationMetadataFile->id, + ]); + + return null; + } + + return $decodedMetadata; + } + + /** + * Extract project information (root level). + */ + public function extractProject(array $metadata): array + { + return [ + 'id' => $metadata['@id'] ?? null, + 'name' => $metadata['name'] ?? null, + 'description' => $metadata['description'] ?? null, + 'tracking_item_name' => $metadata['trackingItemName'] ?? null, + 'url' => $metadata['url'] ?? null, + 'license' => $metadata['license'] ?? null, + 'date_created' => $metadata['dateCreated'] ?? null, + 'date_modified' => $metadata['dateModified'] ?? null, + 'date_published' => $metadata['datePublished'] ?? null, + 'keywords' => $this->extractKeywords($metadata), + 'authors' => $this->extractAuthors($metadata), + 'publisher' => [ + 'name' => $metadata['publisher']['name'] ?? null, + 'logo' => $metadata['publisher']['logo'] ?? null, + 'url' => $metadata['publisher']['url'] ?? null, + ], + 'citation' => $metadata['citation'] ?? [], + ]; + } + + /** + * Extract studies from hasPart (can be single object or array). + */ + public function extractStudies(array $metadata): array + { + $studies = []; + $hasPart = $metadata['hasPart'] ?? null; + + if (! $hasPart) { + return $studies; + } + + // Handle both single object and array cases + $studyItems = isset($hasPart['@type']) ? [$hasPart] : $hasPart; + + if (! is_array($studyItems)) { + return $studies; + } + + foreach ($studyItems as $item) { + if (isset($item['@type']) && $item['@type'] === 'Study') { + $studies[] = [ + 'id' => $item['@id'] ?? null, + 'name' => $item['name'] ?? null, + 'tracking_item_name' => $item['trackingItemName'] ?? null, + 'description' => $item['description'] ?? null, + 'url' => $item['url'] ?? null, + 'license' => $item['license'] ?? null, + 'date_created' => $item['dateCreated'] ?? null, + 'date_modified' => $item['dateModified'] ?? null, + 'date_published' => $item['datePublished'] ?? null, + 'keywords' => $this->extractKeywords($item), + 'authors' => $this->extractAuthors($item), + 'citation' => $item['citation'] ?? [], + 'chemical_substance' => $this->extractChemicalSubstance($item), + ]; + } + } + + return $studies; + } + + /** + * Extract chemical substance from study's "about" section. + */ + private function extractChemicalSubstance(array $study): ?array + { + if (! isset($study['about']) || $study['about']['@type'] !== 'ChemicalSubstance') { + return null; + } + + $substance = $study['about']; + + return [ + 'id' => $substance['@id'] ?? null, + 'name' => $substance['name'] ?? null, + 'description' => $substance['description'] ?? null, + 'url' => $substance['url'] ?? null, + 'study_domain' => $substance['studyDomain'] ?? null, + 'study_subject' => $substance['studySubject'] ?? null, + 'molecule' => $this->extractMolecule($substance), + 'datasets' => $this->extractDatasets($substance), + ]; + } + + /** + * Extract molecule information from hasBioChemEntityPart. + */ + private function extractMolecule(array $substance): ?array + { + if (! isset($substance['hasBioChemEntityPart'])) { + return null; + } + + $molecule = $substance['hasBioChemEntityPart']; + + return [ + 'id' => $molecule['@id'] ?? null, + 'name' => $molecule['name'] ?? null, + 'molecular_formula' => $molecule['molecularFormula'] ?? null, + 'molecular_weight' => $molecule['molecularWeight']['value'] ?? null, + 'molecular_weight_unit' => $molecule['molecularWeight']['unitCode'] ?? null, + 'inchi' => $molecule['inChI'] ?? null, + 'inchi_key' => $molecule['inChIKey'] ?? null, + 'smiles' => $molecule['smiles'] ?? null, + 'iupac_name' => $molecule['iupacName'] ?? null, + ]; + } + + /** + * Extract datasets from chemical substance's hasPart (can be single object or array). + */ + private function extractDatasets(array $substance): array + { + $datasets = []; + $hasPart = $substance['hasPart'] ?? null; + + if (! $hasPart) { + return $datasets; + } + + // Handle both single object and array cases + $datasetItems = isset($hasPart['@type']) ? [$hasPart] : $hasPart; + + if (! is_array($datasetItems)) { + return $datasets; + } + + foreach ($datasetItems as $item) { + if (isset($item['@type']) && $item['@type'] === 'Dataset') { + $datasets[] = [ + 'id' => $item['@id'] ?? null, + 'name' => $item['name'] ?? null, + 'description' => $item['description'] ?? null, + 'url' => $item['url'] ?? null, + 'license' => $item['license'] ?? null, + 'date_created' => $item['dateCreated'] ?? null, + 'date_modified' => $item['dateModified'] ?? null, + 'date_published' => $item['datePublished'] ?? null, + 'analyses' => $item['analyses'] ?? null, + 'datasets' => $item['datasets'] ?? [], + 'measurement_technique' => $this->extractMeasurementTechnique($item), + 'variable_measured' => $this->extractVariableMeasured($item), + 'is_accessible_for_free' => $item['isAccessibleForFree'] ?? null, + ]; + } + } + + return $datasets; + } + + /** + * Extract analyses information. + */ + public function extractAnalyses(array $metadata): array + { + $analyses = []; + $studies = $this->extractStudies($metadata); + + foreach ($studies as $study) { + if (isset($study['chemical_substance']['datasets'])) { + foreach ($study['chemical_substance']['datasets'] as $dataset) { + if (isset($dataset['analyses'])) { + $analyses[] = [ + 'study_id' => $study['id'], + 'study_name' => $study['name'], + 'dataset_id' => $dataset['id'], + 'dataset_name' => $dataset['name'], + 'analysis_id' => $dataset['analyses'], + 'datasets' => $dataset['datasets'] ?? [], + 'measurement_technique' => $dataset['measurement_technique'], + 'variable_measured' => $dataset['variable_measured'], + 'external_url' => $dataset['url'], + ]; + } + } + } + } + + return $analyses; + } + + /** + * Extract molecules from all studies. + */ + public function extractMolecules(array $metadata): array + { + $molecules = []; + $studies = $this->extractStudies($metadata); + + foreach ($studies as $study) { + if (isset($study['chemical_substance']['molecule'])) { + $molecule = $study['chemical_substance']['molecule']; + $molecule['study_name'] = $study['name']; + $molecule['substance_name'] = $study['chemical_substance']['name']; + $molecules[] = $molecule; + } + } + + return $molecules; + } + + /** + * Extract all metadata in a structured format. + */ + public function extractAllMetadata(array $metadata): array + { + return [ + 'eln_type' => $this->getELNType(), + 'project' => $this->extractProject($metadata), + 'studies' => $this->extractStudies($metadata), + 'analyses' => $this->extractAnalyses($metadata), + 'molecules' => $this->extractMolecules($metadata), + ]; + } + + /** + * Extract authors from metadata. + */ + private function extractAuthors(array $metadata): array + { + $authors = []; + if (isset($metadata['author']) && is_array($metadata['author'])) { + foreach ($metadata['author'] as $author) { + $authors[] = [ + 'name' => $author['name'] ?? null, + 'given_name' => $author['givenName'] ?? null, + 'family_name' => $author['familyName'] ?? null, + 'identifier' => $author['identifier'] ?? null, + 'affiliation' => $author['affiliation']['name'] ?? null, + ]; + } + } + + return $authors; + } + + /** + * Extract keywords information. + */ + private function extractKeywords(array $metadata): array + { + $keywords = []; + + if (isset($metadata['keywords']) && is_array($metadata['keywords'])) { + foreach ($metadata['keywords'] as $keyword) { + $keywords[] = [ + 'name' => $keyword['name'] ?? null, + 'id' => $keyword['@id'] ?? null, + 'alternate_name' => $keyword['alternateName'] ?? null, + 'defined_term_set' => [ + 'name' => $keyword['inDefinedTermSet']['name'] ?? null, + 'id' => $keyword['inDefinedTermSet']['@id'] ?? null, + ], + ]; + } + } + + return $keywords; + } + + /** + * Extract measurement technique from dataset. + */ + private function extractMeasurementTechnique(array $dataset): ?array + { + if (! isset($dataset['measurementTechnique'])) { + return null; + } + + $technique = $dataset['measurementTechnique']; + + return [ + 'name' => $technique['name'] ?? null, + 'term_code' => $technique['termCode'] ?? null, + 'id' => $technique['@id'] ?? null, + 'alternate_names' => $technique['alternateName'] ?? [], + 'url' => $technique['url'] ?? null, + 'defined_term_set' => [ + 'name' => $technique['inDefinedTermSet']['name'] ?? null, + 'id' => $technique['inDefinedTermSet']['@id'] ?? null, + ], + ]; + } + + /** + * Extract variable measurements from dataset. + */ + private function extractVariableMeasured(array $dataset): array + { + $measurements = []; + + if (isset($dataset['variableMeasured']) && is_array($dataset['variableMeasured'])) { + foreach ($dataset['variableMeasured'] as $variable) { + $measurements[] = [ + 'name' => $variable['name'] ?? null, + 'property_id' => $variable['propertyID'] ?? null, + 'value' => $variable['value'] ?? null, + ]; + } + } + + return $measurements; + } + + /** + * Validate the NOBS metadata structure. + */ + public function validateMetadata(array $metadata): bool + { + // Basic validation for NOBS JSON-LD structure + $requiredFields = ['@context', '@type', 'name', 'hasPart']; + + foreach ($requiredFields as $field) { + if (! isset($metadata[$field])) { + Log::warning("Missing required field in NOBS metadata: {$field}"); + + return false; + } + } + + // Validate that it's a Study type + if ($metadata['@type'] !== 'Study') { + Log::warning("Invalid @type in NOBS metadata. Expected 'Study', got: ".($metadata['@type'] ?? 'null')); + + return false; + } + + // Validate schema.org context + if ($metadata['@context'] !== 'https://schema.org') { + Log::warning("Invalid @context in NOBS metadata. Expected 'https://schema.org'"); + + return false; + } + + return true; + } + + /** + * Get the ELN type this extractor handles. + */ + public function getELNType(): string + { + return 'nobs'; + } + + /** + * Extract analyses information from draft (fetches metadata internally). + */ + public function extractAnalysesFromDraft(Draft $draft): array + { + $metadata = $this->fetchPublicationMetadata($draft); + + if (! $metadata) { + return []; + } + + return $this->extractAnalyses($metadata); + } + + /** + * Validate metadata from draft (fetches metadata internally). + */ + public function validateMetadataFromDraft(Draft $draft): bool + { + $metadata = $this->fetchPublicationMetadata($draft); + + if (! $metadata) { + return false; + } + + return $this->validateMetadata($metadata); + } + + /** + * Extract all metadata from draft (fetches metadata internally). + */ + public function extractAllMetadataFromDraft(Draft $draft): ?array + { + $metadata = $this->fetchPublicationMetadata($draft); + + if (! $metadata) { + return null; + } + + return $this->extractAllMetadata($metadata); + } +} diff --git a/app/Services/ELNMetadataServiceFactory.php b/app/Services/ELNMetadataServiceFactory.php index 2ddc99d6a..2991e0833 100644 --- a/app/Services/ELNMetadataServiceFactory.php +++ b/app/Services/ELNMetadataServiceFactory.php @@ -4,6 +4,7 @@ use App\Services\ELN\ChemotionMetadataService; use App\Services\ELN\ELNMetadataExtractorInterface; +use App\Services\ELN\NOBSMetadataService; use InvalidArgumentException; /** @@ -21,6 +22,7 @@ public static function create(string $elnType): ELNMetadataExtractorInterface { return match (strtolower($elnType)) { 'chemotion' => new ChemotionMetadataService(app(FileIntegrityService::class)), + 'nobs' => new NOBSMetadataService(app(FileIntegrityService::class)), default => throw new InvalidArgumentException("Unsupported ELN type: {$elnType}") }; } @@ -32,7 +34,7 @@ public static function getSupportedELNTypes(): array { return [ 'chemotion', - // Add more ELN types here as they are implemented + 'nobs', ]; } diff --git a/app/Services/FileIntegrityService.php b/app/Services/FileIntegrityService.php index 5b75e8dd8..e6c04542a 100644 --- a/app/Services/FileIntegrityService.php +++ b/app/Services/FileIntegrityService.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Models\FileSystemObject; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; @@ -178,7 +179,7 @@ private function verifyChecksums(FileSystemObject $fileSystemObject, string $fil /** * Get files pending integrity verification. */ - public function getFilesPendingVerification(int $limit = 100): \Illuminate\Database\Eloquent\Collection + public function getFilesPendingVerification(int $limit = 100): Collection { return FileSystemObject::where('type', 'file') ->where('integrity_status', 'pending') @@ -191,7 +192,7 @@ public function getFilesPendingVerification(int $limit = 100): \Illuminate\Datab /** * Get files with failed integrity verification. */ - public function getFilesWithFailedIntegrity(int $limit = 100): \Illuminate\Database\Eloquent\Collection + public function getFilesWithFailedIntegrity(int $limit = 100): Collection { return FileSystemObject::where('type', 'file') ->where('integrity_status', 'failed') diff --git a/app/Services/FileSystemObjectService.php b/app/Services/FileSystemObjectService.php index 65e1ae83d..bedd2963f 100644 --- a/app/Services/FileSystemObjectService.php +++ b/app/Services/FileSystemObjectService.php @@ -7,6 +7,7 @@ use App\Models\FileSystemObject; use App\Models\Project; use App\Models\Study; +use Illuminate\Database\QueryException; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; @@ -28,7 +29,7 @@ public function __construct( /** * Create file system object for draft uploads. * - * @throws \Illuminate\Database\QueryException + * @throws QueryException */ public function createDraftFileSystemObject( Draft $draft, @@ -51,7 +52,7 @@ public function createDraftFileSystemObject( /** * Create file system object for project uploads. * - * @throws \Illuminate\Database\QueryException + * @throws QueryException */ public function createProjectFileSystemObject( Project $project, @@ -211,7 +212,7 @@ private function findOrCreateDirectory( $directory = FileSystemObject::create($creationDefaults); return $directory; - } catch (\Illuminate\Database\QueryException $e) { + } catch (QueryException $e) { // Handle unique constraint violation - another process created it if ($e->getCode() === '23000' || str_contains($e->getMessage(), 'Duplicate entry')) { // Fetch the directory that was created by the other process @@ -286,7 +287,7 @@ private function createFileObject( $fileObject = FileSystemObject::create($creationDefaults); return ['fileObject' => $fileObject, 'wasRecentlyCreated' => true]; - } catch (\Illuminate\Database\QueryException $e) { + } catch (QueryException $e) { // Handle unique constraint violation - another process created it if ($e->getCode() === '23000' || str_contains($e->getMessage(), 'Duplicate entry')) { // Fetch the file that was created by the other process diff --git a/app/Services/Socialite/NFDIAAI/Provider.php b/app/Services/Socialite/NFDIAAI/Provider.php index c6e15bb59..f0c865071 100644 --- a/app/Services/Socialite/NFDIAAI/Provider.php +++ b/app/Services/Socialite/NFDIAAI/Provider.php @@ -14,7 +14,25 @@ class Provider extends AbstractProvider protected function getAuthUrl($state) { - return $this->buildAuthUrlFromBase('https://regapp.nfdi-aai.de/oidc/realms/nfdi/protocol/openid-connect/auth', $state); + $url = $this->buildAuthUrlFromBase('https://regapp.nfdi-aai.de/oidc/realms/nfdi/protocol/openid-connect/auth', $state); + + // Ensure client_id is in the URL + if (! str_contains($url, 'client_id=')) { + $separator = str_contains($url, '?') ? '&' : '?'; + $url .= $separator.'client_id='.urlencode($this->clientId); + } + + return $url; + } + + protected function getCodeFields($state = null): array + { + $fields = parent::getCodeFields($state); + + // Ensure client_id is always included + $fields['client_id'] = $this->clientId; + + return $fields; } protected function getTokenUrl() diff --git a/app/Support/Csp/Policies/NmrxivPolicy.php b/app/Support/Csp/Policies/NmrxivPolicy.php new file mode 100644 index 000000000..7e6020084 --- /dev/null +++ b/app/Support/Csp/Policies/NmrxivPolicy.php @@ -0,0 +1,135 @@ +add(Directive::BASE, Keyword::SELF) + ->add(Directive::DEFAULT, Keyword::SELF) + ->add(Directive::FORM_ACTION, Keyword::SELF) + ->add(Directive::OBJECT, Keyword::NONE); + + // Basic asset sources + $policy + ->add(Directive::SCRIPT, Keyword::SELF) + ->add(Directive::STYLE, Keyword::SELF) + ->add(Directive::FONT, 'data:') + ->add(Directive::CONNECT, Keyword::SELF); + + // Third-party services + $policy + ->add(Directive::STYLE, 'https://fonts.bunny.net') + ->add(Directive::SCRIPT, 'https://matomo.nfdi4chem.de') + ->add(Directive::CONNECT, 'https://matomo.nfdi4chem.de', 'https://fonts.bunny.net'); + + // Add nmrXiv-specific external sources + $this->addNmrxivSources($policy); + + // Unified rules for all environments + $this->addUnifiedRules($policy); + } + + private function addUnifiedRules(Policy $policy): void + { + // Allow unsafe-inline and unsafe-eval for maximum compatibility + // This is acceptable when you control all inline scripts and have other security layers + $policy + ->add(Directive::SCRIPT, Keyword::UNSAFE_INLINE) + ->add(Directive::SCRIPT, Keyword::UNSAFE_EVAL) + ->add(Directive::STYLE, Keyword::UNSAFE_INLINE); + + // Development server support (for local development with Vite) + $policy + ->add(Directive::SCRIPT, self::LOCAL_HOSTS) + ->add(Directive::STYLE, self::LOCAL_HOSTS) + ->add(Directive::CONNECT, array_merge(self::LOCAL_WS_HOSTS, self::LOCAL_HOSTS)); + } + + /** + * Add nmrXiv-specific external sources. + * For runtime-configurable sources, use config/csp.php with CSP_ADDITIONAL_* env variables. + */ + private function addNmrxivSources(Policy $policy): void + { + // Image sources + $policy + ->add(Directive::IMG, Keyword::SELF) + ->add(Directive::IMG, 'data:') + ->add(Directive::IMG, 'blob:') + ->add(Directive::IMG, 'https://s3.uni-jena.de') + ->add(Directive::IMG, 'https://orcid.org') + ->add(Directive::IMG, 'https://ui-avatars.com') + ->add(Directive::IMG, 'https://www.nfdi4chem.de') + ->add(Directive::IMG, 'https://www.nmrium.org') + ->add(Directive::IMG, 'https://nmriumdev.nmrxiv.org') + ->add(Directive::IMG, 'https://upload.wikimedia.org') + ->add(Directive::IMG, 'https://pbs.twimg.com') + ->add(Directive::IMG, 'https://api.cheminf.studio') + ->add(Directive::IMG, 'https://api.naturalproducts.net') + ->add(Directive::IMG, 'https://dev.api.naturalproducts.net') + ->add(Directive::IMG, 'https://placehold.co'); + + // Connection sources + $policy + ->add(Directive::CONNECT, config('external-links.datacite_api')) + ->add(Directive::CONNECT, config('external-links.crossref_api')) + ->add(Directive::CONNECT, config('doi.datacite.endpoint')) + ->add(Directive::CONNECT, config('external-links.nmrkit_url')) + ->add(Directive::CONNECT, config('services.pubchem.base_url')) + ->add(Directive::CONNECT, config('services.cas.base_url')) + ->add(Directive::CONNECT, config('services.chemistry_standardize.url')) + ->add(Directive::CONNECT, config('external-links.europemc_ws_api')) + ->add(Directive::CONNECT, config('services.chemotion_tracker.base_url')) + ->add(Directive::CONNECT, config('external-links.cm_api')) + ->add(Directive::CONNECT, config('filesystems.disks.ceph.endpoint')) + ->add(Directive::CONNECT, 'https://nmrium.nmrxiv.org') + ->add(Directive::CONNECT, 'https://nmriumdev.nmrxiv.org') + ->add(Directive::CONNECT, 'https://api.cheminf.studio') + ->add(Directive::CONNECT, 'https://api.naturalproducts.net') + ->add(Directive::CONNECT, 'https://dev.api.naturalproducts.net'); + + // Font sources + $policy + ->add(Directive::FONT, 'https://fonts.googleapis.com') + ->add(Directive::FONT, 'https://fonts.gstatic.com') + ->add(Directive::FONT, 'https://fonts.bunny.net'); + + // Frame sources + $policy + ->add(Directive::FRAME, Keyword::SELF) + ->add(Directive::FRAME, 'https://api.cheminf.studio') + ->add(Directive::FRAME, 'https://api.naturalproducts.net') + ->add(Directive::FRAME, 'https://dev.api.naturalproducts.net') + ->add(Directive::FRAME, 'https://nmrium.nmrxiv.org') + ->add(Directive::FRAME, 'https://nmriumdev.nmrxiv.org'); + } +} diff --git a/boost.json b/boost.json new file mode 100644 index 000000000..adddf2278 --- /dev/null +++ b/boost.json @@ -0,0 +1,11 @@ +{ + "agents": [ + "cursor" + ], + "editors": [ + "cursor", + "vscode" + ], + "guidelines": [], + "sail": true +} diff --git a/bootstrap/app.php b/bootstrap/app.php index a2f4fda87..6db7b45e4 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,16 +1,29 @@ withProviders([ - \SocialiteProviders\Manager\ServiceProvider::class, - \OwenIt\Auditing\AuditingServiceProvider::class, - \Lab404\Impersonate\ImpersonateServiceProvider::class, - \L5Swagger\L5SwaggerServiceProvider::class, + ServiceProvider::class, + AuditingServiceProvider::class, + ImpersonateServiceProvider::class, + L5SwaggerServiceProvider::class, ]) ->withRouting( web: __DIR__.'/../routes/web.php', @@ -28,22 +41,26 @@ 'support-bubble', ]); - $middleware->append(\Spatie\CookieConsent\CookieConsentMiddleware::class); + $middleware->append(CookieConsentMiddleware::class); $middleware->web([ - \Laravel\Jetstream\Http\Middleware\AuthenticateSession::class, - \App\Http\Middleware\HandleInertiaRequests::class, - \App\Http\Middleware\XFrameOptions::class, + AuthenticateSession::class, + HandleInertiaRequests::class, + XFrameOptions::class, + AddCspHeaders::class, ]); - $middleware->throttleApi(); + // Disable API throttling in testing environment to allow test suite to run + if (env('APP_ENV') !== 'testing') { + $middleware->throttleApi(); + } - $middleware->replace(\Illuminate\Http\Middleware\TrustProxies::class, \App\Http\Middleware\TrustProxies::class); + $middleware->replace(TrustProxies::class, App\Http\Middleware\TrustProxies::class); $middleware->alias([ - 'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class, - 'role' => \Spatie\Permission\Middleware\RoleMiddleware::class, - 'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class, + 'permission' => PermissionMiddleware::class, + 'role' => RoleMiddleware::class, + 'role_or_permission' => RoleOrPermissionMiddleware::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { diff --git a/bootstrap/providers.php b/bootstrap/providers.php index 98112431b..d66cc53af 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -1,13 +1,25 @@ =8.1", - "psr/http-message": "^1.0 || ^2.0" + "psr/http-message": "^1.0 || ^2.0", + "symfony/filesystem": "^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", "composer/composer": "^2.7.8", - "dms/phpunit-arraysubset-asserts": "^0.4.0", + "dms/phpunit-arraysubset-asserts": "^v0.5.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", - "ext-pcntl": "*", "ext-sockets": "*", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "phpunit/phpunit": "^10.0", "psr/cache": "^2.0 || ^3.0", "psr/simple-cache": "^2.0 || ^3.0", "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", - "symfony/filesystem": "^v6.4.0 || ^v7.1.0", "yoast/phpunit-polyfills": "^2.0" }, "suggest": { @@ -109,6 +108,7 @@ "doctrine/cache": "To use the DoctrineCacheAdapter", "ext-curl": "To send requests using cURL", "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-pcntl": "To use client-side monitoring", "ext-sockets": "To use client-side monitoring" }, "type": "library", @@ -135,11 +135,11 @@ "authors": [ { "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" + "homepage": "https://aws.amazon.com" } ], "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", + "homepage": "https://aws.amazon.com/sdk-for-php", "keywords": [ "amazon", "aws", @@ -153,22 +153,22 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.365.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.373.6" }, - "time": "2025-12-02T16:06:36+00:00" + "time": "2026-03-19T19:38:25+00:00" }, { "name": "bacon/bacon-qr-code", - "version": "v3.0.3", + "version": "v3.0.4", "source": { "type": "git", "url": "https://github.com/Bacon/BaconQrCode.git", - "reference": "36a1cb2b81493fa5b82e50bf8068bf84d1542563" + "reference": "3feed0e212b8412cc5d2612706744789b0615824" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/36a1cb2b81493fa5b82e50bf8068bf84d1542563", - "reference": "36a1cb2b81493fa5b82e50bf8068bf84d1542563", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/3feed0e212b8412cc5d2612706744789b0615824", + "reference": "3feed0e212b8412cc5d2612706744789b0615824", "shasum": "" }, "require": { @@ -208,22 +208,22 @@ "homepage": "https://github.com/Bacon/BaconQrCode", "support": { "issues": "https://github.com/Bacon/BaconQrCode/issues", - "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.3" + "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.4" }, - "time": "2025-11-19T17:15:36+00:00" + "time": "2026-03-16T01:01:30+00:00" }, { "name": "brick/math", - "version": "0.14.1", + "version": "0.14.8", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "f05858549e5f9d7bb45875a75583240a38a281d0" + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/f05858549e5f9d7bb45875a75583240a38a281d0", - "reference": "f05858549e5f9d7bb45875a75583240a38a281d0", + "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629", + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629", "shasum": "" }, "require": { @@ -262,7 +262,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.14.1" + "source": "https://github.com/brick/math/tree/0.14.8" }, "funding": [ { @@ -270,7 +270,7 @@ "type": "github" } ], - "time": "2025-11-24T14:40:29+00:00" + "time": "2026-02-10T14:33:43+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -343,32 +343,33 @@ }, { "name": "darkaonline/l5-swagger", - "version": "8.6.5", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/DarkaOnLine/L5-Swagger.git", - "reference": "4cf2b3faae9e9cffd05e4eb6e066741bf56f0a85" + "reference": "2c26427f8c41db8e72232415e7287313e6b6a2e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DarkaOnLine/L5-Swagger/zipball/4cf2b3faae9e9cffd05e4eb6e066741bf56f0a85", - "reference": "4cf2b3faae9e9cffd05e4eb6e066741bf56f0a85", + "url": "https://api.github.com/repos/DarkaOnLine/L5-Swagger/zipball/2c26427f8c41db8e72232415e7287313e6b6a2e2", + "reference": "2c26427f8c41db8e72232415e7287313e6b6a2e2", "shasum": "" }, "require": { "doctrine/annotations": "^1.0 || ^2.0", "ext-json": "*", - "laravel/framework": "^11.0 || ^10.0 || ^9.0 || >=8.40.0 || ^7.0", - "php": "^7.2 || ^8.0", - "swagger-api/swagger-ui": "^3.0 || >=4.1.3", + "laravel/framework": "^12.0 || ^11.0", + "php": "^8.2", + "swagger-api/swagger-ui": ">=5.18.3", "symfony/yaml": "^5.0 || ^6.0 || ^7.0", - "zircote/swagger-php": "^3.2.0 || ^4.0.0" + "zircote/swagger-php": "^5.0.0" }, "require-dev": { "mockery/mockery": "1.*", - "orchestra/testbench": "^9.0 || ^8.0 || 7.* || ^6.15 || 5.*", + "orchestra/testbench": "^10.0 || ^9.0 || ^8.0 || 7.* || ^6.15 || 5.*", "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "^11.0 || ^10.0 || ^9.5" + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { @@ -411,7 +412,7 @@ ], "support": { "issues": "https://github.com/DarkaOnLine/L5-Swagger/issues", - "source": "https://github.com/DarkaOnLine/L5-Swagger/tree/8.6.5" + "source": "https://github.com/DarkaOnLine/L5-Swagger/tree/9.0.1" }, "funding": [ { @@ -419,7 +420,7 @@ "type": "github" } ], - "time": "2025-02-06T14:54:32+00:00" + "time": "2025-02-28T06:25:02+00:00" }, { "name": "dasprid/enum", @@ -625,16 +626,16 @@ }, { "name": "doctrine/dbal", - "version": "3.10.4", + "version": "3.10.5", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "63a46cb5aa6f60991186cc98c1d1b50c09311868" + "reference": "95d84866bf3c04b2ddca1df7c049714660959aef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/63a46cb5aa6f60991186cc98c1d1b50c09311868", - "reference": "63a46cb5aa6f60991186cc98c1d1b50c09311868", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/95d84866bf3c04b2ddca1df7c049714660959aef", + "reference": "95d84866bf3c04b2ddca1df7c049714660959aef", "shasum": "" }, "require": { @@ -655,9 +656,9 @@ "jetbrains/phpstorm-stubs": "2023.1", "phpstan/phpstan": "2.1.30", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "9.6.29", - "slevomat/coding-standard": "8.24.0", - "squizlabs/php_codesniffer": "4.0.0", + "phpunit/phpunit": "9.6.34", + "slevomat/coding-standard": "8.27.1", + "squizlabs/php_codesniffer": "4.0.1", "symfony/cache": "^5.4|^6.0|^7.0|^8.0", "symfony/console": "^4.4|^5.4|^6.0|^7.0|^8.0" }, @@ -719,7 +720,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.10.4" + "source": "https://github.com/doctrine/dbal/tree/3.10.5" }, "funding": [ { @@ -735,33 +736,33 @@ "type": "tidelift" } ], - "time": "2025-11-29T10:46:08+00:00" + "time": "2026-02-24T08:03:57+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -781,22 +782,22 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/event-manager", - "version": "2.0.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/dda33921b198841ca8dbad2eaa5d4d34769d18cf", + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf", "shasum": "" }, "require": { @@ -806,10 +807,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "doctrine/coding-standard": "^14", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/phpstan": "^2.1.32", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -858,7 +859,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + "source": "https://github.com/doctrine/event-manager/tree/2.1.1" }, "funding": [ { @@ -874,7 +875,7 @@ "type": "tidelift" } ], - "time": "2024-05-22T20:47:39+00:00" + "time": "2026-01-29T07:11:08+00:00" }, { "name": "doctrine/inflector", @@ -1176,16 +1177,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.1", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", "shasum": "" }, "require": { @@ -1233,9 +1234,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" + "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" }, - "time": "2025-04-09T20:32:01+00:00" + "time": "2026-02-25T22:16:40+00:00" }, { "name": "fruitcake/php-cors", @@ -1310,24 +1311,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.3", + "version": "v1.1.4", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3" + "phpoption/phpoption": "^1.9.5" }, "require-dev": { - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" }, "type": "library", "autoload": { @@ -1356,7 +1357,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" }, "funding": [ { @@ -1368,7 +1369,7 @@ "type": "tidelift" } ], - "time": "2024-07-20T21:45:45+00:00" + "time": "2025-12-27T19:43:20+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1581,16 +1582,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -1606,6 +1607,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { @@ -1677,7 +1679,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -1693,7 +1695,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "guzzlehttp/uri-template", @@ -1783,16 +1785,16 @@ }, { "name": "http-interop/http-factory-guzzle", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/http-interop/http-factory-guzzle.git", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" + "reference": "c2c859ceb05c3f42e710b60555f4c35b6a4a3995" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/c2c859ceb05c3f42e710b60555f4c35b6a4a3995", + "reference": "c2c859ceb05c3f42e710b60555f4c35b6a4a3995", "shasum": "" }, "require": { @@ -1835,37 +1837,37 @@ ], "support": { "issues": "https://github.com/http-interop/http-factory-guzzle/issues", - "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" + "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.1" }, - "time": "2021-07-21T13:50:14+00:00" + "time": "2025-12-15T11:28:16+00:00" }, { "name": "inertiajs/inertia-laravel", - "version": "v2.0.11", + "version": "v2.0.21", "source": { "type": "git", "url": "https://github.com/inertiajs/inertia-laravel.git", - "reference": "041e148b3228407b5abe584a4f02df2651ab4d85" + "reference": "fabf202a29023de5f2d59f1474271fa35f84f1d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/041e148b3228407b5abe584a4f02df2651ab4d85", - "reference": "041e148b3228407b5abe584a4f02df2651ab4d85", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/fabf202a29023de5f2d59f1474271fa35f84f1d4", + "reference": "fabf202a29023de5f2d59f1474271fa35f84f1d4", "shasum": "" }, "require": { "ext-json": "*", - "laravel/framework": "^10.0|^11.0|^12.0", + "laravel/framework": "^10.0|^11.0|^12.0|^13.0", "php": "^8.1.0", - "symfony/console": "^6.2|^7.0" + "symfony/console": "^6.2|^7.0|^8.0" }, "require-dev": { "guzzlehttp/guzzle": "^7.2", "larastan/larastan": "^3.0", "laravel/pint": "^1.16", "mockery/mockery": "^1.3.3", - "orchestra/testbench": "^8.0|^9.2|^10.0", - "phpunit/phpunit": "^10.4|^11.5", + "orchestra/testbench": "^8.0|^9.2|^10.0|^11.0", + "phpunit/phpunit": "^10.4|^11.5|^12.0", "roave/security-advisories": "dev-master" }, "suggest": { @@ -1905,31 +1907,31 @@ ], "support": { "issues": "https://github.com/inertiajs/inertia-laravel/issues", - "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.11" + "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.21" }, - "time": "2025-11-26T23:07:12+00:00" + "time": "2026-02-24T20:21:28+00:00" }, { "name": "lab404/laravel-impersonate", - "version": "1.7.7", + "version": "1.7.8", "source": { "type": "git", "url": "https://github.com/404labfr/laravel-impersonate.git", - "reference": "5033f3433a55ca8bb2cc3e4a018a39dd8a327a9f" + "reference": "0008a39da8914cc946b6a5ed211230708ee736b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/404labfr/laravel-impersonate/zipball/5033f3433a55ca8bb2cc3e4a018a39dd8a327a9f", - "reference": "5033f3433a55ca8bb2cc3e4a018a39dd8a327a9f", + "url": "https://api.github.com/repos/404labfr/laravel-impersonate/zipball/0008a39da8914cc946b6a5ed211230708ee736b3", + "reference": "0008a39da8914cc946b6a5ed211230708ee736b3", "shasum": "" }, "require": { - "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", + "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0 | ^13.0", "php": "^7.2 | ^8.0" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench": "^4.0 | ^5.0 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", + "orchestra/testbench": "^4.0 | ^5.0 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0", "phpunit/phpunit": "^7.5 | ^8.0 | ^9.0 | ^10.0 | ^11.0" }, "type": "library", @@ -1972,9 +1974,9 @@ ], "support": { "issues": "https://github.com/404labfr/laravel-impersonate/issues", - "source": "https://github.com/404labfr/laravel-impersonate/tree/1.7.7" + "source": "https://github.com/404labfr/laravel-impersonate/tree/1.7.8" }, - "time": "2025-02-24T16:18:38+00:00" + "time": "2026-03-17T15:24:14+00:00" }, { "name": "laminas/laminas-diactoros", @@ -2064,92 +2066,30 @@ ], "time": "2025-10-12T15:31:36+00:00" }, - { - "name": "larabug/larabug", - "version": "3.3", - "source": { - "type": "git", - "url": "https://github.com/LaraBug/LaraBug.git", - "reference": "e9dba4d38166372f3772b57f39296eb502c598d1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/LaraBug/LaraBug/zipball/e9dba4d38166372f3772b57f39296eb502c598d1", - "reference": "e9dba4d38166372f3772b57f39296eb502c598d1", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.0.2 || ^7.0", - "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "nesbot/carbon": "^2.62.1 || ^3.0", - "php": "^7.4 || ^8.0 || ^8.2 || ^8.3 || ^8.4" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.4", - "mockery/mockery": "^1.3.3 || ^1.4.2", - "orchestra/testbench": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", - "phpunit/phpunit": "^8.5.23 || ^9.5.12 || ^10.0.9 || ^11.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "LaraBug\\ServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "LaraBug\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nathan Geerinck", - "email": "nathan@intilli.be", - "role": "Owner" - } - ], - "description": "Laravel 6.x/7.x/8.x/9.x/10.x/11.x bug notifier", - "keywords": [ - "error", - "laravel", - "log" - ], - "support": { - "issues": "https://github.com/LaraBug/LaraBug/issues", - "source": "https://github.com/LaraBug/LaraBug/tree/3.3" - }, - "time": "2025-03-01T16:12:03+00:00" - }, { "name": "laravel/fortify", - "version": "v1.32.1", + "version": "v1.36.1", "source": { "type": "git", "url": "https://github.com/laravel/fortify.git", - "reference": "26db37ed915770e5f0f91f6b7e153d9b3e6c09e8" + "reference": "cad8bfeb63f6818f173d40090725c565c92651d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/26db37ed915770e5f0f91f6b7e153d9b3e6c09e8", - "reference": "26db37ed915770e5f0f91f6b7e153d9b3e6c09e8", + "url": "https://api.github.com/repos/laravel/fortify/zipball/cad8bfeb63f6818f173d40090725c565c92651d4", + "reference": "cad8bfeb63f6818f173d40090725c565c92651d4", "shasum": "" }, "require": { "bacon/bacon-qr-code": "^3.0", "ext-json": "*", - "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/console": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "php": "^8.1", - "pragmarx/google2fa": "^9.0", - "symfony/console": "^6.0|^7.0" + "pragmarx/google2fa": "^9.0" }, "require-dev": { - "orchestra/testbench": "^8.36|^9.15|^10.8", + "orchestra/testbench": "^8.36|^9.15|^10.8|^11.0", "phpstan/phpstan": "^1.10" }, "type": "library", @@ -2187,20 +2127,20 @@ "issues": "https://github.com/laravel/fortify/issues", "source": "https://github.com/laravel/fortify" }, - "time": "2025-11-21T01:53:28+00:00" + "time": "2026-03-10T19:59:49+00:00" }, { "name": "laravel/framework", - "version": "v12.41.1", + "version": "v12.55.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "3e229b05935fd0300c632fb1f718c73046d664fc" + "reference": "6d9185a248d101b07eecaf8fd60b18129545fd33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/3e229b05935fd0300c632fb1f718c73046d664fc", - "reference": "3e229b05935fd0300c632fb1f718c73046d664fc", + "url": "https://api.github.com/repos/laravel/framework/zipball/6d9185a248d101b07eecaf8fd60b18129545fd33", + "reference": "6d9185a248d101b07eecaf8fd60b18129545fd33", "shasum": "" }, "require": { @@ -2221,7 +2161,7 @@ "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.7", + "league/commonmark": "^2.8.1", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", @@ -2288,6 +2228,7 @@ "illuminate/process": "self.version", "illuminate/queue": "self.version", "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", "illuminate/routing": "self.version", "illuminate/session": "self.version", "illuminate/support": "self.version", @@ -2312,10 +2253,10 @@ "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", "opis/json-schema": "^2.4.1", - "orchestra/testbench-core": "^10.8.0", + "orchestra/testbench-core": "^10.9.0", "pda/pheanstalk": "^5.0.6|^7.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "^2.0", + "phpstan/phpstan": "^2.1.41", "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", "predis/predis": "^2.3|^3.0", "resend/resend-php": "^0.10.0|^1.0", @@ -2374,6 +2315,7 @@ "src/Illuminate/Filesystem/functions.php", "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", "src/Illuminate/Support/functions.php", "src/Illuminate/Support/helpers.php" ], @@ -2382,7 +2324,8 @@ "Illuminate\\Support\\": [ "src/Illuminate/Macroable/", "src/Illuminate/Collections/", - "src/Illuminate/Conditionable/" + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" ] } }, @@ -2406,40 +2349,41 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-12-03T01:02:13+00:00" + "time": "2026-03-18T14:28:59+00:00" }, { "name": "laravel/horizon", - "version": "v5.40.2", + "version": "v5.45.4", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "005e5638478db9e25f7ae5cfb30c56846fbad793" + "reference": "b2b32e3f6013081e0176307e9081cd085f0ad4d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/005e5638478db9e25f7ae5cfb30c56846fbad793", - "reference": "005e5638478db9e25f7ae5cfb30c56846fbad793", + "url": "https://api.github.com/repos/laravel/horizon/zipball/b2b32e3f6013081e0176307e9081cd085f0ad4d6", + "reference": "b2b32e3f6013081e0176307e9081cd085f0ad4d6", "shasum": "" }, "require": { "ext-json": "*", "ext-pcntl": "*", "ext-posix": "*", - "illuminate/contracts": "^9.21|^10.0|^11.0|^12.0", - "illuminate/queue": "^9.21|^10.0|^11.0|^12.0", - "illuminate/support": "^9.21|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/queue": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0|^13.0", + "laravel/sentinel": "^1.0", "nesbot/carbon": "^2.17|^3.0", "php": "^8.0", "ramsey/uuid": "^4.0", - "symfony/console": "^6.0|^7.0", - "symfony/error-handler": "^6.0|^7.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/error-handler": "^6.0|^7.0|^8.0", "symfony/polyfill-php83": "^1.28", - "symfony/process": "^6.0|^7.0" + "symfony/process": "^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.55|^8.36|^9.15|^10.8", + "orchestra/testbench": "^7.56|^8.37|^9.16|^10.9|^11.0", "phpstan/phpstan": "^1.10|^2.0", "predis/predis": "^1.1|^2.0|^3.0" }, @@ -2483,28 +2427,28 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.40.2" + "source": "https://github.com/laravel/horizon/tree/v5.45.4" }, - "time": "2025-11-28T20:12:12+00:00" + "time": "2026-03-18T14:14:59+00:00" }, { "name": "laravel/jetstream", - "version": "v5.4.0", + "version": "v5.5.1", "source": { "type": "git", "url": "https://github.com/laravel/jetstream.git", - "reference": "5a83a20b419c2b2c42a8c2407ca4647d8734456b" + "reference": "dbe57e175873fc62ea854eb689bb6afea1a6da71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/jetstream/zipball/5a83a20b419c2b2c42a8c2407ca4647d8734456b", - "reference": "5a83a20b419c2b2c42a8c2407ca4647d8734456b", + "url": "https://api.github.com/repos/laravel/jetstream/zipball/dbe57e175873fc62ea854eb689bb6afea1a6da71", + "reference": "dbe57e175873fc62ea854eb689bb6afea1a6da71", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^11.0|^12.0", - "illuminate/support": "^11.0|^12.0", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", "laravel/fortify": "^1.20", "mobiledetect/mobiledetectlib": "^4.8.08", "php": "^8.2.0", @@ -2515,7 +2459,7 @@ "laravel/sanctum": "^4.0", "livewire/livewire": "^3.3", "mockery/mockery": "^1.0", - "orchestra/testbench": "^9.15|^10.8", + "orchestra/testbench": "^9.15|^10.8|^11.0", "phpstan/phpstan": "^1.10" }, "type": "library", @@ -2551,31 +2495,31 @@ "issues": "https://github.com/laravel/jetstream/issues", "source": "https://github.com/laravel/jetstream" }, - "time": "2025-11-25T14:46:14+00:00" + "time": "2026-03-10T20:00:07+00:00" }, { "name": "laravel/octane", - "version": "v2.13.2", + "version": "v2.17.1", "source": { "type": "git", "url": "https://github.com/laravel/octane.git", - "reference": "5b963d2da879f2cad3a84f22bafd3d8be7170988" + "reference": "eb6150b9aa30956e3a2c04dfebf3a03c5d963a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/octane/zipball/5b963d2da879f2cad3a84f22bafd3d8be7170988", - "reference": "5b963d2da879f2cad3a84f22bafd3d8be7170988", + "url": "https://api.github.com/repos/laravel/octane/zipball/eb6150b9aa30956e3a2c04dfebf3a03c5d963a3a", + "reference": "eb6150b9aa30956e3a2c04dfebf3a03c5d963a3a", "shasum": "" }, "require": { "laminas/laminas-diactoros": "^3.0", - "laravel/framework": "^10.10.1|^11.0|^12.0", + "laravel/framework": "^10.10.1|^11.0|^12.0|^13.0", "laravel/prompts": "^0.1.24|^0.2.0|^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", "nesbot/carbon": "^2.66.0|^3.0", "php": "^8.1.0", - "symfony/console": "^6.0|^7.0", - "symfony/psr-http-message-bridge": "^2.2.0|^6.4|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/psr-http-message-bridge": "^2.2.0|^6.4|^7.0|^8.0" }, "conflict": { "spiral/roadrunner": "<2023.1.0", @@ -2588,11 +2532,10 @@ "laravel/scout": "^10.2.1", "laravel/socialite": "^5.6.1", "livewire/livewire": "^2.12.3|^3.0", - "mockery/mockery": "^1.5.1", "nunomaduro/collision": "^6.4.0|^7.5.2|^8.0", - "orchestra/testbench": "^8.21|^9.0|^10.0", + "orchestra/testbench": "^8.21|^9.0|^10.0|^11.0", "phpstan/phpstan": "^2.1.7", - "phpunit/phpunit": "^10.4|^11.5", + "phpunit/phpunit": "^10.4|^11.5|^12.0|^13.0", "spiral/roadrunner-cli": "^2.6.0", "spiral/roadrunner-http": "^3.3.0" }, @@ -2641,34 +2584,34 @@ "issues": "https://github.com/laravel/octane/issues", "source": "https://github.com/laravel/octane" }, - "time": "2025-11-28T20:13:00+00:00" + "time": "2026-03-18T14:14:24+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.8", + "version": "v0.3.15", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "096748cdfb81988f60090bbb839ce3205ace0d35" + "reference": "4bb8107ec97651fd3f17f897d6489dbc4d8fb999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/096748cdfb81988f60090bbb839ce3205ace0d35", - "reference": "096748cdfb81988f60090bbb839ce3205ace0d35", + "url": "https://api.github.com/repos/laravel/prompts/zipball/4bb8107ec97651fd3f17f897d6489dbc4d8fb999", + "reference": "4bb8107ec97651fd3f17f897d6489dbc4d8fb999", "shasum": "" }, "require": { "composer-runtime-api": "^2.2", "ext-mbstring": "*", "php": "^8.1", - "symfony/console": "^6.2|^7.0" + "symfony/console": "^6.2|^7.0|^8.0" }, "conflict": { "illuminate/console": ">=10.17.0 <10.25.0", "laravel/framework": ">=10.17.0 <10.25.0" }, "require-dev": { - "illuminate/collections": "^10.0|^11.0|^12.0", + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", "mockery/mockery": "^1.5", "pestphp/pest": "^2.3|^3.4|^4.0", "phpstan/phpstan": "^1.12.28", @@ -2698,36 +2641,36 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.8" + "source": "https://github.com/laravel/prompts/tree/v0.3.15" }, - "time": "2025-11-21T20:52:52+00:00" + "time": "2026-03-17T13:45:17+00:00" }, { "name": "laravel/sanctum", - "version": "v4.2.1", + "version": "v4.3.1", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "f5fb373be39a246c74a060f2cf2ae2c2145b3664" + "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/f5fb373be39a246c74a060f2cf2ae2c2145b3664", - "reference": "f5fb373be39a246c74a060f2cf2ae2c2145b3664", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", + "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^11.0|^12.0", - "illuminate/contracts": "^11.0|^12.0", - "illuminate/database": "^11.0|^12.0", - "illuminate/support": "^11.0|^12.0", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", "php": "^8.2", - "symfony/console": "^7.0" + "symfony/console": "^7.0|^8.0" }, "require-dev": { "mockery/mockery": "^1.6", - "orchestra/testbench": "^9.15|^10.8", + "orchestra/testbench": "^9.15|^10.8|^11.0", "phpstan/phpstan": "^1.10" }, "type": "library", @@ -2763,32 +2706,32 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2025-11-21T13:59:03+00:00" + "time": "2026-02-07T17:19:31+00:00" }, { "name": "laravel/scout", - "version": "v10.22.1", + "version": "v10.25.0", "source": { "type": "git", "url": "https://github.com/laravel/scout.git", - "reference": "13ed8e0eeaddd894bf360b85cb873980de19dbaf" + "reference": "f28630dca44a63d80c15e596bedc5af42c8985d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/scout/zipball/13ed8e0eeaddd894bf360b85cb873980de19dbaf", - "reference": "13ed8e0eeaddd894bf360b85cb873980de19dbaf", + "url": "https://api.github.com/repos/laravel/scout/zipball/f28630dca44a63d80c15e596bedc5af42c8985d5", + "reference": "f28630dca44a63d80c15e596bedc5af42c8985d5", "shasum": "" }, "require": { - "illuminate/bus": "^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0", - "illuminate/database": "^9.0|^10.0|^11.0|^12.0", - "illuminate/http": "^9.0|^10.0|^11.0|^12.0", - "illuminate/pagination": "^9.0|^10.0|^11.0|^12.0", - "illuminate/queue": "^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^9.0|^10.0|^11.0|^12.0", + "illuminate/bus": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/database": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/pagination": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/queue": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^8.0", - "symfony/console": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0" }, "conflict": { "algolia/algoliasearch-client-php": "<3.2.0|>=5.0.0" @@ -2797,7 +2740,7 @@ "algolia/algoliasearch-client-php": "^3.2|^4.0", "meilisearch/meilisearch-php": "^1.0", "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.31|^8.36|^9.15|^10.8", + "orchestra/testbench": "^7.31|^8.36|^9.15|^10.8|^11.0", "php-http/guzzle7-adapter": "^1.0", "phpstan/phpstan": "^1.10", "typesense/typesense-php": "^4.9.3" @@ -2843,31 +2786,90 @@ "issues": "https://github.com/laravel/scout/issues", "source": "https://github.com/laravel/scout" }, - "time": "2025-11-25T15:19:35+00:00" + "time": "2026-03-10T16:16:46+00:00" + }, + { + "name": "laravel/sentinel", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sentinel.git", + "reference": "7a98db53e0d9d6f61387f3141c07477f97425603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sentinel/zipball/7a98db53e0d9d6f61387f3141c07477f97425603", + "reference": "7a98db53e0d9d6f61387f3141c07477f97425603", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/container": "^8.37|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0" + }, + "require-dev": { + "laravel/pint": "^1.27", + "orchestra/testbench": "^6.47.1|^7.56|^8.37|^9.16|^10.9|^11.0", + "phpstan/phpstan": "^2.1.33" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sentinel\\SentinelServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sentinel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "mior@laravel.com" + } + ], + "support": { + "source": "https://github.com/laravel/sentinel/tree/v1.0.1" + }, + "time": "2026-02-12T13:32:54+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.7", + "version": "v2.0.10", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd" + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/cb291e4c998ac50637c7eeb58189c14f5de5b9dd", - "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.67|^3.0", "pestphp/pest": "^2.36|^3.0|^4.0", "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "type": "library", "extra": { @@ -2904,36 +2906,36 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2025-11-21T20:52:36+00:00" + "time": "2026-02-20T19:59:49+00:00" }, { "name": "laravel/socialite", - "version": "v5.23.2", + "version": "v5.25.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "41e65d53762d33d617bf0253330d672cb95e624b" + "reference": "231f572e1a37c9ca1fb8085e9fb8608285beafb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/41e65d53762d33d617bf0253330d672cb95e624b", - "reference": "41e65d53762d33d617bf0253330d672cb95e624b", + "url": "https://api.github.com/repos/laravel/socialite/zipball/231f572e1a37c9ca1fb8085e9fb8608285beafb3", + "reference": "231f572e1a37c9ca1fb8085e9fb8608285beafb3", "shasum": "" }, "require": { "ext-json": "*", - "firebase/php-jwt": "^6.4", + "firebase/php-jwt": "^6.4|^7.0", "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", "league/oauth1-client": "^1.11", "php": "^7.2|^8.0", "phpseclib/phpseclib": "^3.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8", + "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8|^11.0", "phpstan/phpstan": "^1.12.23", "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5|^12.0" }, @@ -2976,20 +2978,20 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2025-11-21T14:00:38+00:00" + "time": "2026-02-27T13:56:35+00:00" }, { "name": "laravel/tinker", - "version": "v2.10.2", + "version": "v2.11.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c" + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/3bcb5f62d6f837e0f093a601e26badafb127bd4c", - "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", "shasum": "" }, "require": { @@ -2998,7 +3000,7 @@ "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^7.2.5|^8.0", "psy/psysh": "^0.11.1|^0.12.0", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", @@ -3040,22 +3042,22 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.10.2" + "source": "https://github.com/laravel/tinker/tree/v2.11.1" }, - "time": "2025-11-20T16:29:12+00:00" + "time": "2026-02-06T14:12:35+00:00" }, { "name": "league/commonmark", - "version": "2.8.0", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", "shasum": "" }, "require": { @@ -3080,9 +3082,9 @@ "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, @@ -3149,7 +3151,7 @@ "type": "tidelift" } ], - "time": "2025-11-26T21:48:24+00:00" + "time": "2026-03-19T13:16:38+00:00" }, { "name": "league/config", @@ -3235,16 +3237,16 @@ }, { "name": "league/flysystem", - "version": "3.30.2", + "version": "3.32.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277" + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", - "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725", + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725", "shasum": "" }, "require": { @@ -3312,22 +3314,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.30.2" + "source": "https://github.com/thephpleague/flysystem/tree/3.32.0" }, - "time": "2025-11-10T17:13:11+00:00" + "time": "2026-02-25T17:01:41+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.30.1", + "version": "3.32.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "d286e896083bed3190574b8b088b557b59eb66f5" + "reference": "a1979df7c9784d334ea6df356aed3d18ac6673d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/d286e896083bed3190574b8b088b557b59eb66f5", - "reference": "d286e896083bed3190574b8b088b557b59eb66f5", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/a1979df7c9784d334ea6df356aed3d18ac6673d0", + "reference": "a1979df7c9784d334ea6df356aed3d18ac6673d0", "shasum": "" }, "require": { @@ -3367,22 +3369,22 @@ "storage" ], "support": { - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.30.1" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.32.0" }, - "time": "2025-10-20T15:27:33+00:00" + "time": "2026-02-25T16:46:44+00:00" }, { "name": "league/flysystem-local", - "version": "3.30.2", + "version": "3.31.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d" + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ab4f9d0d672f601b102936aa728801dd1a11968d", - "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", "shasum": "" }, "require": { @@ -3416,22 +3418,22 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.2" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" }, - "time": "2025-11-10T11:23:37+00:00" + "time": "2026-01-23T15:30:45+00:00" }, { "name": "league/flysystem-ziparchive", - "version": "3.29.0", + "version": "3.31.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-ziparchive.git", - "reference": "7f1a2c5655be4c6e0d45574153bb5753c8afa4b7" + "reference": "ab6f9041b61ef517bc3e81891a4969181a39c17a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-ziparchive/zipball/7f1a2c5655be4c6e0d45574153bb5753c8afa4b7", - "reference": "7f1a2c5655be4c6e0d45574153bb5753c8afa4b7", + "url": "https://api.github.com/repos/thephpleague/flysystem-ziparchive/zipball/ab6f9041b61ef517bc3e81891a4969181a39c17a", + "reference": "ab6f9041b61ef517bc3e81891a4969181a39c17a", "shasum": "" }, "require": { @@ -3465,9 +3467,9 @@ "zip" ], "support": { - "source": "https://github.com/thephpleague/flysystem-ziparchive/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem-ziparchive/tree/3.31.0" }, - "time": "2024-08-09T21:24:39+00:00" + "time": "2026-01-23T15:30:45+00:00" }, { "name": "league/mime-type-detection", @@ -3603,20 +3605,20 @@ }, { "name": "league/uri", - "version": "7.6.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "f625804987a0a9112d954f9209d91fec52182344" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/f625804987a0a9112d954f9209d91fec52182344", - "reference": "f625804987a0a9112d954f9209d91fec52182344", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.6", + "league/uri-interfaces": "^7.8.1", "php": "^8.1", "psr/http-factory": "^1" }, @@ -3630,11 +3632,11 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "ext-uri": "to use the PHP native URI class", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -3689,7 +3691,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.6.0" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -3697,20 +3699,20 @@ "type": "github" } ], - "time": "2025-11-18T12:17:23+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.6.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "ccbfb51c0445298e7e0b7f4481b942f589665368" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/ccbfb51c0445298e7e0b7f4481b942f589665368", - "reference": "ccbfb51c0445298e7e0b7f4481b942f589665368", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { @@ -3723,7 +3725,7 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -3773,7 +3775,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.6.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -3781,20 +3783,20 @@ "type": "github" } ], - "time": "2025-11-18T12:17:23+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "maennchen/zipstream-php", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "9712d8fa4cdf9240380b01eb4be55ad8dcf71416" + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/9712d8fa4cdf9240380b01eb4be55ad8dcf71416", - "reference": "9712d8fa4cdf9240380b01eb4be55ad8dcf71416", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5", + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5", "shasum": "" }, "require": { @@ -3805,7 +3807,7 @@ "require-dev": { "brianium/paratest": "^7.7", "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.16", + "friendsofphp/php-cs-fixer": "^3.86", "guzzlehttp/guzzle": "^7.5", "mikey179/vfsstream": "^1.6", "php-coveralls/php-coveralls": "^2.5", @@ -3851,7 +3853,7 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.0" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1" }, "funding": [ { @@ -3859,7 +3861,7 @@ "type": "github" } ], - "time": "2025-07-17T11:15:13+00:00" + "time": "2025-12-10T09:58:31+00:00" }, { "name": "maize-tech/laravel-markable", @@ -4022,29 +4024,28 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "4.8.09", + "version": "4.8.10", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "a06fe2e546a06bb8c2639d6823d5250b2efb3209" + "reference": "96b1e1fa9a968de7660a031106ab529f659d0192" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/a06fe2e546a06bb8c2639d6823d5250b2efb3209", - "reference": "a06fe2e546a06bb8c2639d6823d5250b2efb3209", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96b1e1fa9a968de7660a031106ab529f659d0192", + "reference": "96b1e1fa9a968de7660a031106ab529f659d0192", "shasum": "" }, "require": { "php": ">=8.0", - "psr/cache": "^3.0", "psr/simple-cache": "^3" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.65.0", + "friendsofphp/php-cs-fixer": "^v3.75.0", "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.12.x-dev", - "phpunit/phpunit": "^9.6.18", - "squizlabs/php_codesniffer": "^3.11.1" + "phpstan/phpstan": "^2.1.11", + "phpunit/phpunit": "^9.6.22", + "squizlabs/php_codesniffer": "^3.12.1" }, "type": "library", "autoload": { @@ -4075,7 +4076,7 @@ ], "support": { "issues": "https://github.com/serbanghita/Mobile-Detect/issues", - "source": "https://github.com/serbanghita/Mobile-Detect/tree/4.8.09" + "source": "https://github.com/serbanghita/Mobile-Detect/tree/4.8.10" }, "funding": [ { @@ -4083,20 +4084,20 @@ "type": "github" } ], - "time": "2024-12-10T15:32:06+00:00" + "time": "2026-01-09T16:21:59+00:00" }, { "name": "monolog/monolog", - "version": "3.9.0", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", "shasum": "" }, "require": { @@ -4114,7 +4115,7 @@ "graylog2/gelf-php": "^1.4.2 || ^2.0", "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", + "mongodb/mongodb": "^1.8 || ^2.0", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.8", "phpstan/phpstan": "^2", @@ -4174,7 +4175,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" }, "funding": [ { @@ -4186,30 +4187,30 @@ "type": "tidelift" } ], - "time": "2025-03-24T10:02:05+00:00" + "time": "2026-01-02T08:56:05+00:00" }, { "name": "mpociot/versionable", - "version": "4.4.5", + "version": "4.4.7", "source": { "type": "git", "url": "https://github.com/mpociot/versionable.git", - "reference": "25b1c606a319796f8e1023131d5529856cd84042" + "reference": "355db8488f2cbe8944cac41109be7b0e656cf977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mpociot/versionable/zipball/25b1c606a319796f8e1023131d5529856cd84042", - "reference": "25b1c606a319796f8e1023131d5529856cd84042", + "url": "https://api.github.com/repos/mpociot/versionable/zipball/355db8488f2cbe8944cac41109be7b0e656cf977", + "reference": "355db8488f2cbe8944cac41109be7b0e656cf977", "shasum": "" }, "require": { - "illuminate/support": "~5.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "illuminate/support": "~5.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0", "php": ">=7.1.0 || >=7.2.5 || >=8.0 || >=8.1 || >= 8.2" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^3.1 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.5.3" + "orchestra/testbench": "^3.1 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.5.3 || ^12.5.12" }, "type": "library", "extra": { @@ -4252,7 +4253,7 @@ "issues": "https://github.com/mpociot/versionable/issues", "source": "https://github.com/mpociot/versionable" }, - "time": "2025-02-25T10:43:28+00:00" + "time": "2026-02-25T20:52:23+00:00" }, { "name": "mtdowling/jmespath.php", @@ -4322,16 +4323,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.0", + "version": "3.11.3", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", "shasum": "" }, "require": { @@ -4355,7 +4356,7 @@ "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan": "^2.1.22", "phpunit/phpunit": "^10.5.53", - "squizlabs/php_codesniffer": "^3.13.4" + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" }, "bin": [ "bin/carbon" @@ -4398,14 +4399,14 @@ } ], "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "homepage": "https://carbonphp.github.io/carbon/", "keywords": [ "date", "datetime", "time" ], "support": { - "docs": "https://carbon.nesbot.com/docs", + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", "issues": "https://github.com/CarbonPHP/carbon/issues", "source": "https://github.com/CarbonPHP/carbon" }, @@ -4423,20 +4424,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T21:04:28+00:00" + "time": "2026-03-11T17:23:39+00:00" }, { "name": "nette/schema", - "version": "v1.3.3", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004" + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", "shasum": "" }, "require": { @@ -4444,8 +4445,10 @@ "php": "8.1 - 8.5" }, "require-dev": { - "nette/tester": "^2.5.2", - "phpstan/phpstan-nette": "^2.0@stable", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -4486,22 +4489,22 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.3" + "source": "https://github.com/nette/schema/tree/v1.3.5" }, - "time": "2025-10-30T22:57:59+00:00" + "time": "2026-02-23T03:47:12+00:00" }, { "name": "nette/utils", - "version": "v4.1.0", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { @@ -4513,8 +4516,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -4575,22 +4580,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.0" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2025-12-01T17:49:23+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nikic/php-parser", - "version": "v5.6.2", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "3a454ca033b9e06b63282ce19562e892747449bb" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", - "reference": "3a454ca033b9e06b63282ce19562e892747449bb", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -4633,37 +4638,37 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2025-10-21T19:32:17+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "nunomaduro/termwind", - "version": "v2.3.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017" + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^8.2", - "symfony/console": "^7.3.6" + "symfony/console": "^7.4.4 || ^8.0.4" }, "require-dev": { - "illuminate/console": "^11.46.1", - "laravel/pint": "^1.25.1", + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", "phpstan/phpstan": "^1.12.32", "phpstan/phpstan-strict-rules": "^1.6.2", - "symfony/var-dumper": "^7.3.5", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -4695,7 +4700,7 @@ "email": "enunomaduro@gmail.com" } ], - "description": "Its like Tailwind CSS, but for the console.", + "description": "It's like Tailwind CSS, but for the console.", "keywords": [ "cli", "console", @@ -4706,7 +4711,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3" + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" }, "funding": [ { @@ -4722,33 +4727,33 @@ "type": "github" } ], - "time": "2025-11-20T02:34:59+00:00" + "time": "2026-02-16T23:10:27+00:00" }, { "name": "owen-it/laravel-auditing", - "version": "v14.0.0", + "version": "v14.0.2", "source": { "type": "git", "url": "https://github.com/owen-it/laravel-auditing.git", - "reference": "f92602d1b3f53df29ddd577290e9d735ea707c53" + "reference": "c516bdfe516f450a067f2036ec1f6088227962e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/f92602d1b3f53df29ddd577290e9d735ea707c53", - "reference": "f92602d1b3f53df29ddd577290e9d735ea707c53", + "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/c516bdfe516f450a067f2036ec1f6088227962e5", + "reference": "c516bdfe516f450a067f2036ec1f6088227962e5", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^11.0|^12.0", - "illuminate/database": "^11.0|^12.0", - "illuminate/filesystem": "^11.0|^12.0", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/filesystem": "^11.0|^12.0|^13.0", "php": "^8.2" }, "require-dev": { "mockery/mockery": "^1.5.1", - "orchestra/testbench": "^9.0|^10.0", - "phpunit/phpunit": "^11.0" + "orchestra/testbench": "^9.0|^10.0|^11.0", + "phpunit/phpunit": "^11.0|^12.5.12" }, "type": "package", "extra": { @@ -4806,7 +4811,7 @@ "issues": "https://github.com/owen-it/laravel-auditing/issues", "source": "https://github.com/owen-it/laravel-auditing" }, - "time": "2025-02-26T16:40:54+00:00" + "time": "2026-03-18T15:00:52+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -4927,6 +4932,235 @@ }, "time": "2020-10-15T08:29:30+00:00" }, + { + "name": "pear/archive_tar", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/pear/Archive_Tar.git", + "reference": "dc3285537f1832da8ddbbe45f5a007248b6cc00e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/dc3285537f1832da8ddbbe45f5a007248b6cc00e", + "reference": "dc3285537f1832da8ddbbe45f5a007248b6cc00e", + "shasum": "" + }, + "require": { + "pear/pear-core-minimal": "^1.10.0alpha2", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-bz2": "Bz2 compression support.", + "ext-xz": "Lzma2 compression support.", + "ext-zlib": "Gzip compression support." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Archive_Tar": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "./" + ], + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Vincent Blavet", + "email": "vincent@phpconcept.net" + }, + { + "name": "Greg Beaver", + "email": "greg@chiaraquartet.net" + }, + { + "name": "Michiel Rook", + "email": "mrook@php.net" + } + ], + "description": "Tar file management class with compression support (gzip, bzip2, lzma2)", + "homepage": "https://github.com/pear/Archive_Tar", + "keywords": [ + "archive", + "tar" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Archive_Tar", + "source": "https://github.com/pear/Archive_Tar" + }, + "time": "2025-07-19T14:49:16+00:00" + }, + { + "name": "pear/console_getopt", + "version": "v1.4.3", + "source": { + "type": "git", + "url": "https://github.com/pear/Console_Getopt.git", + "reference": "a41f8d3e668987609178c7c4a9fe48fecac53fa0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Console_Getopt/zipball/a41f8d3e668987609178c7c4a9fe48fecac53fa0", + "reference": "a41f8d3e668987609178c7c4a9fe48fecac53fa0", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Console": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "./" + ], + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Andrei Zmievski", + "email": "andrei@php.net", + "role": "Lead" + }, + { + "name": "Stig Bakken", + "email": "stig@php.net", + "role": "Developer" + }, + { + "name": "Greg Beaver", + "email": "cellog@php.net", + "role": "Helper" + } + ], + "description": "More info available on: http://pear.php.net/package/Console_Getopt", + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Console_Getopt", + "source": "https://github.com/pear/Console_Getopt" + }, + "time": "2019-11-20T18:27:48+00:00" + }, + { + "name": "pear/pear-core-minimal", + "version": "v1.10.18", + "source": { + "type": "git", + "url": "https://github.com/pear/pear-core-minimal.git", + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c7b55789d01de0ce090d289b73f1bbd6a2f113b1", + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1", + "shasum": "" + }, + "require": { + "pear/console_getopt": "~1.4", + "pear/pear_exception": "~1.0", + "php": ">=5.4" + }, + "replace": { + "rsky/pear-core-min": "self.version" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "src/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@php.net", + "role": "Lead" + } + ], + "description": "Minimal set of PEAR core files to be used as composer dependency", + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", + "source": "https://github.com/pear/pear-core-minimal" + }, + "time": "2025-12-14T20:37:07+00:00" + }, + { + "name": "pear/pear_exception", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/pear/PEAR_Exception.git", + "reference": "b14fbe2ddb0b9f94f5b24cf08783d599f776fff0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/b14fbe2ddb0b9f94f5b24cf08783d599f776fff0", + "reference": "b14fbe2ddb0b9f94f5b24cf08783d599f776fff0", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "<9" + }, + "type": "class", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "PEAR/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "." + ], + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Helgi Thormar", + "email": "dufuz@php.net" + }, + { + "name": "Greg Beaver", + "email": "cellog@php.net" + } + ], + "description": "The PEAR Exception base class.", + "homepage": "https://github.com/pear/PEAR_Exception", + "keywords": [ + "exception" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR_Exception", + "source": "https://github.com/pear/PEAR_Exception" + }, + "time": "2021-03-21T15:43:46+00:00" + }, { "name": "php-http/discovery", "version": "1.20.0", @@ -5008,16 +5242,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.4", + "version": "1.9.5", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", - "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", "shasum": "" }, "require": { @@ -5067,7 +5301,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" }, "funding": [ { @@ -5079,20 +5313,20 @@ "type": "tidelift" } ], - "time": "2025-08-21T11:53:16+00:00" + "time": "2025-12-27T19:41:33+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.47", + "version": "3.0.50", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d" + "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/9d6ca36a6c2dd434765b1071b2644a1c683b385d", - "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", + "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", "shasum": "" }, "require": { @@ -5173,7 +5407,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.47" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.50" }, "funding": [ { @@ -5189,39 +5423,86 @@ "type": "tidelift" } ], - "time": "2025-10-06T01:07:24+00:00" + "time": "2026-03-19T02:57:58+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" + }, + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "11.0.11", + "version": "11.0.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", - "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", + "nikic/php-parser": "^5.7.0", "php": ">=8.2", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-text-template": "^4.0.1", "sebastian/code-unit-reverse-lookup": "^4.0.1", "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", + "sebastian/environment": "^7.2.1", "sebastian/lines-of-code": "^3.0.1", "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.2.3" + "theseer/tokenizer": "^1.3.1" }, "require-dev": { - "phpunit/phpunit": "^11.5.2" + "phpunit/phpunit": "^11.5.46" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -5259,7 +5540,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" }, "funding": [ { @@ -5279,32 +5560,32 @@ "type": "tidelift" } ], - "time": "2025-08-27T14:37:49+00:00" + "time": "2025-12-24T07:01:01+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -5332,15 +5613,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2026-02-02T13:52:54+00:00" }, { "name": "phpunit/php-text-template", @@ -5979,16 +6272,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.15", + "version": "v0.12.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "38953bc71491c838fcb6ebcbdc41ab7483cd549c" + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/38953bc71491c838fcb6ebcbdc41ab7483cd549c", - "reference": "38953bc71491c838fcb6ebcbdc41ab7483cd549c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", "shasum": "" }, "require": { @@ -5996,8 +6289,8 @@ "ext-tokenizer": "*", "nikic/php-parser": "^5.0 || ^4.0", "php": "^8.0 || ^7.4", - "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", - "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" }, "conflict": { "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" @@ -6052,9 +6345,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.15" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.21" }, - "time": "2025-11-28T00:00:14+00:00" + "time": "2026-03-06T21:21:28+00:00" }, { "name": "ralouphie/getallheaders", @@ -6178,20 +6471,20 @@ }, { "name": "ramsey/uuid", - "version": "4.9.1", + "version": "4.9.2", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440" + "reference": "8429c78ca35a09f27565311b98101e2826affde0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440", - "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -6250,9 +6543,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.9.1" + "source": "https://github.com/ramsey/uuid/tree/4.9.2" }, - "time": "2025-09-04T20:59:21+00:00" + "time": "2025-12-14T04:43:48+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6558,22 +6851,22 @@ }, { "name": "socialiteproviders/manager", - "version": "v4.8.1", + "version": "4.9.2", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "8180ec14bef230ec2351cff993d5d2d7ca470ef4" + "reference": "35372dc62787e61e91cfec73f45fd5d5ae0f8891" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/8180ec14bef230ec2351cff993d5d2d7ca470ef4", - "reference": "8180ec14bef230ec2351cff993d5d2d7ca470ef4", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/35372dc62787e61e91cfec73f45fd5d5ae0f8891", + "reference": "35372dc62787e61e91cfec73f45fd5d5ae0f8891", "shasum": "" }, "require": { - "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "illuminate/support": "^11.0 || ^12.0 || ^13.0", "laravel/socialite": "^5.5", - "php": "^8.1" + "php": "^8.2" }, "require-dev": { "mockery/mockery": "^1.2", @@ -6583,76 +6876,13 @@ "extra": { "laravel": { "providers": [ - "SocialiteProviders\\Manager\\ServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "SocialiteProviders\\Manager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Andy Wendt", - "email": "andy@awendt.com" - }, - { - "name": "Anton Komarev", - "email": "a.komarev@cybercog.su" - }, - { - "name": "Miguel Piedrafita", - "email": "soy@miguelpiedrafita.com" - }, - { - "name": "atymic", - "email": "atymicq@gmail.com", - "homepage": "https://atymic.dev" - } - ], - "description": "Easily add new or override built-in providers in Laravel Socialite.", - "homepage": "https://socialiteproviders.com", - "keywords": [ - "laravel", - "manager", - "oauth", - "providers", - "socialite" - ], - "support": { - "issues": "https://github.com/socialiteproviders/manager/issues", - "source": "https://github.com/socialiteproviders/manager" - }, - "time": "2025-02-24T19:33:30+00:00" - }, - { - "name": "socialiteproviders/orcid", - "version": "5.1.0", - "source": { - "type": "git", - "url": "https://github.com/SocialiteProviders/Orcid.git", - "reference": "9a61194bd23394b851ef6d879991ebc284cd74d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Orcid/zipball/9a61194bd23394b851ef6d879991ebc284cd74d8", - "reference": "9a61194bd23394b851ef6d879991ebc284cd74d8", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^8.0", - "socialiteproviders/manager": "^4.4" + "SocialiteProviders\\Manager\\ServiceProvider" + ] + } }, - "type": "library", "autoload": { "psr-4": { - "SocialiteProviders\\Orcid\\": "" + "SocialiteProviders\\Manager\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6661,37 +6891,50 @@ ], "authors": [ { - "name": "Ben Cornwell", - "email": "ben@bencornwell.com" + "name": "Andy Wendt", + "email": "andy@awendt.com" + }, + { + "name": "Anton Komarev", + "email": "a.komarev@cybercog.su" + }, + { + "name": "Miguel Piedrafita", + "email": "soy@miguelpiedrafita.com" + }, + { + "name": "atymic", + "email": "atymicq@gmail.com", + "homepage": "https://atymic.dev" } ], - "description": "ORCID OAuth2 Provider for Laravel Socialite", + "description": "Easily add new or override built-in providers in Laravel Socialite.", + "homepage": "https://socialiteproviders.com", "keywords": [ "laravel", + "manager", "oauth", - "orcid", - "provider", + "providers", "socialite" ], "support": { - "docs": "https://socialiteproviders.com/orcid", - "issues": "https://github.com/socialiteproviders/providers/issues", - "source": "https://github.com/socialiteproviders/providers" + "issues": "https://github.com/socialiteproviders/manager/issues", + "source": "https://github.com/socialiteproviders/manager" }, - "time": "2024-02-01T18:57:00+00:00" + "time": "2026-03-18T22:13:24+00:00" }, { "name": "spatie/db-dumper", - "version": "3.8.1", + "version": "3.8.3", "source": { "type": "git", "url": "https://github.com/spatie/db-dumper.git", - "reference": "e974cc7862b8de1bd3b7ea7d4839ba7167acb546" + "reference": "eac3221fbe27fac51f388600d27b67b1b079406e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/e974cc7862b8de1bd3b7ea7d4839ba7167acb546", - "reference": "e974cc7862b8de1bd3b7ea7d4839ba7167acb546", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/eac3221fbe27fac51f388600d27b67b1b079406e", + "reference": "eac3221fbe27fac51f388600d27b67b1b079406e", "shasum": "" }, "require": { @@ -6729,7 +6972,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/db-dumper/tree/3.8.1" + "source": "https://github.com/spatie/db-dumper/tree/3.8.3" }, "funding": [ { @@ -6741,32 +6984,32 @@ "type": "github" } ], - "time": "2025-11-26T09:51:23+00:00" + "time": "2026-01-05T16:26:03+00:00" }, { "name": "spatie/eloquent-sortable", - "version": "4.5.2", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/spatie/eloquent-sortable.git", - "reference": "c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20" + "reference": "caf2596e5df0260d0e2863e89b750611eef2fc59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20", - "reference": "c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20", + "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/caf2596e5df0260d0e2863e89b750611eef2fc59", + "reference": "caf2596e5df0260d0e2863e89b750611eef2fc59", "shasum": "" }, "require": { - "illuminate/database": "^9.31|^10.0|^11.0|^12.0", - "illuminate/support": "^9.31|^10.0|^11.0|^12.0", + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.63|^3.0", - "php": "^8.1", + "php": "^8.2", "spatie/laravel-package-tools": "^1.9" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", - "phpunit/phpunit": "^9.5|^10.0|^11.5.3" + "orchestra/testbench": "^8.0|^9.6|^10.0|^11.0", + "phpunit/phpunit": "^10.0|^11.5.3|^12.0" }, "type": "library", "extra": { @@ -6803,7 +7046,7 @@ ], "support": { "issues": "https://github.com/spatie/eloquent-sortable/issues", - "source": "https://github.com/spatie/eloquent-sortable/tree/4.5.2" + "source": "https://github.com/spatie/eloquent-sortable/tree/5.0.1" }, "funding": [ { @@ -6815,20 +7058,20 @@ "type": "github" } ], - "time": "2025-08-25T11:46:57+00:00" + "time": "2026-02-21T21:26:43+00:00" }, { "name": "spatie/laravel-backup", - "version": "9.3.7", + "version": "9.4.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-backup.git", - "reference": "6aa2d0ef42218ba6c1f627a17ade3e1ffd0e18af" + "reference": "0dff805039617b4a6f48291cef0697a73bc0392e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/6aa2d0ef42218ba6c1f627a17ade3e1ffd0e18af", - "reference": "6aa2d0ef42218ba6c1f627a17ade3e1ffd0e18af", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/0dff805039617b4a6f48291cef0697a73bc0392e", + "reference": "0dff805039617b4a6f48291cef0697a73bc0392e", "shasum": "" }, "require": { @@ -6903,7 +7146,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-backup/issues", - "source": "https://github.com/spatie/laravel-backup/tree/9.3.7" + "source": "https://github.com/spatie/laravel-backup/tree/9.4.1" }, "funding": [ { @@ -6915,33 +7158,33 @@ "type": "other" } ], - "time": "2025-11-26T15:43:43+00:00" + "time": "2026-02-15T19:05:20+00:00" }, { "name": "spatie/laravel-cookie-consent", - "version": "3.3.3", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-cookie-consent.git", - "reference": "fa375d4c9cae8745137ec3249e1b8e35d911963a" + "reference": "67a7717c2ed43fa27dd24a5df2a71272b47937b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-cookie-consent/zipball/fa375d4c9cae8745137ec3249e1b8e35d911963a", - "reference": "fa375d4c9cae8745137ec3249e1b8e35d911963a", + "url": "https://api.github.com/repos/spatie/laravel-cookie-consent/zipball/67a7717c2ed43fa27dd24a5df2a71272b47937b4", + "reference": "67a7717c2ed43fa27dd24a5df2a71272b47937b4", "shasum": "" }, "require": { - "illuminate/cookie": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "illuminate/view": "^10.0|^11.0|^12.0", + "illuminate/cookie": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "illuminate/view": "^11.0|^12.0|^13.0", "php": "^8.2", "spatie/laravel-package-tools": "^1.9" }, "require-dev": { "fakerphp/faker": "^1.9", - "orchestra/testbench": "^8.0|^9.0|^10.0", - "pestphp/pest": "^2.34|^3.7" + "orchestra/testbench": "^9.0|^10.0|^11.0", + "pestphp/pest": "^3.7|^4.0" }, "type": "library", "extra": { @@ -6985,7 +7228,92 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-cookie-consent/tree/3.3.3" + "source": "https://github.com/spatie/laravel-cookie-consent/tree/3.4.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2026-02-21T15:58:52+00:00" + }, + { + "name": "spatie/laravel-csp", + "version": "3.23.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-csp.git", + "reference": "1c04d35fddead75d594046bdcab48653556f940f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-csp/zipball/1c04d35fddead75d594046bdcab48653556f940f", + "reference": "1c04d35fddead75d594046bdcab48653556f940f", + "shasum": "" + }, + "require": { + "illuminate/http": "^11.36.1|^12.0|^13.0", + "illuminate/support": "^11.36.1|^12.0|^13.0", + "php": "^8.3", + "spatie/laravel-package-tools": "^1.17" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.9|^10.0|^11.0", + "pestphp/pest": "^3.0|^4.0", + "roave/security-advisories": "dev-master" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Csp\\CspServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Csp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Verhelst", + "email": "tvke91@gmail.com", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Add CSP headers to the responses of a Laravel app", + "homepage": "https://github.com/spatie/laravel-csp", + "keywords": [ + "content-security-policy", + "csp", + "headers", + "laravel", + "laravel-csp", + "security", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/laravel-csp/tree/3.23.0" }, "funding": [ { @@ -6993,36 +7321,36 @@ "type": "custom" } ], - "time": "2025-02-21T13:11:14+00:00" + "time": "2026-02-21T14:39:15+00:00" }, { "name": "spatie/laravel-honeypot", - "version": "4.6.2", + "version": "4.7.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-honeypot.git", - "reference": "62ec9dbecd2a17a4e2af62b09675f89813295cac" + "reference": "79802de082f05b13b82258c392e294a81d31e0cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-honeypot/zipball/62ec9dbecd2a17a4e2af62b09675f89813295cac", - "reference": "62ec9dbecd2a17a4e2af62b09675f89813295cac", + "url": "https://api.github.com/repos/spatie/laravel-honeypot/zipball/79802de082f05b13b82258c392e294a81d31e0cd", + "reference": "79802de082f05b13b82258c392e294a81d31e0cd", "shasum": "" }, "require": { - "illuminate/contracts": "^11.0|^12.0", - "illuminate/encryption": "^11.0|^12.0", - "illuminate/http": "^11.0|^12.0", - "illuminate/support": "^11.0|^12.0", - "illuminate/validation": "^11.0|^12.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/encryption": "^11.0|^12.0|^13.0", + "illuminate/http": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "illuminate/validation": "^11.0|^12.0|^13.0", "nesbot/carbon": "^2.0|^3.0", "php": "^8.2", "spatie/laravel-package-tools": "^1.9", "symfony/http-foundation": "^7.0|^8.0" }, "require-dev": { - "livewire/livewire": "^3.0", - "orchestra/testbench": "^9.0|^10.0", + "livewire/livewire": "^3.0|^4.0", + "orchestra/testbench": "^9.0|^10.0|^11.0", "pestphp/pest": "^2.0|^3.0|^4.0", "pestphp/pest-plugin-livewire": "^1.0|^2.1|^3.0|^4.0", "spatie/pest-plugin-snapshots": "^1.1|^2.1", @@ -7061,7 +7389,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-honeypot/tree/4.6.2" + "source": "https://github.com/spatie/laravel-honeypot/tree/4.7.1" }, "funding": [ { @@ -7069,33 +7397,33 @@ "type": "custom" } ], - "time": "2025-11-28T09:57:48+00:00" + "time": "2026-02-27T14:58:09+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.92.7", + "version": "1.93.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "f09a799850b1ed765103a4f0b4355006360c49a5" + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5", - "reference": "f09a799850b1ed765103a4f0b4355006360c49a5", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", "shasum": "" }, "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0", - "php": "^8.0" + "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.1" }, "require-dev": { "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", - "pestphp/pest": "^1.23|^2.1|^3.1", - "phpunit/php-code-coverage": "^9.0|^10.0|^11.0", - "phpunit/phpunit": "^9.5.24|^10.5|^11.5", - "spatie/pest-plugin-test-time": "^1.1|^2.2" + "orchestra/testbench": "^8.0|^9.2|^10.0|^11.0", + "pestphp/pest": "^2.1|^3.1|^4.0", + "phpunit/php-code-coverage": "^10.0|^11.0|^12.0", + "phpunit/phpunit": "^10.5|^11.5|^12.5", + "spatie/pest-plugin-test-time": "^2.2|^3.0" }, "type": "library", "autoload": { @@ -7122,7 +7450,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.7" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0" }, "funding": [ { @@ -7130,34 +7458,35 @@ "type": "github" } ], - "time": "2025-07-17T15:46:43+00:00" + "time": "2026-02-21T12:49:54+00:00" }, { "name": "spatie/laravel-permission", - "version": "6.23.0", + "version": "6.25.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "9e41247bd512b1e6c229afbc1eb528f7565ae3bb" + "reference": "d7d4cb0d58616722f1afc90e0484e4825155b9b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/9e41247bd512b1e6c229afbc1eb528f7565ae3bb", - "reference": "9e41247bd512b1e6c229afbc1eb528f7565ae3bb", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/d7d4cb0d58616722f1afc90e0484e4825155b9b3", + "reference": "d7d4cb0d58616722f1afc90e0484e4825155b9b3", "shasum": "" }, "require": { - "illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0", - "illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0", - "illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^8.0" }, "require-dev": { - "laravel/passport": "^11.0|^12.0", + "laravel/passport": "^11.0|^12.0|^13.0", "laravel/pint": "^1.0", - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", - "phpunit/phpunit": "^9.4|^10.1|^11.5" + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0|^11.0", + "pestphp/pest": "^2.0|^3.0|^4.0", + "pestphp/pest-plugin-laravel": "^2.0|^3.0|^4.0" }, "type": "library", "extra": { @@ -7205,7 +7534,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.23.0" + "source": "https://github.com/spatie/laravel-permission/tree/6.25.0" }, "funding": [ { @@ -7213,26 +7542,26 @@ "type": "github" } ], - "time": "2025-11-03T20:16:13+00:00" + "time": "2026-03-17T22:46:46+00:00" }, { "name": "spatie/laravel-query-builder", - "version": "6.3.6", + "version": "6.4.4", "source": { "type": "git", "url": "https://github.com/spatie/laravel-query-builder.git", - "reference": "b9a5af31c79ae8fb79ae0aa8ba2b9e7180f39481" + "reference": "ab9c4c369fc913d6c020a0f6776f3c82f3e523fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/b9a5af31c79ae8fb79ae0aa8ba2b9e7180f39481", - "reference": "b9a5af31c79ae8fb79ae0aa8ba2b9e7180f39481", + "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/ab9c4c369fc913d6c020a0f6776f3c82f3e523fb", + "reference": "ab9c4c369fc913d6c020a0f6776f3c82f3e523fb", "shasum": "" }, "require": { - "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/http": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "php": "^8.2", "spatie/laravel-package-tools": "^1.11" }, @@ -7240,7 +7569,7 @@ "ext-json": "*", "larastan/larastan": "^2.7 || ^3.3", "mockery/mockery": "^1.4", - "orchestra/testbench": "^7.0|^8.0|^10.0", + "orchestra/testbench": "^7.0|^8.0|^10.0|^11.0", "pestphp/pest": "^2.0|^3.7|^4.0", "phpunit/phpunit": "^10.0|^11.5.3|^12.0", "spatie/invade": "^2.0" @@ -7287,24 +7616,24 @@ "type": "custom" } ], - "time": "2025-10-20T09:50:21+00:00" + "time": "2026-03-08T13:45:05+00:00" }, { "name": "spatie/laravel-signal-aware-command", - "version": "2.1.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-signal-aware-command.git", - "reference": "70207ba2702a9ee8f523af0cd4711d1104c5ca53" + "reference": "54dcc1efd152bfb3eb0faf56a5fc28569b864b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-signal-aware-command/zipball/70207ba2702a9ee8f523af0cd4711d1104c5ca53", - "reference": "70207ba2702a9ee8f523af0cd4711d1104c5ca53", + "url": "https://api.github.com/repos/spatie/laravel-signal-aware-command/zipball/54dcc1efd152bfb3eb0faf56a5fc28569b864b5d", + "reference": "54dcc1efd152bfb3eb0faf56a5fc28569b864b5d", "shasum": "" }, "require": { - "illuminate/contracts": "^11.0|^12.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", "php": "^8.2", "spatie/laravel-package-tools": "^1.4.3", "symfony/console": "^7.0|^8.0" @@ -7354,7 +7683,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-signal-aware-command/issues", - "source": "https://github.com/spatie/laravel-signal-aware-command/tree/2.1.1" + "source": "https://github.com/spatie/laravel-signal-aware-command/tree/2.1.2" }, "funding": [ { @@ -7362,37 +7691,37 @@ "type": "github" } ], - "time": "2025-11-27T09:17:52+00:00" + "time": "2026-02-22T08:16:31+00:00" }, { "name": "spatie/laravel-support-bubble", - "version": "1.9.0", + "version": "1.9.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-support-bubble.git", - "reference": "0de161473bdfd652bca9e9e9bbaefdcc51cc21e7" + "reference": "a765ec7511464c520f12331f213140f3d14d9e19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-support-bubble/zipball/0de161473bdfd652bca9e9e9bbaefdcc51cc21e7", - "reference": "0de161473bdfd652bca9e9e9bbaefdcc51cc21e7", + "url": "https://api.github.com/repos/spatie/laravel-support-bubble/zipball/a765ec7511464c520f12331f213140f3d14d9e19", + "reference": "a765ec7511464c520f12331f213140f3d14d9e19", "shasum": "" }, "require": { - "illuminate/contracts": "^10.0|^11.0|^12.0", + "illuminate/contracts": "^12.0|^13.0", "php": "^8.2", "spatie/laravel-honeypot": "^4.0", "spatie/laravel-package-tools": "^1.9" }, "require-dev": { - "brianium/paratest": "^6.2|^7.4", - "nunomaduro/collision": "^7.0|^8.0", - "orchestra/testbench": "^8.0|^9.0|^10.0", - "pestphp/pest": "^2.34|^3.7", - "pestphp/pest-plugin-laravel": "^2.3|^3.1", - "phpunit/phpunit": "^10.5|^11.5.3", + "brianium/paratest": "^7.4", + "nunomaduro/collision": "^8.0", + "orchestra/testbench": "^10.0|^11.0", + "pestphp/pest": "^3.7|^4.4", + "pestphp/pest-plugin-laravel": "^3.1|^4.1", + "phpunit/phpunit": "^11.5.3|^12.5.12", "spatie/laravel-ray": "^1.23", - "spatie/pest-plugin-snapshots": "^1.1|^2.1" + "spatie/pest-plugin-snapshots": "^2.1" }, "type": "library", "extra": { @@ -7438,7 +7767,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-support-bubble/issues", - "source": "https://github.com/spatie/laravel-support-bubble/tree/1.9.0" + "source": "https://github.com/spatie/laravel-support-bubble/tree/1.9.2" }, "funding": [ { @@ -7446,34 +7775,34 @@ "type": "github" } ], - "time": "2025-08-21T15:45:21+00:00" + "time": "2026-02-26T23:20:53+00:00" }, { "name": "spatie/laravel-tags", - "version": "4.10.1", + "version": "4.11.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-tags.git", - "reference": "26fe2ad5490e65e2a3475c3fe8a4d9609934aa40" + "reference": "7d89470d49da7ee8acd8d23b236643329c168376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-tags/zipball/26fe2ad5490e65e2a3475c3fe8a4d9609934aa40", - "reference": "26fe2ad5490e65e2a3475c3fe8a4d9609934aa40", + "url": "https://api.github.com/repos/spatie/laravel-tags/zipball/7d89470d49da7ee8acd8d23b236643329c168376", + "reference": "7d89470d49da7ee8acd8d23b236643329c168376", "shasum": "" }, "require": { - "laravel/framework": "^10.0|^11.0|^12.0", + "laravel/framework": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.63|^3.0", "php": "^8.1", - "spatie/eloquent-sortable": "^4.0", + "spatie/eloquent-sortable": "^4.0|^5.0", "spatie/laravel-package-tools": "^1.4", "spatie/laravel-translatable": "^6.0" }, "require-dev": { - "orchestra/testbench": "^8.0|^9.0|^10.0", - "pestphp/pest": "^1.22|^2.0", - "phpunit/phpunit": "^9.5.2" + "orchestra/testbench": "^8.0|^9.0|^10.0|^11.0", + "pestphp/pest": "^1.22|^2.0|^4.0", + "phpunit/phpunit": "^9.5.2|^12.5.12" }, "type": "library", "extra": { @@ -7508,7 +7837,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-tags/issues", - "source": "https://github.com/spatie/laravel-tags/tree/4.10.1" + "source": "https://github.com/spatie/laravel-tags/tree/4.11.0" }, "funding": [ { @@ -7516,32 +7845,32 @@ "type": "github" } ], - "time": "2025-10-13T14:16:14+00:00" + "time": "2026-02-21T15:13:58+00:00" }, { "name": "spatie/laravel-translatable", - "version": "6.12.0", + "version": "6.13.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-translatable.git", - "reference": "8fc0c1dd5ab4013c27a28e5d5590f2ce849bd349" + "reference": "f2c5b8805a2dd22799c9aa8ce66cd98ce3170dcb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/8fc0c1dd5ab4013c27a28e5d5590f2ce849bd349", - "reference": "8fc0c1dd5ab4013c27a28e5d5590f2ce849bd349", + "url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/f2c5b8805a2dd22799c9aa8ce66cd98ce3170dcb", + "reference": "f2c5b8805a2dd22799c9aa8ce66cd98ce3170dcb", "shasum": "" }, "require": { - "illuminate/database": "^11.0|^12.0", - "illuminate/support": "^11.0|^12.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", "php": "^8.3", - "spatie/laravel-package-tools": "^1.92.7" + "spatie/laravel-package-tools": "^1.93.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.90", "mockery/mockery": "^1.6.12", - "orchestra/testbench": "^9.0|^10.0", + "orchestra/testbench": "^9.0|^10.0|^11.0", "pestphp/pest": "^4.0.0" }, "type": "library", @@ -7591,7 +7920,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-translatable/issues", - "source": "https://github.com/spatie/laravel-translatable/tree/6.12.0" + "source": "https://github.com/spatie/laravel-translatable/tree/6.13.0" }, "funding": [ { @@ -7599,33 +7928,33 @@ "type": "github" } ], - "time": "2025-11-24T15:57:48+00:00" + "time": "2026-02-21T14:20:19+00:00" }, { "name": "spatie/laravel-welcome-notification", - "version": "2.4.4", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-welcome-notification.git", - "reference": "9ffd013e3187c83708a2b5636ff2ddcce02b8fa5" + "reference": "b8eda37bc2bf0a1b6d71a5c0bd9458ba00cfa5ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-welcome-notification/zipball/9ffd013e3187c83708a2b5636ff2ddcce02b8fa5", - "reference": "9ffd013e3187c83708a2b5636ff2ddcce02b8fa5", + "url": "https://api.github.com/repos/spatie/laravel-welcome-notification/zipball/b8eda37bc2bf0a1b6d71a5c0bd9458ba00cfa5ff", + "reference": "b8eda37bc2bf0a1b6d71a5c0bd9458ba00cfa5ff", "shasum": "" }, "require": { - "illuminate/auth": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/notifications": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/queue": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/auth": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/notifications": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/queue": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^7.3|^8.0" }, "require-dev": { - "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", - "pestphp/pest": "^1.22|^2.34|^3.7", - "pestphp/pest-plugin-laravel": "^1.3|^2.3|^3.1", - "phpunit/phpunit": "^9.0|^10.5|^11.5.3", + "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "pestphp/pest": "^1.22|^2.34|^3.7|^4.4", + "pestphp/pest-plugin-laravel": "^1.3|^2.3|^3.1|^4.1", + "phpunit/phpunit": "^9.0|^10.5|^11.5.3|^12.5.12", "spatie/test-time": "^1.1" }, "type": "library", @@ -7661,7 +7990,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-welcome-notification/issues", - "source": "https://github.com/spatie/laravel-welcome-notification/tree/2.4.4" + "source": "https://github.com/spatie/laravel-welcome-notification/tree/2.5.0" }, "funding": [ { @@ -7669,7 +7998,7 @@ "type": "github" } ], - "time": "2025-02-26T08:58:35+00:00" + "time": "2026-02-22T18:44:58+00:00" }, { "name": "spatie/schema-org", @@ -7746,16 +8075,16 @@ }, { "name": "spatie/temporary-directory", - "version": "2.3.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/spatie/temporary-directory.git", - "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b" + "reference": "662e481d6ec07ef29fd05010433428851a42cd07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/580eddfe9a0a41a902cac6eeb8f066b42e65a32b", - "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/662e481d6ec07ef29fd05010433428851a42cd07", + "reference": "662e481d6ec07ef29fd05010433428851a42cd07", "shasum": "" }, "require": { @@ -7791,7 +8120,7 @@ ], "support": { "issues": "https://github.com/spatie/temporary-directory/issues", - "source": "https://github.com/spatie/temporary-directory/tree/2.3.0" + "source": "https://github.com/spatie/temporary-directory/tree/2.3.1" }, "funding": [ { @@ -7803,20 +8132,20 @@ "type": "github" } ], - "time": "2025-01-13T13:04:43+00:00" + "time": "2026-01-12T07:42:22+00:00" }, { "name": "swagger-api/swagger-ui", - "version": "v5.30.3", + "version": "v5.32.1", "source": { "type": "git", "url": "https://github.com/swagger-api/swagger-ui.git", - "reference": "199761a94d03753ec62c23bb4ba162bb73c3cfc7" + "reference": "d361f5b3570b8ade67fb1c02cf7a676fcb441479" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/199761a94d03753ec62c23bb4ba162bb73c3cfc7", - "reference": "199761a94d03753ec62c23bb4ba162bb73c3cfc7", + "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/d361f5b3570b8ade67fb1c02cf7a676fcb441479", + "reference": "d361f5b3570b8ade67fb1c02cf7a676fcb441479", "shasum": "" }, "type": "library", @@ -7862,28 +8191,27 @@ ], "support": { "issues": "https://github.com/swagger-api/swagger-ui/issues", - "source": "https://github.com/swagger-api/swagger-ui/tree/v5.30.3" + "source": "https://github.com/swagger-api/swagger-ui/tree/v5.32.1" }, - "time": "2025-11-25T12:39:47+00:00" + "time": "2026-03-17T14:00:38+00:00" }, { "name": "symfony/clock", - "version": "v7.4.0", + "version": "v8.0.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" + "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", - "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", + "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f", + "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" + "php": ">=8.4", + "psr/clock": "^1.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -7922,7 +8250,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.4.0" + "source": "https://github.com/symfony/clock/tree/v8.0.0" }, "funding": [ { @@ -7942,20 +8270,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:39:26+00:00" + "time": "2025-11-12T15:46:48+00:00" }, { "name": "symfony/console", - "version": "v7.4.0", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8" + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", - "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", + "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", "shasum": "" }, "require": { @@ -8020,7 +8348,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.0" + "source": "https://github.com/symfony/console/tree/v7.4.7" }, "funding": [ { @@ -8040,24 +8368,24 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-03-06T14:06:20+00:00" }, { "name": "symfony/css-selector", - "version": "v7.4.0", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135" + "reference": "2a178bf80f05dbbe469a337730eba79d61315262" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab862f478513e7ca2fe9ec117a6f01a8da6e1135", - "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/2a178bf80f05dbbe469a337730eba79d61315262", + "reference": "2a178bf80f05dbbe469a337730eba79d61315262", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -8089,7 +8417,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.4.0" + "source": "https://github.com/symfony/css-selector/tree/v8.0.6" }, "funding": [ { @@ -8109,7 +8437,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T13:39:42+00:00" + "time": "2026-02-17T13:07:04+00:00" }, { "name": "symfony/deprecation-contracts", @@ -8180,16 +8508,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2" + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2", - "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", "shasum": "" }, "require": { @@ -8238,7 +8566,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.0" + "source": "https://github.com/symfony/error-handler/tree/v7.4.4" }, "funding": [ { @@ -8258,28 +8586,28 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:29:59+00:00" + "time": "2026-01-20T16:42:42+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.4.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d" + "reference": "99301401da182b6cfaa4700dbe9987bb75474b47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d", - "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99301401da182b6cfaa4700dbe9987bb75474b47", + "reference": "99301401da182b6cfaa4700dbe9987bb75474b47", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<6.4", + "symfony/security-http": "<7.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -8288,14 +8616,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/error-handler": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0|^8.0" + "symfony/stopwatch": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8323,7 +8651,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.4" }, "funding": [ { @@ -8343,7 +8671,7 @@ "type": "tidelift" } ], - "time": "2025-10-28T09:38:46+00:00" + "time": "2026-01-05T11:45:55+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -8421,18 +8749,88 @@ ], "time": "2024-09-25T14:21:43+00:00" }, + { + "name": "symfony/filesystem", + "version": "v8.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "7bf9162d7a0dff98d079b72948508fa48018a770" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7bf9162d7a0dff98d079b72948508fa48018a770", + "reference": "7bf9162d7a0dff98d079b72948508fa48018a770", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v8.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-25T16:59:43+00:00" + }, { "name": "symfony/finder", - "version": "v7.4.0", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", - "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", + "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", "shasum": "" }, "require": { @@ -8467,7 +8865,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.0" + "source": "https://github.com/symfony/finder/tree/v7.4.6" }, "funding": [ { @@ -8487,20 +8885,20 @@ "type": "tidelift" } ], - "time": "2025-11-05T05:42:40+00:00" + "time": "2026-01-29T09:40:50+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.0", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "769c1720b68e964b13b58529c17d4a385c62167b" + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/769c1720b68e964b13b58529c17d4a385c62167b", - "reference": "769c1720b68e964b13b58529c17d4a385c62167b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81", "shasum": "" }, "require": { @@ -8549,7 +8947,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.0" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.7" }, "funding": [ { @@ -8569,20 +8967,20 @@ "type": "tidelift" } ], - "time": "2025-11-13T08:49:24+00:00" + "time": "2026-03-06T13:15:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.0", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "7348193cd384495a755554382e4526f27c456085" + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7348193cd384495a755554382e4526f27c456085", - "reference": "7348193cd384495a755554382e4526f27c456085", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1", + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1", "shasum": "" }, "require": { @@ -8624,7 +9022,7 @@ "symfony/config": "^6.4|^7.0|^8.0", "symfony/console": "^6.4|^7.0|^8.0", "symfony/css-selector": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", "symfony/dom-crawler": "^6.4|^7.0|^8.0", "symfony/expression-language": "^6.4|^7.0|^8.0", "symfony/finder": "^6.4|^7.0|^8.0", @@ -8668,7 +9066,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.0" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.7" }, "funding": [ { @@ -8688,20 +9086,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:38:24+00:00" + "time": "2026-03-06T16:33:18+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.0", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "a3d9eea8cfa467ece41f0f54ba28185d74bd53fd" + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/a3d9eea8cfa467ece41f0f54ba28185d74bd53fd", - "reference": "a3d9eea8cfa467ece41f0f54ba28185d74bd53fd", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9", + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9", "shasum": "" }, "require": { @@ -8752,7 +9150,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.0" + "source": "https://github.com/symfony/mailer/tree/v7.4.6" }, "funding": [ { @@ -8772,20 +9170,20 @@ "type": "tidelift" } ], - "time": "2025-11-21T15:26:00+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/mime", - "version": "v7.4.0", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a" + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/bdb02729471be5d047a3ac4a69068748f1a6be7a", - "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a", + "url": "https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1", + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1", "shasum": "" }, "require": { @@ -8796,15 +9194,15 @@ }, "conflict": { "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/mailer": "<6.4", "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/dependency-injection": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0", "symfony/property-access": "^6.4|^7.0|^8.0", @@ -8841,7 +9239,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.0" + "source": "https://github.com/symfony/mime/tree/v7.4.7" }, "funding": [ { @@ -8861,7 +9259,7 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:14:42+00:00" + "time": "2026-03-05T15:24:09+00:00" }, { "name": "symfony/polyfill-ctype", @@ -9774,16 +10172,16 @@ }, { "name": "symfony/process", - "version": "v7.4.0", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8" + "reference": "608476f4604102976d687c483ac63a79ba18cc97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", - "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", + "reference": "608476f4604102976d687c483ac63a79ba18cc97", "shasum": "" }, "require": { @@ -9815,7 +10213,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.0" + "source": "https://github.com/symfony/process/tree/v7.4.5" }, "funding": [ { @@ -9835,41 +10233,40 @@ "type": "tidelift" } ], - "time": "2025-10-16T11:21:06+00:00" + "time": "2026-01-26T15:07:59+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v7.4.0", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "0101ff8bd0506703b045b1670960302d302a726c" + "reference": "d6edf266746dd0b8e81e754a79da77b08dc00531" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/0101ff8bd0506703b045b1670960302d302a726c", - "reference": "0101ff8bd0506703b045b1670960302d302a726c", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/d6edf266746dd0b8e81e754a79da77b08dc00531", + "reference": "d6edf266746dd0b8e81e754a79da77b08dc00531", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "psr/http-message": "^1.0|^2.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0" + "symfony/http-foundation": "^7.4|^8.0" }, "conflict": { - "php-http/discovery": "<1.15", - "symfony/http-kernel": "<6.4" + "php-http/discovery": "<1.15" }, "require-dev": { "nyholm/psr7": "^1.1", "php-http/discovery": "^1.15", "psr/log": "^1.1.4|^2|^3", - "symfony/browser-kit": "^6.4|^7.0|^8.0", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", - "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", - "symfony/runtime": "^6.4.13|^7.1.6|^8.0" + "symfony/browser-kit": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -9903,7 +10300,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.4.0" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.0.4" }, "funding": [ { @@ -9923,20 +10320,20 @@ "type": "tidelift" } ], - "time": "2025-11-13T08:38:49+00:00" + "time": "2026-01-03T23:40:55+00:00" }, { "name": "symfony/routing", - "version": "v7.4.0", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "4720254cb2644a0b876233d258a32bf017330db7" + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/4720254cb2644a0b876233d258a32bf017330db7", - "reference": "4720254cb2644a0b876233d258a32bf017330db7", + "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", "shasum": "" }, "require": { @@ -9988,7 +10385,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.0" + "source": "https://github.com/symfony/routing/tree/v7.4.6" }, "funding": [ { @@ -10008,7 +10405,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/service-contracts", @@ -10099,35 +10496,34 @@ }, { "name": "symfony/string", - "version": "v7.4.0", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" + "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", - "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", + "url": "https://api.github.com/repos/symfony/string/zipball/6c9e1108041b5dce21a9a4984b531c4923aa9ec4", + "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.33", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.1|^8.0", - "symfony/http-client": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0|^8.0" + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -10166,7 +10562,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.0" + "source": "https://github.com/symfony/string/tree/v8.0.6" }, "funding": [ { @@ -10186,38 +10582,31 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-02-09T10:14:57+00:00" }, { "name": "symfony/translation", - "version": "v7.4.0", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68" + "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", - "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "url": "https://api.github.com/repos/symfony/translation/zipball/13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b", + "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5.3|^3.3" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation-contracts": "^3.6.1" }, "conflict": { "nikic/php-parser": "<5.0", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" + "symfony/service-contracts": "<2.5" }, "provide": { "symfony/translation-implementation": "2.3|3.0" @@ -10225,17 +10614,17 @@ "require-dev": { "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/routing": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0|^8.0" + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -10266,7 +10655,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.0" + "source": "https://github.com/symfony/translation/tree/v8.0.6" }, "funding": [ { @@ -10286,7 +10675,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-02-17T13:07:04+00:00" }, { "name": "symfony/translation-contracts", @@ -10372,16 +10761,16 @@ }, { "name": "symfony/uid", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2498e9f81b7baa206f44de583f2f48350b90142c" + "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2498e9f81b7baa206f44de583f2f48350b90142c", - "reference": "2498e9f81b7baa206f44de583f2f48350b90142c", + "url": "https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36", + "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36", "shasum": "" }, "require": { @@ -10426,7 +10815,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.0" + "source": "https://github.com/symfony/uid/tree/v7.4.4" }, "funding": [ { @@ -10446,20 +10835,20 @@ "type": "tidelift" } ], - "time": "2025-09-25T11:02:55+00:00" + "time": "2026-01-03T23:30:35+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.0", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece" + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41fd6c4ae28c38b294b42af6db61446594a0dece", - "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", "shasum": "" }, "require": { @@ -10513,7 +10902,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" }, "funding": [ { @@ -10533,20 +10922,20 @@ "type": "tidelift" } ], - "time": "2025-10-27T20:36:44+00:00" + "time": "2026-02-15T10:53:20+00:00" }, { "name": "symfony/yaml", - "version": "v7.4.0", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810" + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/6c84a4b55aee4cd02034d1c528e83f69ddf63810", - "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", "shasum": "" }, "require": { @@ -10589,7 +10978,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.0" + "source": "https://github.com/symfony/yaml/tree/v7.4.6" }, "funding": [ { @@ -10609,7 +10998,7 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:14:42+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "theseer/tokenizer", @@ -10663,16 +11052,16 @@ }, { "name": "tightenco/ziggy", - "version": "v2.6.0", + "version": "v2.6.2", "source": { "type": "git", "url": "https://github.com/tighten/ziggy.git", - "reference": "cccc6035c109daab03a33926b3a8499bedbed01f" + "reference": "8a0b645921623f77dceaf543d61ecd51a391d96e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tighten/ziggy/zipball/cccc6035c109daab03a33926b3a8499bedbed01f", - "reference": "cccc6035c109daab03a33926b3a8499bedbed01f", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/8a0b645921623f77dceaf543d61ecd51a391d96e", + "reference": "8a0b645921623f77dceaf543d61ecd51a391d96e", "shasum": "" }, "require": { @@ -10682,9 +11071,9 @@ }, "require-dev": { "laravel/folio": "^1.1", - "orchestra/testbench": "^7.0 || ^8.0 || ^9.0 || ^10.0", - "pestphp/pest": "^2.26|^3.0", - "pestphp/pest-plugin-laravel": "^2.4|^3.0" + "orchestra/testbench": "^8.0 || ^9.0 || ^10.0", + "pestphp/pest": "^2.0 || ^3.0 || ^4.0", + "pestphp/pest-plugin-laravel": "^2.0 || ^3.0 || ^4.0" }, "type": "library", "extra": { @@ -10727,29 +11116,29 @@ ], "support": { "issues": "https://github.com/tighten/ziggy/issues", - "source": "https://github.com/tighten/ziggy/tree/v2.6.0" + "source": "https://github.com/tighten/ziggy/tree/v2.6.2" }, - "time": "2025-09-15T00:00:26+00:00" + "time": "2026-03-05T14:41:19+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "v2.3.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", - "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "php": "^7.4 || ^8.0", - "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^2.0", @@ -10782,32 +11171,32 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" }, - "time": "2024-12-21T16:25:41+00:00" + "time": "2025-12-02T11:56:42+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.6.2", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + "reference": "955e7815d677a3eaa7075231212f2110983adecc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", - "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", + "reference": "955e7815d677a3eaa7075231212f2110983adecc", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.3", + "graham-campbell/result-type": "^1.1.4", "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3", - "symfony/polyfill-ctype": "^1.24", - "symfony/polyfill-mbstring": "^1.24", - "symfony/polyfill-php80": "^1.24" + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", @@ -10856,7 +11245,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" }, "funding": [ { @@ -10868,7 +11257,7 @@ "type": "tidelift" } ], - "time": "2025-04-30T23:37:27+00:00" + "time": "2025-12-27T19:49:13+00:00" }, { "name": "voku/portable-ascii", @@ -10944,38 +11333,111 @@ ], "time": "2024-11-21T01:49:47+00:00" }, + { + "name": "whikloj/bagittools", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/whikloj/BagItTools.git", + "reference": "30697b4692cc874bd115b1b7d031001e7fe77f30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/whikloj/BagItTools/zipball/30697b4692cc874bd115b1b7d031001e7fe77f30", + "reference": "30697b4692cc874bd115b1b7d031001e7fe77f30", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-intl": "*", + "ext-mbstring": "*", + "ext-zip": "*", + "pear/archive_tar": "^1.4.14", + "php": ">=8.2", + "symfony/console": ">7" + }, + "require-dev": { + "donatj/mock-webserver": "^2.6", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "symfony": { + "allow-contrib": false + } + }, + "autoload": { + "psr-4": { + "whikloj\\BagItTools\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jared Whiklo", + "email": "jwhiklo@gmail.com", + "role": "Developer" + } + ], + "description": "A PHP library to manipulate and verify BagIt bags.", + "homepage": "https://github.com/whikloj/bagittools", + "keywords": [ + "bagit", + "bags", + "data", + "integrity", + "transmission" + ], + "support": { + "issues": "https://github.com/whikloj/BagItTools/issues", + "source": "https://github.com/whikloj/BagItTools/tree/6.0.0" + }, + "time": "2026-01-07T22:17:43+00:00" + }, { "name": "zircote/swagger-php", - "version": "4.11.1", + "version": "5.8.3", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1" + "reference": "098223019f764a16715f64089a58606096719c98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/7df10e8ec47db07c031db317a25bef962b4e5de1", - "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/098223019f764a16715f64089a58606096719c98", + "reference": "098223019f764a16715f64089a58606096719c98", "shasum": "" }, "require": { "ext-json": "*", - "php": ">=7.2", + "nikic/php-parser": "^4.19 || ^5.0", + "php": ">=7.4", + "phpstan/phpdoc-parser": "^2.0", "psr/log": "^1.1 || ^2.0 || ^3.0", "symfony/deprecation-contracts": "^2 || ^3", - "symfony/finder": ">=2.2", - "symfony/yaml": ">=3.3" + "symfony/finder": "^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "conflict": { + "symfony/process": ">=6, <6.4.14" }, "require-dev": { "composer/package-versions-deprecated": "^1.11", - "doctrine/annotations": "^1.7 || ^2.0", - "friendsofphp/php-cs-fixer": "^2.17 || 3.62.0", - "phpstan/phpstan": "^1.6", - "phpunit/phpunit": ">=8", - "vimeo/psalm": "^4.23" + "doctrine/annotations": "^2.0", + "friendsofphp/php-cs-fixer": "^3.62.0", + "phpstan/phpstan": "^1.6 || ^2.0", + "phpunit/phpunit": "^9.0", + "rector/rector": "^1.0 || ^2.3.1", + "vimeo/psalm": "^4.30 || ^5.0" }, "suggest": { - "doctrine/annotations": "^1.7 || ^2.0" + "doctrine/annotations": "^2.0", + "radebatz/type-info-extras": "^1.0.2" }, "bin": [ "bin/openapi" @@ -10983,7 +11445,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -11011,8 +11473,8 @@ "homepage": "https://radebatz.net" } ], - "description": "swagger-php - Generate interactive documentation for your RESTful API using phpdoc annotations", - "homepage": "https://github.com/zircote/swagger-php/", + "description": "Generate interactive documentation for your RESTful API using PHP attributes (preferred) or PHPDoc annotations", + "homepage": "https://github.com/zircote/swagger-php", "keywords": [ "api", "json", @@ -11021,24 +11483,30 @@ ], "support": { "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/4.11.1" + "source": "https://github.com/zircote/swagger-php/tree/5.8.3" }, - "time": "2024-10-15T19:20:02+00:00" + "funding": [ + { + "url": "https://github.com/zircote", + "type": "github" + } + ], + "time": "2026-03-02T00:47:18+00:00" } ], "packages-dev": [ { "name": "brianium/paratest", - "version": "v7.8.4", + "version": "v7.8.5", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4" + "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/130a9bf0e269ee5f5b320108f794ad03e275cad4", - "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", + "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", "shasum": "" }, "require": { @@ -11046,27 +11514,27 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.2.0", + "fidry/cpu-core-counter": "^1.3.0", "jean85/pretty-package-versions": "^2.1.1", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "phpunit/php-code-coverage": "^11.0.10", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^11.0.12", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-timer": "^7.0.1", - "phpunit/phpunit": "^11.5.24", + "phpunit/phpunit": "^11.5.46", "sebastian/environment": "^7.2.1", - "symfony/console": "^6.4.22 || ^7.3.0", - "symfony/process": "^6.4.20 || ^7.3.0" + "symfony/console": "^6.4.22 || ^7.3.4 || ^8.0.3", + "symfony/process": "^6.4.20 || ^7.3.4 || ^8.0.3" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan": "^2.1.33", "phpstan/phpstan-deprecation-rules": "^2.0.3", - "phpstan/phpstan-phpunit": "^2.0.6", - "phpstan/phpstan-strict-rules": "^2.0.4", - "squizlabs/php_codesniffer": "^3.13.2", - "symfony/filesystem": "^6.4.13 || ^7.3.0" + "phpstan/phpstan-phpunit": "^2.0.11", + "phpstan/phpstan-strict-rules": "^2.0.7", + "squizlabs/php_codesniffer": "^3.13.5", + "symfony/filesystem": "^6.4.13 || ^7.3.2 || ^8.0.1" }, "bin": [ "bin/paratest", @@ -11106,7 +11574,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.8.4" + "source": "https://github.com/paratestphp/paratest/tree/v7.8.5" }, "funding": [ { @@ -11118,7 +11586,7 @@ "type": "paypal" } ], - "time": "2025-06-23T06:07:21+00:00" + "time": "2026-01-08T08:02:38+00:00" }, { "name": "fakerphp/faker", @@ -11428,34 +11896,34 @@ }, { "name": "laravel/boost", - "version": "v1.8.3", + "version": "v1.8.12", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "26572e858e67334952779c0110ca4c378a44d28d" + "reference": "5a0bf68e48e6d159182859f9ed6e404313103309" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/26572e858e67334952779c0110ca4c378a44d28d", - "reference": "26572e858e67334952779c0110ca4c378a44d28d", + "url": "https://api.github.com/repos/laravel/boost/zipball/5a0bf68e48e6d159182859f9ed6e404313103309", + "reference": "5a0bf68e48e6d159182859f9ed6e404313103309", "shasum": "" }, "require": { "guzzlehttp/guzzle": "^7.9", - "illuminate/console": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/contracts": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/routing": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/support": "^10.49.0|^11.45.3|^12.28.1", - "laravel/mcp": "^0.3.4", + "illuminate/console": "^10.49.0|^11.45.3|^12.41.1", + "illuminate/contracts": "^10.49.0|^11.45.3|^12.41.1", + "illuminate/routing": "^10.49.0|^11.45.3|^12.41.1", + "illuminate/support": "^10.49.0|^11.45.3|^12.41.1", + "laravel/mcp": "^0.5.1", "laravel/prompts": "0.1.25|^0.3.6", "laravel/roster": "^0.2.9", "php": "^8.1" }, "require-dev": { - "laravel/pint": "1.20", + "laravel/pint": "^1.20.0", "mockery/mockery": "^1.6.12", "orchestra/testbench": "^8.36.0|^9.15.0|^10.6", - "pestphp/pest": "^2.36.0|^3.8.4", + "pestphp/pest": "^2.36.0|^3.8.4|^4.1.5", "phpstan/phpstan": "^2.1.27", "rector/rector": "^2.1" }, @@ -11490,39 +11958,39 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2025-11-26T14:12:52+00:00" + "time": "2026-03-12T07:25:30+00:00" }, { "name": "laravel/mcp", - "version": "v0.3.4", + "version": "v0.5.9", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "0b86fb613a0df971cec89271c674a677c2cb4f77" + "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/0b86fb613a0df971cec89271c674a677c2cb4f77", - "reference": "0b86fb613a0df971cec89271c674a677c2cb4f77", + "url": "https://api.github.com/repos/laravel/mcp/zipball/39e8da60eb7bce4737c5d868d35a3fe78938c129", + "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "illuminate/console": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/container": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/contracts": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/http": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/json-schema": "^12.28.1", - "illuminate/routing": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/support": "^10.49.0|^11.45.3|^12.28.1", - "illuminate/validation": "^10.49.0|^11.45.3|^12.28.1", - "php": "^8.1" + "illuminate/console": "^11.45.3|^12.41.1|^13.0", + "illuminate/container": "^11.45.3|^12.41.1|^13.0", + "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", + "illuminate/http": "^11.45.3|^12.41.1|^13.0", + "illuminate/json-schema": "^12.41.1|^13.0", + "illuminate/routing": "^11.45.3|^12.41.1|^13.0", + "illuminate/support": "^11.45.3|^12.41.1|^13.0", + "illuminate/validation": "^11.45.3|^12.41.1|^13.0", + "php": "^8.2" }, "require-dev": { - "laravel/pint": "1.20.0", - "orchestra/testbench": "^8.36.0|^9.15.0|^10.6.0", - "pestphp/pest": "^2.36.0|^3.8.4|^4.1.0", + "laravel/pint": "^1.20", + "orchestra/testbench": "^9.15|^10.8|^11.0", + "pestphp/pest": "^3.8.5|^4.3.2", "phpstan/phpstan": "^2.1.27", "rector/rector": "^2.2.4" }, @@ -11563,41 +12031,42 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2025-11-18T14:41:05+00:00" + "time": "2026-02-17T19:05:53+00:00" }, { "name": "laravel/pail", - "version": "v1.2.4", + "version": "v1.2.6", "source": { "type": "git", "url": "https://github.com/laravel/pail.git", - "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30" + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/49f92285ff5d6fc09816e976a004f8dec6a0ea30", - "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30", + "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", "shasum": "" }, "require": { "ext-mbstring": "*", - "illuminate/console": "^10.24|^11.0|^12.0", - "illuminate/contracts": "^10.24|^11.0|^12.0", - "illuminate/log": "^10.24|^11.0|^12.0", - "illuminate/process": "^10.24|^11.0|^12.0", - "illuminate/support": "^10.24|^11.0|^12.0", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", "nunomaduro/termwind": "^1.15|^2.0", "php": "^8.2", - "symfony/console": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0" }, "require-dev": { - "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", "laravel/pint": "^1.13", - "orchestra/testbench-core": "^8.13|^9.17|^10.8", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", "pestphp/pest": "^2.20|^3.0|^4.0", "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", "phpstan/phpstan": "^1.12.27", - "symfony/var-dumper": "^6.3|^7.0" + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" }, "type": "library", "extra": { @@ -11642,20 +12111,20 @@ "issues": "https://github.com/laravel/pail/issues", "source": "https://github.com/laravel/pail" }, - "time": "2025-11-20T16:29:35+00:00" + "time": "2026-02-09T13:44:54+00:00" }, { "name": "laravel/pint", - "version": "v1.26.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "69dcca060ecb15e4b564af63d1f642c81a241d6f" + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/69dcca060ecb15e4b564af63d1f642c81a241d6f", - "reference": "69dcca060ecb15e4b564af63d1f642c81a241d6f", + "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39", + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39", "shasum": "" }, "require": { @@ -11666,13 +12135,14 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.90.0", - "illuminate/view": "^12.40.1", - "larastan/larastan": "^3.8.0", - "laravel-zero/framework": "^12.0.4", + "friendsofphp/php-cs-fixer": "^3.94.2", + "illuminate/view": "^12.54.1", + "larastan/larastan": "^3.9.3", + "laravel-zero/framework": "^12.0.5", "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^2.3.3", - "pestphp/pest": "^3.8.4" + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^3.8.6", + "shipfastlabs/agent-detector": "^1.1.0" }, "bin": [ "builds/pint" @@ -11709,7 +12179,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2025-11-25T21:15:52+00:00" + "time": "2026-03-12T15:51:39+00:00" }, { "name": "laravel/roster", @@ -11774,28 +12244,28 @@ }, { "name": "laravel/sail", - "version": "v1.49.0", + "version": "v1.54.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "070c7f34ca8dbece4350fbfe0bab580047dfacc7" + "reference": "bcc5e06f1a79d806d880a4b027964d2aa5872b07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/070c7f34ca8dbece4350fbfe0bab580047dfacc7", - "reference": "070c7f34ca8dbece4350fbfe0bab580047dfacc7", + "url": "https://api.github.com/repos/laravel/sail/zipball/bcc5e06f1a79d806d880a4b027964d2aa5872b07", + "reference": "bcc5e06f1a79d806d880a4b027964d2aa5872b07", "shasum": "" }, "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", "php": "^8.0", - "symfony/console": "^6.0|^7.0", - "symfony/yaml": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", "phpstan/phpstan": "^2.0" }, "bin": [ @@ -11833,7 +12303,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2025-11-25T21:15:57+00:00" + "time": "2026-03-11T14:10:52+00:00" }, { "name": "mockery/mockery", @@ -11980,39 +12450,36 @@ }, { "name": "nunomaduro/collision", - "version": "v8.8.3", + "version": "v8.9.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4" + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", "shasum": "" }, "require": { - "filp/whoops": "^2.18.1", - "nunomaduro/termwind": "^2.3.1", + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.3.0" + "symfony/console": "^7.4.4 || ^8.0.4" }, "conflict": { - "laravel/framework": "<11.44.2 || >=13.0.0", - "phpunit/phpunit": "<11.5.15 || >=13.0.0" + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" }, "require-dev": { - "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.4.2", - "laravel/framework": "^11.44.2 || ^12.18", - "laravel/pint": "^1.22.1", - "laravel/sail": "^1.43.1", - "laravel/sanctum": "^4.1.1", - "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.4", - "pestphp/pest": "^3.8.2 || ^4.0.0", - "sebastian/environment": "^7.2.1 || ^8.0" + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.2", + "laravel/framework": "^11.48.0 || ^12.52.0", + "laravel/pint": "^1.27.1", + "orchestra/testbench-core": "^9.12.0 || ^10.9.0", + "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" }, "type": "library", "extra": { @@ -12075,7 +12542,7 @@ "type": "patreon" } ], - "time": "2025-11-20T02:55:25+00:00" + "time": "2026-02-17T17:33:08+00:00" }, { "name": "phar-io/manifest", @@ -12321,16 +12788,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.45", + "version": "11.5.55", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "faf5fff4fb9beb290affa53f812b05380819c51a" + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/faf5fff4fb9beb290affa53f812b05380819c51a", - "reference": "faf5fff4fb9beb290affa53f812b05380819c51a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00", "shasum": "" }, "require": { @@ -12344,19 +12811,20 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.11", - "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.1", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.2", + "sebastian/comparator": "^6.3.3", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.1", "sebastian/exporter": "^6.3.2", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", + "sebastian/recursion-context": "^6.0.3", "sebastian/type": "^5.1.3", "sebastian/version": "^5.0.2", "staabm/side-effects-detector": "^1.0.5" @@ -12402,7 +12870,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.45" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55" }, "funding": [ { @@ -12426,7 +12894,7 @@ "type": "tidelift" } ], - "time": "2025-12-01T07:38:43+00:00" + "time": "2026-02-18T12:37:06+00:00" }, { "name": "sebastian/cli-parser", @@ -12544,16 +13012,16 @@ }, { "name": "sebastian/comparator", - "version": "6.3.2", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", "shasum": "" }, "require": { @@ -12612,7 +13080,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" }, "funding": [ { @@ -12632,7 +13100,7 @@ "type": "tidelift" } ], - "time": "2025-08-10T08:07:46+00:00" + "time": "2026-01-24T09:26:40+00:00" }, { "name": "sebastian/diff", @@ -13171,11 +13639,8 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.2" + "php": "^8.4" }, "platform-dev": {}, - "platform-overrides": { - "php": "8.3.28" - }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/config/app.php b/config/app.php new file mode 100644 index 000000000..c0525322a --- /dev/null +++ b/config/app.php @@ -0,0 +1,66 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Description + |-------------------------------------------------------------------------- + | + | A brief description of your application. + | + */ + + 'description' => env('APP_DESCRIPTION', 'NMRXIV is an open-access preprint repository for sharing and discovering nuclear magnetic resonance (NMR) spectroscopy data.'), + + /* + |-------------------------------------------------------------------------- + | Schema Version + |-------------------------------------------------------------------------- + | + | The schema version used by the application for data structures. + | + */ + + 'schema_version' => env('SCHEMA_VERSION', 'beta'), + +]; diff --git a/config/audit.php b/config/audit.php index 9c94d549e..46f6dd11c 100644 --- a/config/audit.php +++ b/config/audit.php @@ -1,5 +1,11 @@ env('AUDITING_ENABLED', true), @@ -13,7 +19,7 @@ | */ - 'implementation' => OwenIt\Auditing\Models\Audit::class, + 'implementation' => Audit::class, /* |-------------------------------------------------------------------------- @@ -30,7 +36,7 @@ 'web', 'api', ], - 'resolver' => OwenIt\Auditing\Resolvers\UserResolver::class, + 'resolver' => UserResolver::class, ], /* @@ -42,9 +48,9 @@ | */ 'resolvers' => [ - 'ip_address' => OwenIt\Auditing\Resolvers\IpAddressResolver::class, - 'user_agent' => OwenIt\Auditing\Resolvers\UserAgentResolver::class, - 'url' => OwenIt\Auditing\Resolvers\UrlResolver::class, + 'ip_address' => IpAddressResolver::class, + 'user_agent' => UserAgentResolver::class, + 'url' => UrlResolver::class, ], /* diff --git a/config/backup.php b/config/backup.php index 2bcc6148f..a8c617038 100644 --- a/config/backup.php +++ b/config/backup.php @@ -1,5 +1,16 @@ [ @@ -151,19 +162,19 @@ 'notifications' => [ 'notifications' => [ - \Spatie\Backup\Notifications\Notifications\BackupHasFailedNotification::class => ['mail'], - \Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFoundNotification::class => ['mail'], - \Spatie\Backup\Notifications\Notifications\CleanupHasFailedNotification::class => ['mail'], - \Spatie\Backup\Notifications\Notifications\BackupWasSuccessfulNotification::class => ['mail'], - \Spatie\Backup\Notifications\Notifications\HealthyBackupWasFoundNotification::class => ['mail'], - \Spatie\Backup\Notifications\Notifications\CleanupWasSuccessfulNotification::class => ['mail'], + BackupHasFailedNotification::class => ['mail'], + UnhealthyBackupWasFoundNotification::class => ['mail'], + CleanupHasFailedNotification::class => ['mail'], + BackupWasSuccessfulNotification::class => ['mail'], + HealthyBackupWasFoundNotification::class => ['mail'], + CleanupWasSuccessfulNotification::class => ['mail'], ], /* * Here you can specify the notifiable to which the notifications should be sent. The default * notifiable will use the variables specified in this config file. */ - 'notifiable' => \Spatie\Backup\Notifications\Notifiable::class, + 'notifiable' => Notifiable::class, 'mail' => [ 'to' => env('MAIL_FROM_ADDRESS', 'info.nmrxiv@uni-jena.de'), @@ -213,8 +224,8 @@ 'name' => env('APP_NAME', 'laravel-backup'), 'disks' => ['local'], 'health_checks' => [ - \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1, - \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000, + MaximumAgeInDays::class => 1, + MaximumStorageInMegabytes::class => 5000, ], ], @@ -240,7 +251,7 @@ * No matter how you configure it the default strategy will never * delete the newest backup. */ - 'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class, + 'strategy' => DefaultStrategy::class, 'default_strategy' => [ diff --git a/config/csp.php b/config/csp.php new file mode 100644 index 000000000..624bc267d --- /dev/null +++ b/config/csp.php @@ -0,0 +1,90 @@ + [ + // Enforcement mode - now using secure CSP policy + NmrxivPolicy::class, + ], + + /** + * Register additional global CSP directives here. + * These can be configured via environment variables for runtime flexibility. + */ + 'directives' => [ + // Additional connect-src domains (configurable via env) + ...(env('CSP_ADDITIONAL_CONNECT_SRC') ? [ + [Directive::CONNECT, array_filter(explode(',', env('CSP_ADDITIONAL_CONNECT_SRC')))], + ] : []), + + // Additional img-src domains (configurable via env) + ...(env('CSP_ADDITIONAL_IMG_SRC') ? [ + [Directive::IMG, array_filter(explode(',', env('CSP_ADDITIONAL_IMG_SRC')))], + ] : []), + + // Additional script-src domains (configurable via env) + ...(env('CSP_ADDITIONAL_SCRIPT_SRC') ? [ + [Directive::SCRIPT, array_filter(explode(',', env('CSP_ADDITIONAL_SCRIPT_SRC')))], + ] : []), + + // Additional style-src domains (configurable via env) + ...(env('CSP_ADDITIONAL_STYLE_SRC') ? [ + [Directive::STYLE, array_filter(explode(',', env('CSP_ADDITIONAL_STYLE_SRC')))], + ] : []), + ], + + /* + * These presets which will be put in a report-only policy. This is great for testing out + * a new policy or changes to existing CSP policy without breaking anything. + */ + 'report_only_presets' => [ + // Moved to enforcement mode above + ], + + /** + * Register additional global report-only CSP directives here. + */ + 'report_only_directives' => [ + // [Directive::SCRIPT, [Keyword::UNSAFE_EVAL, Keyword::UNSAFE_INLINE]], + ], + + /* + * All violations against a policy will be reported to this url. + * Set to null to disable violation reporting. + */ + 'report_uri' => null, + + /* + * Headers will only be added if this setting is set to true. + */ + 'enabled' => env('CSP_ENABLED', true), + + /** + * Headers will be added when Vite is hot reloading. + */ + 'enabled_while_hot_reloading' => env('CSP_ENABLED_WHILE_HOT_RELOADING', true), + + /* + * The class responsible for generating the nonces used in inline tags and headers. + */ + 'nonce_generator' => RandomString::class, + + /* + * Set false to disable automatic nonce generation and handling. + * This is useful when you want to use 'unsafe-inline' for scripts/styles + * and cannot add inline nonces. + * Note that this will make your CSP policy less secure. + */ + 'nonce_enabled' => env('CSP_NONCE_ENABLED', true), +]; diff --git a/config/doi.php b/config/doi.php index 4855e6f31..d3f63ffcd 100644 --- a/config/doi.php +++ b/config/doi.php @@ -14,6 +14,17 @@ 'default' => env('DOI_PROVIDER', 'datacite'), + /* + |-------------------------------------------------------------------------- + | DOI Host + |-------------------------------------------------------------------------- + | + | The DOI host URL used for resolving DOI identifiers. + | + */ + + 'host' => env('DOI_HOST', 'https://doi.org'), + /* |-------------------------------------------------------------------------- | DataCite Options diff --git a/config/external-links.php b/config/external-links.php new file mode 100644 index 000000000..46b7ce5fa --- /dev/null +++ b/config/external-links.php @@ -0,0 +1,39 @@ + env('MICHI_STANDARDS_URL'), + + /* + |-------------------------------------------------------------------------- + | External API Endpoints + |-------------------------------------------------------------------------- + | + | API endpoints for external services used by the application. + | + */ + + 'nmrium_url' => env('NMRIUM_URL', 'https://nmrium.nmrxiv.org'), + 'nmrkit_url' => env('NMRKIT_URL', 'https://nodejs.nmrxiv.org'), + 'europemc_ws_api' => env('EUROPEMC_WS_API', 'https://www.ebi.ac.uk/europepmc/webservices/rest/search'), + 'cm_api' => env('CM_API', 'https://api.cheminf.studio'), + 'crossref_api' => env('CROSSREF_API', 'https://api.crossref.org/works/'), + 'datacite_api' => env('DATACITE_API', 'https://api.datacite.org'), + +]; diff --git a/config/filesystems.php b/config/filesystems.php index 1e7f28e49..9ad0e21e8 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -35,6 +35,12 @@ 'serve' => true, 'throw' => false, 'report' => false, + // AWS S3 config keys for testing (when StorageSignedUrlService is used) + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'endpoint' => env('AWS_URL'), ], 'ceph' => [ diff --git a/config/l5-swagger.php b/config/l5-swagger.php index 31ed18a3f..779030533 100644 --- a/config/l5-swagger.php +++ b/config/l5-swagger.php @@ -1,5 +1,8 @@ 'default', 'documentations' => [ @@ -106,14 +109,14 @@ /** * analyser: defaults to \OpenApi\StaticAnalyser . * - * @see \OpenApi\scan + * @see scan */ 'analyser' => null, /** * analysis: defaults to a new \OpenApi\Analysis . * - * @see \OpenApi\scan + * @see scan */ 'analysis' => null, @@ -121,7 +124,7 @@ * Custom query path processors classes. * * @link https://github.com/zircote/swagger-php/tree/master/Examples/schema-query-parameter-processor - * @see \OpenApi\scan + * @see scan */ 'processors' => [ // new \App\SwaggerProcessors\SchemaQueryParameter(), @@ -130,7 +133,7 @@ /** * pattern: string $pattern File pattern(s) to scan (default: *.php) . * - * @see \OpenApi\scan + * @see scan */ 'pattern' => null, @@ -145,7 +148,7 @@ * Allows to generate specs either for OpenAPI 3.0.0 or OpenAPI 3.1.0. * By default the spec will be in version 3.0.0 */ - 'open_api_spec_version' => env('L5_SWAGGER_OPEN_API_SPEC_VERSION', \L5Swagger\Generator::OPEN_API_DEFAULT_SPEC_VERSION), + 'open_api_spec_version' => env('L5_SWAGGER_OPEN_API_SPEC_VERSION', Generator::OPEN_API_DEFAULT_SPEC_VERSION), ], /* diff --git a/config/larabug.php b/config/larabug.php deleted file mode 100644 index ddc0026bd..000000000 --- a/config/larabug.php +++ /dev/null @@ -1,146 +0,0 @@ - env('LB_KEY', ''), - - /* - |-------------------------------------------------------------------------- - | Project key - |-------------------------------------------------------------------------- - | - | This is your project key which you receive when creating a project - | Retrieve your key from https://www.larabug.com - | - */ - - 'project_key' => env('LB_PROJECT_KEY', ''), - - /* - |-------------------------------------------------------------------------- - | Environment setting - |-------------------------------------------------------------------------- - | - | This setting determines if the exception should be send over or not. - | - */ - - 'environments' => [ - 'production', - 'development', - ], - - /* - |-------------------------------------------------------------------------- - | Project version - |-------------------------------------------------------------------------- - | - | Set the project version, default: null. - | For git repository: shell_exec("git log -1 --pretty=format:'%h' --abbrev-commit") - | - */ - 'project_version' => null, - - /* - |-------------------------------------------------------------------------- - | Lines near exception - |-------------------------------------------------------------------------- - | - | How many lines to show near exception line. The more you specify the bigger - | the displayed code will be. Max value can be 50, will be defaulted to - | 12 if higher than 50 automatically. - | - */ - - 'lines_count' => 12, - - /* - |-------------------------------------------------------------------------- - | Prevent duplicates - |-------------------------------------------------------------------------- - | - | Set the sleep time between duplicate exceptions. This value is in seconds, default: 60 seconds (1 minute) - | - */ - - 'sleep' => 60, - - /* - |-------------------------------------------------------------------------- - | Skip exceptions - |-------------------------------------------------------------------------- - | - | List of exceptions to skip sending. - | - */ - - 'except' => [ - 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException', - ], - - /* - |-------------------------------------------------------------------------- - | Key filtering - |-------------------------------------------------------------------------- - | - | Filter out these variables before sending them to LaraBug - | - */ - - 'blacklist' => [ - '*authorization*', - '*password*', - '*token*', - '*auth*', - '*verification*', - '*credit_card*', - 'cardToken', // mollie card token - '*cvv*', - '*iban*', - '*name*', - '*email*', - ], - - /* - |-------------------------------------------------------------------------- - | Release git hash - |-------------------------------------------------------------------------- - | - | - */ - - // 'release' => trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')), - - /* - |-------------------------------------------------------------------------- - | Server setting - |-------------------------------------------------------------------------- - | - | This setting allows you to change the server. - | - */ - - 'server' => env('LB_SERVER', 'https://www.larabug.com/api/log'), - - /* - |-------------------------------------------------------------------------- - | Verify SSL setting - |-------------------------------------------------------------------------- - | - | Enables / disables the SSL verification when sending exceptions to LaraBug - | Never turn SSL verification off on production instances - | - */ - 'verify_ssl' => env('LB_VERIFY_SSL', true), - -]; diff --git a/config/logging.php b/config/logging.php deleted file mode 100644 index 6348a1239..000000000 --- a/config/logging.php +++ /dev/null @@ -1,11 +0,0 @@ - [ - 'larabug' => [ - 'driver' => 'larabug', - ], - ], - -]; diff --git a/config/mail.php b/config/mail.php index 1cb555c51..78b331772 100644 --- a/config/mail.php +++ b/config/mail.php @@ -22,6 +22,22 @@ ], ], + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + 'markdown' => [ 'theme' => 'default', diff --git a/config/markable.php b/config/markable.php index 4ff4333b3..c5722db6c 100644 --- a/config/markable.php +++ b/config/markable.php @@ -1,5 +1,7 @@ App\Models\User::class, + 'user_model' => User::class, /* |-------------------------------------------------------------------------- diff --git a/config/nmrxiv.php b/config/nmrxiv.php new file mode 100644 index 000000000..2d8d5ae36 --- /dev/null +++ b/config/nmrxiv.php @@ -0,0 +1,46 @@ + (int) env('COOL_OFF_PERIOD', 30), + + /* + |-------------------------------------------------------------------------- + | Spectra Parsing Configuration + |-------------------------------------------------------------------------- + | + | Configuration for the spectra parsing queue system including API endpoints, + | storage locations, retry logic, and timeout values. + | + */ + + 'spectra_parsing' => [ + // API Endpoints + 'nmrkit_api_url' => env('NMRKIT_API_URL', 'https://nmrkit.nmrxiv.org/latest/spectra/parse/url'), + 'bioschema_api_url' => env('BIOSCHEMA_API_URL', 'https://nmrxiv.org/api/v1/schemas/bioschemas'), + + // Storage Configuration + 'storage_disk' => env('SPECTRA_STORAGE_DISK', 'local'), + 'storage_path' => env('SPECTRA_STORAGE_PATH', 'spectra_parse'), + + // Job Configuration + 'job_tries' => (int) env('SPECTRA_JOB_TRIES', 3), + 'job_timeout' => (int) env('SPECTRA_JOB_TIMEOUT', 600), + + // Network Configuration + 'retry_count' => (int) env('SPECTRA_RETRY_COUNT', 3), + 'download_timeout' => (int) env('SPECTRA_DOWNLOAD_TIMEOUT', 300), + 'api_timeout' => (int) env('SPECTRA_API_TIMEOUT', 300), + ], + +]; diff --git a/config/orcid.php b/config/orcid.php new file mode 100644 index 000000000..add894032 --- /dev/null +++ b/config/orcid.php @@ -0,0 +1,29 @@ + env('ORCID_BASE_URL', 'https://pub.orcid.org/v3.0'), + + /* + |-------------------------------------------------------------------------- + | ORCID API Endpoints + |-------------------------------------------------------------------------- + | + | Various ORCID API endpoints for searching and retrieving person data. + | + */ + + 'search_api' => env('ORCID_ID_SEARCH_API', 'https://pub.orcid.org/v3.0/search'), + 'person_api' => env('ORCID_ID_PERSON_API', 'https://pub.orcid.org/v3.0'), + 'employment_api' => env('ORCID_ID_EMPLOYMENT_API', 'https://pub.orcid.org/v3.0'), + +]; diff --git a/config/permission.php b/config/permission.php index c306a8d50..106f3159f 100644 --- a/config/permission.php +++ b/config/permission.php @@ -1,5 +1,8 @@ [ @@ -13,7 +16,7 @@ * `Spatie\Permission\Contracts\Permission` contract. */ - 'permission' => Spatie\Permission\Models\Permission::class, + 'permission' => Permission::class, /* * When using the "HasRoles" trait from this package, we need to know which @@ -24,7 +27,7 @@ * `Spatie\Permission\Contracts\Role` contract. */ - 'role' => Spatie\Permission\Models\Role::class, + 'role' => Role::class, ], @@ -113,7 +116,7 @@ * When permissions or roles are updated the cache is flushed automatically. */ - 'expiration_time' => \DateInterval::createFromDateString('24 hours'), + 'expiration_time' => DateInterval::createFromDateString('24 hours'), /* * The cache key used to store all permissions. diff --git a/config/queue.php b/config/queue.php index 53eb2656e..e96beaf42 100644 --- a/config/queue.php +++ b/config/queue.php @@ -1,5 +1,8 @@ [ @@ -7,7 +10,7 @@ 'driver' => 'rabbitmq', 'queue' => env('RABBITMQ_QUEUE', 'default'), - 'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class, + 'connection' => AMQPLazyConnection::class, 'hosts' => [ [ @@ -28,7 +31,7 @@ 'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null), ], 'queue' => [ - 'job' => VladimirYuldashev\LaravelQueueRabbitMQ\Queue\Jobs\RabbitMQJob::class, + 'job' => RabbitMQJob::class, ], ], diff --git a/config/ror.php b/config/ror.php new file mode 100644 index 000000000..b245b78f8 --- /dev/null +++ b/config/ror.php @@ -0,0 +1,19 @@ + env('ROR_API_URL', 'https://api.ror.org/organizations'), + + 'client_id' => env('ROR_CLIENT_ID'), + +]; diff --git a/config/sanctum.php b/config/sanctum.php index 764a82fac..b6607039b 100644 --- a/config/sanctum.php +++ b/config/sanctum.php @@ -1,5 +1,8 @@ [ - 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, - 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, - 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + 'authenticate_session' => AuthenticateSession::class, + 'encrypt_cookies' => EncryptCookies::class, + 'validate_csrf_token' => ValidateCsrfToken::class, ], ]; diff --git a/config/schemas.php b/config/schemas.php index ce06349bb..6bd8f7510 100644 --- a/config/schemas.php +++ b/config/schemas.php @@ -14,5 +14,7 @@ * Ontologies * */ - 'measurement_technique' => env('MEASUREMENT_TECHNIQUE', 'http://purl.obolibrary.org/obo/CHMO_0000613'), + 'ontologies' => [ + 'measurement_technique' => env('MEASUREMENT_TECHNIQUE', 'http://purl.obolibrary.org/obo/CHMO_0000613'), + ], ]; diff --git a/config/scout.php b/config/scout.php index 5c8b7d20f..a2991b466 100644 --- a/config/scout.php +++ b/config/scout.php @@ -132,6 +132,7 @@ 'meilisearch' => [ 'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'), 'key' => env('MEILISEARCH_KEY', null), + 'public_key' => env('MEILISEARCH_PUBLICKEY', null), ], ]; diff --git a/config/services.php b/config/services.php index 88e0bd2e0..8c10d3aa3 100644 --- a/config/services.php +++ b/config/services.php @@ -48,12 +48,14 @@ // Allow overriding the PUG REST path if needed 'pug_rest_path' => env('PUBCHEM_PUG_PATH', '/rest/pug'), ], - 'common_chemistry' => [ - 'base_url' => env('COMMON_CHEMISTRY_URL', 'https://commonchemistry.cas.org'), - 'api_path' => env('COMMON_CHEMISTRY_API_PATH', '/api'), - ], + 'chemistry_standardize' => [ - 'url' => env('CHEMISTRY_STANDARDIZE_URL', 'https://api.cheminf.studio/latest/chem/standardize'), + 'url' => env('CHEMISTRY_STANDARDIZE_URL', 'https://api.naturalproducts.net/latest/chem/standardize'), ], + 'cas' => [ + 'provider' => env('CAS_PROVIDER', 'CAS_CommonChemistry'), + 'api_token' => env('CAS_API_TOKEN'), + 'base_url' => env('COMMON_CHEMISTRY_URL', 'https://commonchemistry.cas.org/api'), + ], ]; diff --git a/config/tags.php b/config/tags.php index 0b965495d..fbae79b70 100644 --- a/config/tags.php +++ b/config/tags.php @@ -1,5 +1,7 @@ Spatie\Tags\Tag::class, + 'tag_model' => Tag::class, ]; diff --git a/database/factories/AnnouncementFactory.php b/database/factories/AnnouncementFactory.php index ae3f7d0b4..4c04223e9 100644 --- a/database/factories/AnnouncementFactory.php +++ b/database/factories/AnnouncementFactory.php @@ -2,13 +2,14 @@ namespace Database\Factories; +use App\Models\Announcement; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; use Illuminate\Support\Str; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Announcement> + * @extends Factory */ class AnnouncementFactory extends Factory { diff --git a/database/factories/AuthorFactory.php b/database/factories/AuthorFactory.php index cd7caf98d..6d4ea3121 100644 --- a/database/factories/AuthorFactory.php +++ b/database/factories/AuthorFactory.php @@ -2,10 +2,11 @@ namespace Database\Factories; +use App\Models\Author; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Author> + * @extends Factory */ class AuthorFactory extends Factory { diff --git a/database/factories/CitationFactory.php b/database/factories/CitationFactory.php index bd0359bc5..3d075b608 100644 --- a/database/factories/CitationFactory.php +++ b/database/factories/CitationFactory.php @@ -2,10 +2,11 @@ namespace Database\Factories; +use App\Models\Citation; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Citation> + * @extends Factory */ class CitationFactory extends Factory { diff --git a/database/factories/DraftFactory.php b/database/factories/DraftFactory.php index 3d1b3c7d1..7361f9867 100644 --- a/database/factories/DraftFactory.php +++ b/database/factories/DraftFactory.php @@ -2,13 +2,14 @@ namespace Database\Factories; +use App\Models\Draft; use App\Models\Team; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Draft> + * @extends Factory */ class DraftFactory extends Factory { diff --git a/database/factories/FileSystemObjectFactory.php b/database/factories/FileSystemObjectFactory.php new file mode 100644 index 000000000..56e5e4d1f --- /dev/null +++ b/database/factories/FileSystemObjectFactory.php @@ -0,0 +1,142 @@ + + */ +class FileSystemObjectFactory extends Factory +{ + /** + * Define the model's default state. + */ + public function definition(): array + { + return [ + 'name' => $this->faker->word().'.'.$this->faker->fileExtension(), + 'uuid' => Str::uuid(), + 'slug' => $this->faker->slug(), + 'description' => $this->faker->sentence(), + 'relative_url' => '/'.$this->faker->slug().'/'.$this->faker->word(), + 'path' => $this->faker->filePath(), + 'type' => $this->faker->randomElement(['file', 'directory']), // Changed from 'folder' to 'directory' + 'key' => Str::uuid(), + 'is_public' => false, + 'is_deleted' => false, + 'is_archived' => false, + 'is_original' => true, + 'is_verified' => false, + 'is_processed' => false, + 'is_root' => false, + 'sort_order' => $this->faker->numberBetween(1, 100), + 'level' => $this->faker->numberBetween(0, 3), + 'has_children' => false, + 'file_size' => $this->faker->numberBetween(1024, 1048576), // 1KB to 1MB + 'integrity_status' => $this->faker->randomElement(['pending', 'verified', 'failed']), + 'status' => $this->faker->randomElement(['present', 'missing']), + 'checksum_md5' => md5($this->faker->text()), + 'checksum_sha256' => hash('sha256', $this->faker->text()), + 'checksum_algorithm' => 'sha256', + ]; + } + + /** + * Configure the factory for a file type. + */ + public function file(): static + { + return $this->state(fn (array $attributes) => [ + 'type' => 'file', + 'has_children' => false, + ]); + } + + /** + * Configure the factory for a directory type. + */ + public function directory(): static + { + return $this->state(fn (array $attributes) => [ + 'type' => 'directory', + 'has_children' => true, + ]); + } + + /** + * Configure the factory for a missing status. + */ + public function missing(): static + { + return $this->state(fn (array $attributes) => [ + 'status' => 'missing', + ]); + } + + /** + * Configure the factory for a complete status. + */ + public function complete(): static + { + return $this->state(fn (array $attributes) => [ + 'status' => 'complete', + ]); + } + + /** + * Configure the factory for root level files. + */ + public function rootLevel(): static + { + return $this->state(fn (array $attributes) => [ + 'level' => 0, + 'parent_id' => null, + ]); + } + + /** + * Configure the factory for child files. + */ + public function childLevel(int $level = 1): static + { + return $this->state(fn (array $attributes) => [ + 'level' => $level, + ]); + } + + /** + * Configure the factory to belong to a draft. + */ + public function forDraft(Draft $draft): static + { + return $this->state(fn (array $attributes) => [ + 'draft_id' => $draft->id, + ]); + } + + /** + * Configure the factory to belong to a project. + */ + public function forProject(Project $project): static + { + return $this->state(fn (array $attributes) => [ + 'project_id' => $project->id, + ]); + } + + /** + * Configure the factory to belong to a study. + */ + public function forStudy(Study $study): static + { + return $this->state(fn (array $attributes) => [ + 'study_id' => $study->id, + ]); + } +} diff --git a/database/factories/LicenseFactory.php b/database/factories/LicenseFactory.php index abfd28b9c..afcdc09e8 100644 --- a/database/factories/LicenseFactory.php +++ b/database/factories/LicenseFactory.php @@ -2,29 +2,37 @@ namespace Database\Factories; +use App\Models\License; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\License> + * @extends Factory */ class LicenseFactory extends Factory { + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = License::class; + /** * Define the model's default state. */ public function definition(): array { - $title = $this->faker->sentence($nbWords = 4); + $title = fake()->sentence(4); $slug = Str::slug($title, '-'); return [ 'title' => $title, 'slug' => $slug, 'spdx_id' => Str::random(), - 'url' => $this->faker->url(), - 'description' => $this->faker->text(), - 'body' => $this->faker->text(), + 'url' => fake()->url(), + 'description' => fake()->text(), + 'body' => fake()->text(), 'category' => Str::random(40), ]; } diff --git a/database/factories/LinkedSocialAccountFactory.php b/database/factories/LinkedSocialAccountFactory.php new file mode 100644 index 000000000..04e5b8c1e --- /dev/null +++ b/database/factories/LinkedSocialAccountFactory.php @@ -0,0 +1,54 @@ + User::factory(), + 'provider_id' => $this->faker->unique()->numerify('########'), + 'provider_name' => $this->faker->randomElement(['github', 'google', 'orcid']), + ]; + } + + /** + * Indicate that the linked account is for GitHub. + */ + public function github(): static + { + return $this->state(fn (array $attributes) => [ + 'provider_name' => 'github', + ]); + } + + /** + * Indicate that the linked account is for Google. + */ + public function google(): static + { + return $this->state(fn (array $attributes) => [ + 'provider_name' => 'google', + ]); + } + + /** + * Indicate that the linked account is for ORCID. + */ + public function orcid(): static + { + return $this->state(fn (array $attributes) => [ + 'provider_name' => 'orcid', + ]); + } +} diff --git a/database/factories/MoleculeFactory.php b/database/factories/MoleculeFactory.php index b988ef894..b6c654a32 100644 --- a/database/factories/MoleculeFactory.php +++ b/database/factories/MoleculeFactory.php @@ -12,74 +12,55 @@ class MoleculeFactory extends Factory */ public function definition(): array { - $cid = rand(1000, 9999); - echo $cid; - $pubchemRecordLink = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/'.$cid.'/record/JSON'; - $json = file_get_contents($pubchemRecordLink); - $data = json_decode($json, true)['PC_Compounds'][0]['props']; + // Generate fake molecule data instead of making API calls + // This prevents external API dependencies and rate limiting issues - $output = []; - $labels = [ - 'InChI' => 'standard_inchi', - 'InChIKey' => 'inchi_key', - 'Molecular Formula' => 'molecular_formula', - ]; - - foreach ($data as $key => $value) { - $pubchemLabel = $data[$key]['urn']['label']; - - foreach ($labels as $label => $column) { - if ($pubchemLabel == $label) { - $val = $data[$key]['value']['sval']; - $output[$column] = $val; - } - } + // Generate unique molecular formulas using random carbon/hydrogen/oxygen counts + $c = $this->faker->numberBetween(6, 25); + $h = $this->faker->numberBetween(8, 50); + $o = $this->faker->numberBetween(0, 10); + $molecularFormula = "C{$c}H{$h}"; + if ($o > 0) { + $molecularFormula .= "O{$o}"; } - return - [ + // Generate unique InChI and InChI key using random components + $uniqueId = $this->faker->uuid(); + $hashPart = substr(md5($uniqueId), 0, 10); + $standardInchi = "InChI=1S/{$molecularFormula}/c{$hashPart}/h{$this->faker->randomNumber(5)}"; + $inchiKey = strtoupper(substr(md5($standardInchi), 0, 14)).'-'.strtoupper(substr(md5($uniqueId), 0, 10)).'-N'; + + return [ 'cas' => null, - 'molecular_formula' => $output['molecular_formula'], - 'molecular_weight' => null, + 'molecular_formula' => $molecularFormula, + 'molecular_weight' => $this->faker->randomFloat(2, 100, 500), 'smiles' => null, 'absolute_smiles' => null, 'canonical_smiles' => null, 'inchi' => null, - 'standard_inchi' => $output['standard_inchi'], - 'inchi_key' => $output['inchi_key'], + 'standard_inchi' => $standardInchi, + 'inchi_key' => $inchiKey, 'standard_inchi_key' => null, - 'fp0' => null, - 'fp1' => null, - 'fp2' => null, - 'fp3' => null, - 'fp4' => null, - 'fp5' => null, - 'fp6' => null, - 'fp7' => null, - 'fp8' => null, - 'fp9' => null, - 'fp10' => null, - 'fp11' => null, - 'fp12' => null, - 'fp13' => null, - 'fp14' => null, - 'fp15' => null, - 'DBE' => null, - 'SSSR' => null, - 'SAR' => null, - 'COMMENT' => null, 'sdf' => null, - 'MULTIPLICITY_0' => null, - 'MULTIPLICITY_1' => null, - 'MULTIPLICITY_2' => null, - 'MULTIPLICITY_3' => null, - 'VIEWS' => null, 'DOI' => null, 'created_at' => Carbon::now()->timestamp, 'updated_at' => Carbon::now()->timestamp, 'doi' => null, 'datacite_schema' => null, - 'identifier' => null, + 'identifier' => $this->faker->unique()->numberBetween(1, 999999), // bigint identifier for searches + 'name' => $this->faker->words(2, true), + 'name_trust_level' => 0, + 'annotation_level' => 0, + 'synonyms' => null, + 'iupac_name' => null, + '2d' => null, + '3d' => null, + 'structural_comments' => null, + 'status' => 'APPROVED', + 'active' => true, + 'has_stereo' => false, + 'has_variants' => false, + 'variants_count' => 0, ]; } } diff --git a/database/factories/NMRiumFactory.php b/database/factories/NMRiumFactory.php index 714f3637d..c2237629c 100644 --- a/database/factories/NMRiumFactory.php +++ b/database/factories/NMRiumFactory.php @@ -2,10 +2,13 @@ namespace Database\Factories; +use App\Models\Dataset; +use App\Models\Model; +use App\Models\Study; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model> + * @extends Factory */ class NMRiumFactory extends Factory { @@ -16,7 +19,30 @@ public function definition(): array { return [ 'nmrium_info' => '{}', - 'dataset_id' => 1, + 'nmriumable_id' => 1, + 'nmriumable_type' => Dataset::class, ]; } + + /** + * Make this NMRium belong to a Dataset + */ + public function forDataset($dataset = null): static + { + return $this->state(fn (array $attributes) => [ + 'nmriumable_id' => $dataset?->id ?? Dataset::factory(), + 'nmriumable_type' => Dataset::class, + ]); + } + + /** + * Make this NMRium belong to a Study + */ + public function forStudy($study = null): static + { + return $this->state(fn (array $attributes) => [ + 'nmriumable_id' => $study?->id ?? Study::factory(), + 'nmriumable_type' => Study::class, + ]); + } } diff --git a/database/factories/ProjectInvitationFactory.php b/database/factories/ProjectInvitationFactory.php new file mode 100644 index 000000000..5fc75005d --- /dev/null +++ b/database/factories/ProjectInvitationFactory.php @@ -0,0 +1,60 @@ + + */ +class ProjectInvitationFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'project_id' => Project::factory(), + 'email' => fake()->unique()->safeEmail(), + 'role' => fake()->randomElement(['viewer', 'collaborator']), + 'message' => fake()->optional()->sentence(), + 'invited_by' => User::factory(), + ]; + } + + /** + * Indicate that the invitation is for a collaborator role. + */ + public function collaborator(): static + { + return $this->state(fn (array $attributes) => [ + 'role' => 'collaborator', + ]); + } + + /** + * Indicate that the invitation is for a viewer role. + */ + public function viewer(): static + { + return $this->state(fn (array $attributes) => [ + 'role' => 'viewer', + ]); + } + + /** + * Indicate that the invitation has expired. + */ + public function expired(): static + { + return $this->state(fn (array $attributes) => [ + 'created_at' => now()->subDays(8), // Assuming 7-day expiry + ]); + } +} diff --git a/database/factories/StudyFactory.php b/database/factories/StudyFactory.php index d6beca729..ee20b8d57 100644 --- a/database/factories/StudyFactory.php +++ b/database/factories/StudyFactory.php @@ -2,7 +2,6 @@ namespace Database\Factories; -use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; @@ -42,8 +41,6 @@ public function definition(): array 'fs_id' => 1, 'release_date' => null, 'study_photo_path' => null, // todo: Adjust when studies images field is provided in nmrXiv - 'created_at' => Carbon::now()->timestamp, - 'updated_at' => Carbon::now()->timestamp, 'doi' => null, 'datacite_schema' => null, 'identifier' => null, diff --git a/database/factories/StudyInvitationFactory.php b/database/factories/StudyInvitationFactory.php new file mode 100644 index 000000000..2a7be6e73 --- /dev/null +++ b/database/factories/StudyInvitationFactory.php @@ -0,0 +1,77 @@ + Study::factory(), + 'email' => $this->faker->unique()->safeEmail(), + 'role' => $this->faker->randomElement(['viewer', 'collaborator', 'reviewer']), + 'message' => $this->faker->optional()->sentence(), + 'invited_by' => $this->faker->optional()->safeEmail(), + ]; + } + + /** + * Factory state for viewer role + */ + public function viewer(): self + { + return $this->state(fn (array $attributes) => [ + 'role' => 'viewer', + ]); + } + + /** + * Factory state for collaborator role + */ + public function collaborator(): self + { + return $this->state(fn (array $attributes) => [ + 'role' => 'collaborator', + ]); + } + + /** + * Factory state for reviewer role + */ + public function reviewer(): self + { + return $this->state(fn (array $attributes) => [ + 'role' => 'reviewer', + ]); + } + + /** + * Factory state with a specific inviter + */ + public function invitedBy(User $user): self + { + return $this->state(fn (array $attributes) => [ + 'invited_by' => $user->email, + ]); + } + + /** + * Factory state for a specific study + */ + public function forStudy(Study $study): self + { + return $this->state(fn (array $attributes) => [ + 'study_id' => $study->id, + ]); + } +} diff --git a/database/factories/TeamInvitationFactory.php b/database/factories/TeamInvitationFactory.php new file mode 100644 index 000000000..1991fb438 --- /dev/null +++ b/database/factories/TeamInvitationFactory.php @@ -0,0 +1,89 @@ + + */ +class TeamInvitationFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'team_id' => Team::factory(), + 'email' => fake()->unique()->safeEmail(), + 'role' => fake()->randomElement(['admin', 'editor']), + 'invited_by' => User::factory(), + ]; + } + + /** + * Indicate that the invitation is for an admin role. + */ + public function admin(): static + { + return $this->state(fn (array $attributes) => [ + 'role' => 'admin', + ]); + } + + /** + * Indicate that the invitation is for an editor role. + */ + public function editor(): static + { + return $this->state(fn (array $attributes) => [ + 'role' => 'editor', + ]); + } + + /** + * Indicate that the invitation is for an owner role. + */ + public function owner(): static + { + return $this->state(fn (array $attributes) => [ + 'role' => 'owner', + ]); + } + + /** + * Set a specific email for the invitation. + */ + public function forEmail(string $email): static + { + return $this->state(fn (array $attributes) => [ + 'email' => $email, + ]); + } + + /** + * Set a specific team for the invitation. + */ + public function forTeam(Team $team): static + { + return $this->state(fn (array $attributes) => [ + 'team_id' => $team->id, + ]); + } + + /** + * Set a specific inviter for the invitation. + */ + public function invitedBy(User $user): static + { + return $this->state(fn (array $attributes) => [ + 'invited_by' => $user->id, + ]); + } +} diff --git a/database/factories/TickerFactory.php b/database/factories/TickerFactory.php new file mode 100644 index 000000000..77b816caf --- /dev/null +++ b/database/factories/TickerFactory.php @@ -0,0 +1,81 @@ + + */ +class TickerFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = Ticker::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'type' => $this->faker->randomElement(['sample', 'molecule', 'dataset']), + 'index' => $this->faker->numberBetween(1, 1000), + 'meta' => null, + ]; + } + + /** + * Create a ticker for samples + */ + public function sample(): Factory + { + return $this->state(function (array $attributes) { + return [ + 'type' => 'sample', + ]; + }); + } + + /** + * Create a ticker for molecules + */ + public function molecule(): Factory + { + return $this->state(function (array $attributes) { + return [ + 'type' => 'molecule', + ]; + }); + } + + /** + * Create a ticker for datasets + */ + public function dataset(): Factory + { + return $this->state(function (array $attributes) { + return [ + 'type' => 'dataset', + ]; + }); + } + + /** + * Set a specific index value + */ + public function withIndex(int $index): Factory + { + return $this->state(function (array $attributes) use ($index) { + return [ + 'index' => $index, + ]; + }); + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index da47b9411..04cc01776 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -21,7 +21,7 @@ public function definition(): array 'last_name' => $this->faker->lastName(), 'email' => $this->faker->unique()->safeEmail(), 'email_verified_at' => now(), - 'username' => $this->faker->userName(), + 'username' => $this->faker->unique()->userName(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; @@ -30,7 +30,7 @@ public function definition(): array /** * Indicate that the model's email address should be unverified. * - * @return \Illuminate\Database\Eloquent\Factories\Factory + * @return Factory */ public function unverified() { diff --git a/database/factories/ValidationFactory.php b/database/factories/ValidationFactory.php new file mode 100644 index 000000000..a2175b801 --- /dev/null +++ b/database/factories/ValidationFactory.php @@ -0,0 +1,94 @@ + + */ +class ValidationFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'report' => [ + 'project' => [ + 'status' => fake()->boolean(), + 'title' => fake()->boolean(), + 'description' => fake()->boolean(), + 'authors' => fake()->boolean(), + 'affiliation' => fake()->boolean(), + 'license' => fake()->boolean(), + 'keywords' => fake()->boolean(), + 'studies' => [ + ['status' => fake()->boolean()], + ['status' => fake()->boolean()], + ], + ], + 'missing' => [], + 'errors' => [], + 'version' => 1, + ], + ]; + } + + /** + * Indicate that the validation has passed. + */ + public function passed(): static + { + return $this->state(fn (array $attributes) => [ + 'report' => [ + 'project' => [ + 'status' => true, + 'title' => true, + 'description' => true, + 'authors' => true, + 'affiliation' => true, + 'license' => true, + 'keywords' => true, + 'studies' => [ + ['status' => true], + ], + ], + 'missing' => [], + 'errors' => [], + 'version' => 1, + ], + ]); + } + + /** + * Indicate that the validation has failed. + */ + public function failed(): static + { + return $this->state(fn (array $attributes) => [ + 'report' => [ + 'project' => [ + 'status' => false, + 'title' => false, + 'description' => false, + 'authors' => false, + 'affiliation' => false, + 'license' => false, + 'keywords' => false, + 'studies' => [ + ['status' => false], + ['status' => false], + ], + ], + 'missing' => ['title', 'description', 'authors'], + 'errors' => ['Project validation failed'], + 'version' => 1, + ], + ]); + } +} diff --git a/database/migrations/2021_08_26_154527_create_permission_tables.php b/database/migrations/2021_08_26_154527_create_permission_tables.php index 574f58927..05287893b 100644 --- a/database/migrations/2021_08_26_154527_create_permission_tables.php +++ b/database/migrations/2021_08_26_154527_create_permission_tables.php @@ -15,7 +15,7 @@ public function up(): void $columnNames = config('permission.column_names'); if (empty($tableNames)) { - throw new \Exception('Error: config/permission.php not loaded. Run [php artisan config:clear] and try again.'); + throw new Exception('Error: config/permission.php not loaded. Run [php artisan config:clear] and try again.'); } Schema::create($tableNames['permissions'], function (Blueprint $table) { @@ -98,7 +98,7 @@ public function down(): void $tableNames = config('permission.table_names'); if (empty($tableNames)) { - throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); + throw new Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); } Schema::drop($tableNames['role_has_permissions']); diff --git a/database/migrations/2023_08_25_111326_update_nmrium_table.php b/database/migrations/2023_08_25_111326_update_nmrium_table.php index 045c5cb60..e10cfb156 100644 --- a/database/migrations/2023_08_25_111326_update_nmrium_table.php +++ b/database/migrations/2023_08_25_111326_update_nmrium_table.php @@ -1,5 +1,6 @@ renameColumn('dataset_id', 'nmriumable_id'); - $table->string('nmriumable_type')->default(\App\Models\Dataset::class); + $table->string('nmriumable_type')->default(Dataset::class); }); Schema::table('studies', function (Blueprint $table) { diff --git a/database/migrations/2025_12_11_115948_add_ror_id_to_users_table.php b/database/migrations/2025_12_11_115948_add_ror_id_to_users_table.php new file mode 100644 index 000000000..0b3046f98 --- /dev/null +++ b/database/migrations/2025_12_11_115948_add_ror_id_to_users_table.php @@ -0,0 +1,28 @@ +string('ror_id')->nullable()->after('affiliation'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('ror_id'); + }); + } +}; diff --git a/database/migrations/2025_12_15_105635_change_affiliation_to_text_in_users_table.php b/database/migrations/2025_12_15_105635_change_affiliation_to_text_in_users_table.php new file mode 100644 index 000000000..190111062 --- /dev/null +++ b/database/migrations/2025_12_15_105635_change_affiliation_to_text_in_users_table.php @@ -0,0 +1,28 @@ +text('affiliation')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->string('affiliation')->nullable()->change(); + }); + } +}; diff --git a/database/migrations/2025_12_15_115641_add_ror_id_to_authors_table.php b/database/migrations/2025_12_15_115641_add_ror_id_to_authors_table.php new file mode 100644 index 000000000..29b667b22 --- /dev/null +++ b/database/migrations/2025_12_15_115641_add_ror_id_to_authors_table.php @@ -0,0 +1,28 @@ +string('ror_id')->nullable()->after('affiliation'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('authors', function (Blueprint $table) { + $table->dropColumn('ror_id'); + }); + } +}; diff --git a/database/migrations/2026_02_09_091118_create_author_study_table.php b/database/migrations/2026_02_09_091118_create_author_study_table.php new file mode 100644 index 000000000..84efddf6d --- /dev/null +++ b/database/migrations/2026_02_09_091118_create_author_study_table.php @@ -0,0 +1,38 @@ +id(); + $table->unsignedBigInteger('author_id'); + $table->unsignedBigInteger('study_id'); + $table->string('contributor_type')->nullable(); + $table->smallInteger('sort_order')->nullable(); + $table->timestamps(); + + $table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade'); + $table->foreign('study_id')->references('id')->on('studies')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('author_study'); + } +}; diff --git a/database/migrations/2026_02_19_120638_add_metadata_extraction_bagit_generation_columns_to_studies_table.php b/database/migrations/2026_02_19_120638_add_metadata_extraction_bagit_generation_columns_to_studies_table.php new file mode 100644 index 000000000..d9f1e450f --- /dev/null +++ b/database/migrations/2026_02_19_120638_add_metadata_extraction_bagit_generation_columns_to_studies_table.php @@ -0,0 +1,29 @@ +string('metadata_bagit_generation_status')->nullable()->after('is_public'); + $table->json('metadata_bagit_generation_logs')->nullable()->after('metadata_bagit_generation_status'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('studies', function (Blueprint $table) { + $table->dropColumn(['metadata_bagit_generation_status', 'metadata_bagit_generation_logs']); + }); + } +}; diff --git a/database/seeders/RolesAndPermissionsSeeder.php b/database/seeders/RolesAndPermissionsSeeder.php index 18a5680f1..76e9798f7 100644 --- a/database/seeders/RolesAndPermissionsSeeder.php +++ b/database/seeders/RolesAndPermissionsSeeder.php @@ -5,6 +5,7 @@ use Illuminate\Database\Seeder; use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role; +use Spatie\Permission\PermissionRegistrar; class RolesAndPermissionsSeeder extends Seeder { @@ -14,7 +15,7 @@ class RolesAndPermissionsSeeder extends Seeder public function run(): void { // Reset cached roles and permissions - app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions(); + app()[PermissionRegistrar::class]->forgetCachedPermissions(); // create permissions Permission::create(['name' => 'view studies']); diff --git a/deployment/Dockerfile b/deployment/Dockerfile index 7c5222c67..013fb1fa5 100644 --- a/deployment/Dockerfile +++ b/deployment/Dockerfile @@ -1,4 +1,4 @@ -FROM dunglas/frankenphp:1.7.0-alpine +FROM dunglas/frankenphp:1-php8.4-alpine # Setup proxy settings using build arguments ARG HTTP_PROXY @@ -44,7 +44,7 @@ COPY deployment/php.production.ini /usr/local/etc/php/conf.d/production.ini COPY composer.json composer.lock package*.json ./ # Install PHP dependencies -RUN composer install --no-dev --optimize-autoloader --no-interaction --no-progress --no-scripts +RUN composer install --optimize-autoloader --no-interaction --no-progress --no-scripts # Install Node dependencies RUN npm ci --production=false @@ -77,6 +77,10 @@ COPY deployment/Caddyfile /etc/caddy/Caddyfile RUN php artisan l5-swagger:generate +# Add healthcheck - use Laravel health endpoint for broader compatibility +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl -f http://localhost/up || exit 1 + # Expose port EXPOSE 80 443 diff --git a/deployment/Dockerfile.worker b/deployment/Dockerfile.worker index fd15d46f8..2d434510a 100644 --- a/deployment/Dockerfile.worker +++ b/deployment/Dockerfile.worker @@ -1,4 +1,4 @@ -FROM php:8.3-alpine +FROM dunglas/frankenphp:1-php8.4-alpine # Setup proxy settings using build arguments ARG HTTP_PROXY @@ -23,8 +23,7 @@ RUN /sbin/apk add --no-cache \ oniguruma-dev \ postgresql-dev \ zlib-dev \ - supervisor \ - $PHPIZE_DEPS + supervisor # Install PostgreSQL client RUN /sbin/apk --update add postgresql17-client --repository=https://dl-cdn.alpinelinux.org/alpine/edge/main @@ -32,31 +31,12 @@ RUN /sbin/apk --update add postgresql17-client --repository=https://dl-cdn.alpin # Install PHP extensions RUN docker-php-ext-install pdo pdo_pgsql mbstring exif pcntl bcmath gd intl zip -# Install APCu and Redis PHP extensions from source -RUN cd /tmp && \ - # Download APCu from GitHub - curl -L -o apcu.tar.gz https://github.com/krakjoe/apcu/archive/refs/tags/v5.1.22.tar.gz && \ - mkdir -p /tmp/apcu && \ - tar -xf apcu.tar.gz -C /tmp/apcu --strip-components=1 && \ - cd /tmp/apcu && \ - phpize && \ - ./configure && \ - make && \ - make install && \ - # Download Redis from GitHub - cd /tmp && \ - curl -L -o redis.tar.gz https://github.com/phpredis/phpredis/archive/refs/tags/5.3.7.tar.gz && \ - mkdir -p /tmp/redis && \ - tar -xf redis.tar.gz -C /tmp/redis --strip-components=1 && \ - cd /tmp/redis && \ - phpize && \ - ./configure && \ - make && \ - make install && \ - # Enable extensions +# Install APCu and Redis via PECL with build dependencies added and removed in same layer +RUN /sbin/apk add --no-cache --virtual .build-deps autoconf gcc g++ make && \ + pecl install apcu redis && \ docker-php-ext-enable apcu redis && \ - # Clean up - rm -rf /tmp/apcu /tmp/redis /tmp/apcu.tar.gz /tmp/redis.tar.gz + /sbin/apk del .build-deps && \ + rm -rf /tmp/pear # Configure PHP COPY deployment/php.production.ini /usr/local/etc/php/conf.d/production.ini @@ -86,5 +66,9 @@ COPY deployment/supervisord.worker.conf /etc/supervisor/conf.d/supervisord.conf # Create required directories for Supervisor RUN mkdir -p /var/log/supervisor /run/supervisor +# Add healthcheck - verify Horizon process is running +HEALTHCHECK --interval=10s --timeout=3s --start-period=30s --retries=3 \ + CMD pgrep -f "artisan horizon" || exit 1 + # Start Supervisord CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 286dc455d..55538546a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,11 @@ services: laravel.test: build: - context: ./docker/8.3 + context: ./docker/8.4 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' - image: sail-8.3/app + image: sail-8.4/app extra_hosts: - 'host.docker.internal:host-gateway' ports: diff --git a/docker/8.4/Dockerfile b/docker/8.4/Dockerfile new file mode 100644 index 000000000..f647912ff --- /dev/null +++ b/docker/8.4/Dockerfile @@ -0,0 +1,64 @@ +FROM ubuntu:22.04 + +LABEL maintainer="Taylor Otwell" + +ARG WWWGROUP +ARG NODE_VERSION=20 +ARG POSTGRES_VERSION=15 + +WORKDIR /var/www/html + +ENV DEBIAN_FRONTEND noninteractive +ENV TZ=UTC +ENV SUPERVISOR_PHP_COMMAND="/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80" + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update \ + && mkdir -p /etc/apt/keyrings \ + && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch \ + && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ + && apt-get update \ + && apt-get install -y php8.4-cli php8.4-dev \ + php8.4-pgsql php8.4-sqlite3 php8.4-gd \ + php8.4-curl \ + php8.4-imap php8.4-mysql php8.4-mbstring \ + php8.4-xml php8.4-zip php8.4-bcmath php8.4-soap \ + php8.4-intl php8.4-readline \ + php8.4-ldap \ + php8.4-msgpack php8.4-igbinary php8.4-redis php8.4-swoole \ + php8.4-memcached php8.4-pcov php8.4-imagick php8.4-xdebug \ + && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && npm install -g npm \ + && npm install -g pnpm \ + && npm install -g bun \ + && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \ + && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ + && apt-get update \ + && apt-get install -y yarn \ + && apt-get install -y mysql-client \ + && apt-get install -y postgresql-client-$POSTGRES_VERSION \ + && apt-get -y autoremove \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.4 + +RUN groupadd --force -g $WWWGROUP sail +RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail + +COPY start-container /usr/local/bin/start-container +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY php.ini /etc/php/8.4/cli/conf.d/99-sail.ini +RUN chmod +x /usr/local/bin/start-container + +EXPOSE 8000 + +ENTRYPOINT ["start-container"] diff --git a/docker/8.4/php.ini b/docker/8.4/php.ini new file mode 100644 index 000000000..26dbdf6e6 --- /dev/null +++ b/docker/8.4/php.ini @@ -0,0 +1,10 @@ +[PHP] +post_max_size = 2G +upload_max_filesize = 2G +memory_limit = 2G +max_execution_time = 259200 +max_input_time = 259200 +variables_order = EGPCS + +[opcache] +opcache.enable_cli=1 diff --git a/docker/8.4/start-container b/docker/8.4/start-container new file mode 100644 index 000000000..b86439907 --- /dev/null +++ b/docker/8.4/start-container @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +if [ ! -z "$WWWUSER" ]; then + usermod -u $WWWUSER sail +fi + +if [ ! -d /.composer ]; then + mkdir /.composer +fi + +chmod -R ugo+rw /.composer + +if [ $# -gt 0 ]; then + exec gosu $WWWUSER "$@" +else + exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf +fi diff --git a/docker/8.4/supervisord.conf b/docker/8.4/supervisord.conf new file mode 100644 index 000000000..26ccc0a50 --- /dev/null +++ b/docker/8.4/supervisord.conf @@ -0,0 +1,14 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php] +command=%(ENV_SUPERVISOR_PHP_COMMAND)s +user=sail +environment=LARAVEL_SAIL="1" +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/docs/developer-guides/csp-summary.md b/docs/developer-guides/csp-summary.md new file mode 100644 index 000000000..aecc93a46 --- /dev/null +++ b/docs/developer-guides/csp-summary.md @@ -0,0 +1,113 @@ +# nmrXiv Content Security Policy (CSP) summary + +This guide summarizes the CSP implementation in nmrXiv, the key changes we made, and how to work with it in development and production. + +## What changed + +- Introduced a custom CSP preset: `App/Support/Csp/Policies/NmrxivPolicy.php` (Spatie preset). +- Configured CSP in `config/csp.php` with support for both enforcement and report-only modes. +- Added a violation reporting endpoint (POST) and a viewer (GET) at `/csp-violation-report`. +- Updated templates to cooperate with CSP (nonces in production, permissive inline in development). +- Fixed third-party allowances (Matomo, Bunny Fonts) and dev tooling (Vite/HMR, IPv6 `localhost`). + +## Files involved + +- `app/Support/Csp/Policies/NmrxivPolicy.php` + - Central, environment-aware policy. + - Production: nonces are used; no `unsafe-inline`/`unsafe-eval`. + - Development/local: nonces are disabled; `unsafe-inline`/`unsafe-eval` permitted for DX and Vite HMR. + - Explicitly allows required third-party and dev sources (see below). + +- `config/csp.php` + - Switch between enforcement and report-only by moving the policy class between `presets` and `report_only_presets`. + - Controls `enabled`, `report_uri`, nonce generator, and whether to enable during hot reloading. + +- `routes/web.php` + - `POST /csp-violation-report` → receives reports (throttled). + - `GET /csp-violation-report` → view latest parsed violations. + +- `app/Http/Controllers/CspViolationController.php` + - Logs violation payloads and returns recent entries for inspection. + +- `resources/views/app.blade.php` + - Uses `@cspNonce` where needed in production (e.g., analytics). + - In development, policy disables nonces to avoid the browser ignoring `unsafe-inline`. + +## Effective directives (overview) + +Always applied (with environment-specific additions): +- `base-uri 'self'` +- `default-src 'self'` +- `object-src 'none'` +- `frame-src 'self'` +- `form-action 'self'` +- `img-src 'self' data: blob:` (+ localhost allowances in dev) +- `media-src 'self' blob:` +- `font-src data: https://fonts.bunny.net` +- `style-src 'self' data: https://fonts.bunny.net` (behavior differs by env) +- `script-src 'self' https://matomo.nfdi4chem.de` (behavior differs by env) +- `connect-src 'self' https://matomo.nfdi4chem.de https://fonts.bunny.net` (+ dev sockets/hosts) +- `report-uri /csp-violation-report` + +### Production (hardened) +- Nonces enabled (generated by `Spatie\Csp\Nonce\RandomString`). + - `script-src 'self' 'nonce-…' …` + - `style-src 'self' 'nonce-…' …` +- No `unsafe-inline` and no `unsafe-eval`. +- Third‑party: `https://matomo.nfdi4chem.de`, `https://fonts.bunny.net`. + +### Development/local (DX-friendly) +- Nonces disabled to allow inline execution where needed by tooling. +- Allows: + - `script-src … 'unsafe-inline' 'unsafe-eval'` + - `style-src … 'unsafe-inline'` +- Vite/HMR and dev connections (IPv4, named, and IPv6): + - Scripts: `http://localhost:5173`, `http://127.0.0.1:5173`, `http://[::1]:5173` (also 3000, 8000 variants) + - WebSockets: `ws://localhost:5173`, `ws://127.0.0.1:5173`, `ws://[::1]:5173` (also 3000 variants) + - HTTP connects for the same hosts/ports. +- Images additionally allow `http(s)://localhost:*`. + +## Third‑party notes +- Matomo: use explicit `https://matomo.nfdi4chem.de` (protocol‑relative sources like `//…` are invalid in CSP). +- Fonts: `https://fonts.bunny.net` allowed for `font-src` and `style-src`. + +## Violation reporting +- POST reports to: `/csp-violation-report` (throttled; can be relaxed locally if noisy). +- GET: `/csp-violation-report` returns a recent, parsed list for quick inspection. + +## Switching modes +- Enforcement: put `App\Support\Csp\Policies\NmrxivPolicy::class` into `presets` and remove it from `report_only_presets` in `config/csp.php`. +- Report‑only: place it in `report_only_presets` and clear from `presets`. +- Apply changes: + +```bash +php artisan config:clear +``` + +## Verifying the header + +```bash +curl -I http://localhost/ | grep -i "content-security-policy" +``` +- Development: expect `unsafe-inline`/`unsafe-eval` and Vite endpoints (including IPv6 `[::1]`). +- Production: expect `nonce-…` values; no `unsafe-inline`/`unsafe-eval`. + +## Troubleshooting +- “unsafe-inline is ignored when a hash or nonce is present” + - Expected: browsers ignore `unsafe-inline` when nonces/hashes are present. We avoid this in dev by disabling nonces there. +- “Refused to load script http://[::1]:5173/…” + - Ensure IPv6 dev hosts are included in both `script-src` and `connect-src` (policy does this). +- Many 429s to `/csp-violation-report` + - Temporarily relax throttle for development or disable reporting while testing. +- `browser-sync-client.js net::ERR_CONNECTION_REFUSED` + - Not CSP. Start BrowserSync or remove the script include locally. + +## Edit locations +- Policy: `app/Support/Csp/Policies/NmrxivPolicy.php` +- Config: `config/csp.php` +- Routes: `routes/web.php` +- Violation controller: `app/Http/Controllers/CspViolationController.php` +- App shell: `resources/views/app.blade.php` + +— +If you must allow new third‑party origins, add the narrowest possible directive for the exact origin and protocol. Avoid `unsafe-*` in production; prefer nonces and explicit source lists. diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 000000000..d458da138 --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,20 @@ + 'These credentials do not match our records.', + 'password' => 'These credentials do not match our records.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php new file mode 100644 index 000000000..5704d616e --- /dev/null +++ b/lang/en/passwords.php @@ -0,0 +1,23 @@ + 'Your password has been reset.', + 'sent' => 'If an account exists with this email, you will receive a password reset link.', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => 'If an account exists with this email, you will receive a password reset link.', + +]; diff --git a/package-lock.json b/package-lock.json index 5632976af..a7008846a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "openchemlib": "^7.4.3", "pluralize": "^8.0.0", "popper.js": "^1.16.1", + "qs": "^6.14.2", "vue-instantsearch": "^4.3.3", "vue-simple-context-menu": "^4.0.4", "vue3-clipboard": "^1.0.0", @@ -46,8 +47,10 @@ "eslint": "^8.21.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-vue": "^9.3.0", + "husky": "^9.1.7", "laravel-vapor": "^0.7.1", "laravel-vite-plugin": "^1.2.0", + "lint-staged": "^16.2.7", "lodash": "^4.17.19", "postcss": "^8.4.19", "postcss-import": "^16.1.0", @@ -323,9 +326,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -419,855 +422,689 @@ } } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", - "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", - "cpu": [ - "ppc64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=18" + "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/@esbuild/android-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", - "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", - "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", - "cpu": [ - "arm64" - ], + "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", - "optional": true, - "os": [ - "android" - ], + "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": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", - "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "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/@esbuild/darwin-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", - "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", - "cpu": [ - "arm64" - ], + "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", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", - "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", - "cpu": [ - "x64" - ], + "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", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", - "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@headlessui/vue": { + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz", + "integrity": "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@tanstack/vue-virtual": "^3.0.0-beta.60" + }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "peerDependencies": { + "vue": "^3.2.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", - "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@heroicons/vue": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.2.0.tgz", + "integrity": "sha512-G3dbSxoeEKqbi/DFalhRxJU4mTXJn7GwZ7ae8NuEQzd1bqdd0jAbdaBZlHPcvPD2xI1iGzNVB4k20Un2AguYPw==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "peerDependencies": { + "vue": ">= 3" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", - "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", - "cpu": [ - "arm" - ], + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=18" + "node": ">=10.10.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", - "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", - "cpu": [ - "arm64" - ], + "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": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", - "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", - "cpu": [ - "ia32" - ], + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "license": "BSD-3-Clause" }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", - "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", - "cpu": [ - "loong64" - ], + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.70", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.70.tgz", + "integrity": "sha512-CYNRCgN6nBTjN4dNkrBCjHXNR2e4hQihdsZUs/afUNFOWLSYjfihca4EFN05rRvDk4Xoy2n8tym6IxBZmcn+Qg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", - "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", - "cpu": [ - "mips64el" - ], + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", - "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@inertiajs/core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.3.0.tgz", + "integrity": "sha512-TJ8R1eUYY473m9DaKlCPRdHTdznFWTDuy5VvEzXg3t/hohbDQedLj46yn/uAqziJPEUZJrSftZzPI2NMzL9tQA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "axios": "^1.6.0", + "deepmerge": "^4.0.0", + "nprogress": "^0.2.0", + "qs": "^6.9.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", - "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/@inertiajs/vue3": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.3.0.tgz", + "integrity": "sha512-GizqdCM3u4JWunit3uUbW4fEmTLKQTi1W7VvPRdrNy8XDt4Qy2cCmfFjq+aH5tHBSS3fI/ngYuhN7XvwqNaKvw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@inertiajs/core": "1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "vue": "^3.0.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", - "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", - "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", - "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", - "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", - "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", - "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", - "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", - "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "sunos" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", - "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", - "cpu": [ - "arm64" - ], + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", - "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", - "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@meilisearch/instant-meilisearch": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@meilisearch/instant-meilisearch/-/instant-meilisearch-0.7.1.tgz", + "integrity": "sha512-bUGiGO/da915Y9Dmu2n5fTMFvSlJHC6ABOcL7056OiBSCU1Bx1EvVEkzYmTxac3lqIoIpxZU5t0WXiPeikrg4g==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "meilisearch": "0.25.1" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "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": ">= 8" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 8" } }, - "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, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { - "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" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 8" } }, - "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, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", + "optional": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14" } }, - "node_modules/@headlessui/vue": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz", - "integrity": "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==", + "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", - "dependencies": { - "@tanstack/vue-virtual": "^3.0.0-beta.60" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "vue": "^3.2.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/@heroicons/vue": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.2.0.tgz", - "integrity": "sha512-G3dbSxoeEKqbi/DFalhRxJU4mTXJn7GwZ7ae8NuEQzd1bqdd0jAbdaBZlHPcvPD2xI1iGzNVB4k20Un2AguYPw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "vue": ">= 3" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], "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" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "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==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.52", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.52.tgz", - "integrity": "sha512-c41YOMzBhl3hp58WJLxT+Qq3UhBd8GZAMkbS8ddlCuIGLW0COGe2YSfOA2+poA8/bxLhUQODRNjAy3KhiAOtzA==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "CC0-1.0", - "dependencies": { - "@iconify/types": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/@inertiajs/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.3.0.tgz", - "integrity": "sha512-TJ8R1eUYY473m9DaKlCPRdHTdznFWTDuy5VvEzXg3t/hohbDQedLj46yn/uAqziJPEUZJrSftZzPI2NMzL9tQA==", "license": "MIT", - "dependencies": { - "axios": "^1.6.0", - "deepmerge": "^4.0.0", - "nprogress": "^0.2.0", - "qs": "^6.9.0" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@inertiajs/vue3": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.3.0.tgz", - "integrity": "sha512-GizqdCM3u4JWunit3uUbW4fEmTLKQTi1W7VvPRdrNy8XDt4Qy2cCmfFjq+aH5tHBSS3fI/ngYuhN7XvwqNaKvw==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@inertiajs/core": "1.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.isequal": "^4.5.0" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@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==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", - "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@meilisearch/instant-meilisearch": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@meilisearch/instant-meilisearch/-/instant-meilisearch-0.7.1.tgz", - "integrity": "sha512-bUGiGO/da915Y9Dmu2n5fTMFvSlJHC6ABOcL7056OiBSCU1Bx1EvVEkzYmTxac3lqIoIpxZU5t0WXiPeikrg4g==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "meilisearch": "0.25.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">=14" - } + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", - "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "linux" ] }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", - "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "openbsd" ] }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", - "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -1275,41 +1112,41 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "openharmony" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", - "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ] }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", - "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ - "arm64" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "win32" ] }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", - "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -1317,1626 +1154,2327 @@ "license": "MIT", "optional": true, "os": [ - "freebsd" + "win32" ] }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", - "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ] }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", - "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", - "cpu": [ - "arm" - ], + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sipec/vue3-tags-input": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@sipec/vue3-tags-input/-/vue3-tags-input-3.0.4.tgz", + "integrity": "sha512-zE4OiFkWvlvvGT3FZQ9hRrvJW935VPW0fe4K03SxM5Q/UQZMqph763UHXTuyK1orWNQMTbDx9tKPLIMZTiDXLA==", + "license": "MIT", + "dependencies": { + "vue": "^3.0.0-beta.1" + }, + "peerDependencies": { + "vue": "3.x" + } + }, + "node_modules/@swc/helpers": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.2.14.tgz", + "integrity": "sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA==", + "license": "MIT" + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", + "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/line-clamp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.3.1.tgz", + "integrity": "sha512-pNr0T8LAc3TUx/gxCfQZRe9NB2dPEo/cedPHzUGIPxqDMhgjwNm6jYxww4W5l0zAsAddxr+XfZcqttGiFDgrGg==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", + "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", + "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.12.tgz", + "integrity": "sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@types/dom-speech-recognition": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz", + "integrity": "sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==", + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "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/@types/google.maps": { + "version": "3.58.1", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", + "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hogan.js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hogan.js/-/hogan.js-3.0.5.tgz", + "integrity": "sha512-/uRaY3HGPWyLqOyhgvW9Aa43BNnLZrNeQxl2p8wqId4UHMfPKolSB+U7BlZyO1ng7MkLnyEAItsBzCG0SDhqrA==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/marked": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", + "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz", + "integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue-hero-icons/outline": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@vue-hero-icons/outline/-/outline-1.7.2.tgz", + "integrity": "sha512-mgMpncarjZHXY1K2tyjbYHf53yQG9amroDR9t2iH/umpsN8+f8RNcTy1m131EZ8WBCm8MpF97XpXPV129rvtVg==", + "license": "MIT", + "dependencies": { + "babel-helper-vue-jsx-merge-props": "^2.0.3" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", + "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/shared": "3.5.17", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", + "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", + "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/compiler-core": "3.5.17", + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", + "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", + "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", + "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", + "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.17", + "@vue/runtime-core": "3.5.17", + "@vue/shared": "3.5.17", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", + "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17" + }, + "peerDependencies": { + "vue": "3.5.17" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", + "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", + "license": "MIT" + }, + "node_modules/@vuepic/vue-datepicker": { + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-3.6.8.tgz", + "integrity": "sha512-9c6gfy2SYHunyH36m12NzLy+6fccTFf58zG/VAVo5inVedVisz3M0grw7fw77uMP1531MtIibmeq9C5SNUXxkw==", + "license": "MIT", + "dependencies": { + "date-fns": "^2.29.3", + "date-fns-tz": "^1.3.7" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/@vueuse/core": { + "version": "8.9.4", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.4.tgz", + "integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.14", + "@vueuse/metadata": "8.9.4", + "@vueuse/shared": "8.9.4", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.1.0", + "vue": "^2.6.0 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core/node_modules/@vueuse/shared": { + "version": "8.9.4", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.4.tgz", + "integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.1.0", + "vue": "^2.6.0 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", - "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", - "cpu": [ - "arm64" - ], + "node_modules/@vueuse/integrations/node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", - "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", - "cpu": [ - "arm64" - ], + "node_modules/@vueuse/integrations/node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", - "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@vueuse/metadata": { + "version": "8.9.4", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.4.tgz", + "integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", - "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", - "cpu": [ - "ppc64" - ], + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", - "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", - "cpu": [ - "riscv64" - ], + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", - "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", - "cpu": [ - "riscv64" - ], + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", - "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", - "cpu": [ - "s390x" - ], + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", - "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", - "cpu": [ - "x64" - ], + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", - "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", - "cpu": [ - "x64" - ], + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", - "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", - "cpu": [ - "arm64" - ], + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", - "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", - "cpu": [ - "ia32" - ], + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", - "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", - "cpu": [ - "x64" - ], + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } }, - "node_modules/@shikijs/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", - "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" + "@xtuc/long": "4.2.2" } }, - "node_modules/@shikijs/engine-javascript": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", - "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" - } + "peer": true }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/@shikijs/langs": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", - "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@shikijs/types": "2.5.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@shikijs/themes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", - "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@shikijs/types": "2.5.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/@shikijs/transformers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", - "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/types": "2.5.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "peer": true }, - "node_modules/@sipec/vue3-tags-input": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@sipec/vue3-tags-input/-/vue3-tags-input-3.0.4.tgz", - "integrity": "sha512-zE4OiFkWvlvvGT3FZQ9hRrvJW935VPW0fe4K03SxM5Q/UQZMqph763UHXTuyK1orWNQMTbDx9tKPLIMZTiDXLA==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", - "dependencies": { - "vue": "^3.0.0-beta.1" + "bin": { + "acorn": "bin/acorn" }, - "peerDependencies": { - "vue": "3.x" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@swc/helpers": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.2.14.tgz", - "integrity": "sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA==", - "license": "MIT" - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" + "peer": true, + "engines": { + "node": ">=10.13.0" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + "acorn": "^8.14.0" } }, - "node_modules/@tailwindcss/line-clamp": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.3.1.tgz", - "integrity": "sha512-pNr0T8LAc3TUx/gxCfQZRe9NB2dPEo/cedPHzUGIPxqDMhgjwNm6jYxww4W5l0zAsAddxr+XfZcqttGiFDgrGg==", + "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": { - "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" + "ajv": "^8.0.0" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@tanstack/virtual-core": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", - "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, "license": "MIT", + "peer": true, + "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/tannerlinsley" + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@tanstack/vue-virtual": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.12.tgz", - "integrity": "sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==", + "node_modules/ajv-formats/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", + "peer": true + }, + "node_modules/algoliasearch": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.33.0.tgz", + "integrity": "sha512-WdgSkmyTec5n2W2FA2/7Q7TCSajCV0X6w57u3H5GHnw0UCp/G5xb33/Jx1FX3uMtz17P3wGEzMCP82d0LJqMow==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.13.12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "@algolia/client-abtesting": "5.33.0", + "@algolia/client-analytics": "5.33.0", + "@algolia/client-common": "5.33.0", + "@algolia/client-insights": "5.33.0", + "@algolia/client-personalization": "5.33.0", + "@algolia/client-query-suggestions": "5.33.0", + "@algolia/client-search": "5.33.0", + "@algolia/ingestion": "1.33.0", + "@algolia/monitoring": "1.33.0", + "@algolia/recommend": "5.33.0", + "@algolia/requester-browser-xhr": "5.33.0", + "@algolia/requester-fetch": "5.33.0", + "@algolia/requester-node-http": "5.33.0" }, - "peerDependencies": { - "vue": "^2.7.0 || ^3.0.0" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@types/dom-speech-recognition": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz", - "integrity": "sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==", - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, + "node_modules/algoliasearch-helper": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", + "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", "license": "MIT", - "peer": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "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", - "peer": true, "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/@types/google.maps": { - "version": "3.58.1", - "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", - "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==", - "license": "MIT" + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "@types/unist": "*" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/hogan.js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/hogan.js/-/hogan.js-3.0.5.tgz", - "integrity": "sha512-/uRaY3HGPWyLqOyhgvW9Aa43BNnLZrNeQxl2p8wqId4UHMfPKolSB+U7BlZyO1ng7MkLnyEAItsBzCG0SDhqrA==", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "license": "MIT" }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT", - "peer": true + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "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": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } + "license": "Python-2.0" }, - "node_modules/@types/marked": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", - "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@types/unist": "*" + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", - "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", - "dev": true, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", - "peer": true, "dependencies": { - "undici-types": "~7.8.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true + "node_modules/axios-retry": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz", + "integrity": "sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.15.4", + "is-retry-allowed": "^2.2.0" + } }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==", "license": "MIT" }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz", - "integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, - "license": "ISC" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, "license": "MIT", "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue-hero-icons/outline": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@vue-hero-icons/outline/-/outline-1.7.2.tgz", - "integrity": "sha512-mgMpncarjZHXY1K2tyjbYHf53yQG9amroDR9t2iH/umpsN8+f8RNcTy1m131EZ8WBCm8MpF97XpXPV129rvtVg==", - "license": "MIT", - "dependencies": { - "babel-helper-vue-jsx-merge-props": "^2.0.3" + "node": "*" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", - "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.5", - "@vue/shared": "3.5.17", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", - "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.17", - "@vue/shared": "3.5.17" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", - "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "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/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@vue/compiler-core": "3.5.17", - "@vue/compiler-dom": "3.5.17", - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", - "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.17", - "@vue/shared": "3.5.17" + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@vue/devtools-api": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", - "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, + "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": { - "@vue/devtools-kit": "^7.7.7" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", - "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "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", - "dependencies": { - "@vue/devtools-shared": "^7.7.7", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } + "peer": true }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", - "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", - "dev": true, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "rfdc": "^1.4.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@vue/reactivity": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", - "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.17" + "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/@vue/runtime-core": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", - "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "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", - "dependencies": { - "@vue/reactivity": "3.5.17", - "@vue/shared": "3.5.17" + "engines": { + "node": ">=6" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", - "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.17", - "@vue/runtime-core": "3.5.17", - "@vue/shared": "3.5.17", - "csstype": "^3.1.3" + "engines": { + "node": ">= 6" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", - "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "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/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.17", - "@vue/shared": "3.5.17" - }, - "peerDependencies": { - "vue": "3.5.17" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vue/shared": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", - "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", - "license": "MIT" - }, - "node_modules/@vuepic/vue-datepicker": { - "version": "3.6.8", - "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-3.6.8.tgz", - "integrity": "sha512-9c6gfy2SYHunyH36m12NzLy+6fccTFf58zG/VAVo5inVedVisz3M0grw7fw77uMP1531MtIibmeq9C5SNUXxkw==", + "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": { - "date-fns": "^2.29.3", - "date-fns-tz": "^1.3.7" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, - "peerDependencies": { - "vue": ">=3.2.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vueuse/core": { - "version": "8.9.4", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.4.tgz", - "integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { - "@types/web-bluetooth": "^0.0.14", - "@vueuse/metadata": "8.9.4", - "@vueuse/shared": "8.9.4", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.1.0", - "vue": "^2.6.0 || ^3.2.0" + "has-flag": "^4.0.0" }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "vue": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/@vueuse/core/node_modules/@vueuse/shared": { - "version": "8.9.4", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.4.tgz", - "integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==", + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, "license": "MIT", - "dependencies": { - "vue-demi": "*" - }, "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.1.0", - "vue": "^2.6.0 || ^3.2.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "vue": { - "optional": true - } + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=12" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" + "url": "https://paulmillr.com/funding/" }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@vueuse/integrations": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", - "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", - "dev": true, - "license": "MIT", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { - "@vueuse/core": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" + "is-glob": "^4.0.1" }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } + "engines": { + "node": ">= 6" } }, - "node_modules/@vueuse/integrations/node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } }, - "node_modules/@vueuse/integrations/node_modules/@vueuse/core": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", - "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "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": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vueuse/integrations/node_modules/@vueuse/metadata": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", - "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vueuse/metadata": { - "version": "8.9.4", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.4.tgz", - "integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==", + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@vueuse/shared": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", - "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", + "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", "dev": true, "license": "MIT", "dependencies": { - "vue": "^3.5.13" + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, + "node_modules/click-outside-vue3": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/click-outside-vue3/-/click-outside-vue3-4.0.1.tgz", + "integrity": "sha512-sbplNecrup5oGqA3o4bo8XmvHRT6q9fvw21Z67aDbTqB9M6LF7CuYLTlLvNtOgKU6W3zst5H5zJuEh4auqA34g==", "license": "MIT", - "peer": true + "engines": { + "node": ">=6" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", "license": "MIT", - "peer": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "MIT", - "peer": true, + "license": "ISC", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, "license": "MIT", - "peer": true + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "engines": { + "node": ">= 6" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "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/concurrently": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", + "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "license": "MIT", - "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "node-fetch": "^2.7.0" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", - "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", "bin": { - "acorn": "bin/acorn" + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/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", - "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { - "node": ">=10.13.0" + "node": ">=0.11" }, - "peerDependencies": { - "acorn": "^8.14.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" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/date-fns-tz": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz", + "integrity": "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==", "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" + "peerDependencies": { + "date-fns": ">=2.0.0" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ajv": "^8.0.0" + "ms": "^2.1.3" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=6.0" }, "peerDependenciesMeta": { - "ajv": { + "supports-color": { "optional": true } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", - "peer": true, - "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" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "node_modules/delayed-stream": { "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", - "peer": true - }, - "node_modules/algoliasearch": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.33.0.tgz", - "integrity": "sha512-WdgSkmyTec5n2W2FA2/7Q7TCSajCV0X6w57u3H5GHnw0UCp/G5xb33/Jx1FX3uMtz17P3wGEzMCP82d0LJqMow==", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.33.0", - "@algolia/client-analytics": "5.33.0", - "@algolia/client-common": "5.33.0", - "@algolia/client-insights": "5.33.0", - "@algolia/client-personalization": "5.33.0", - "@algolia/client-query-suggestions": "5.33.0", - "@algolia/client-search": "5.33.0", - "@algolia/ingestion": "1.33.0", - "@algolia/monitoring": "1.33.0", - "@algolia/recommend": "5.33.0", - "@algolia/requester-browser-xhr": "5.33.0", - "@algolia/requester-fetch": "5.33.0", - "@algolia/requester-node-http": "5.33.0" - }, "engines": { - "node": ">= 14.0.0" + "node": ">=0.4.0" } }, - "node_modules/algoliasearch-helper": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", - "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "license": "MIT" }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "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==", + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "dequal": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", + "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": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 8" + "node": ">=6.0.0" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "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/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, + "node_modules/dompurify": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", + "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==", + "license": "(MPL-2.0 OR Apache-2.0)", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=20" }, - "peerDependencies": { - "postcss": "^8.1.0" + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" } }, - "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "node_modules/dropzone": { + "version": "6.0.0-beta.2", + "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-6.0.0-beta.2.tgz", + "integrity": "sha512-k44yLuFFhRk53M8zP71FaaNzJYIzr99SKmpbO/oZKNslDjNXQsBTdfLs+iONd0U0L94zzlFzRnFdqbLcs7h9fQ==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "@swc/helpers": "^0.2.13", + "just-extend": "^5.0.0" } }, - "node_modules/axios-retry": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz", - "integrity": "sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==", - "license": "Apache-2.0", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.15.4", - "is-retry-allowed": "^2.2.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/babel-helper-vue-jsx-merge-props": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", - "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">= 4" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, "engines": { - "node": ">=8" + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/birpc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", - "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "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/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, "license": "MIT", + "peer": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "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==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "@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": { - "browserslist": "cli.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "license": "MIT", - "peer": true + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/eslint-plugin-vue": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", + "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "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==", + "node_modules/eslint-plugin-vue/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=4" + } + }, + "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://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "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": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 6" + "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/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "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, - "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" + "license": "MIT" }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "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": "MIT", + "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": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://opencollective.com/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==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "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": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "has-flag": "^4.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "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": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "peer": true, + "engines": { + "node": ">=0.8.x" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "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==", "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@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.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8.6.0" } }, - "node_modules/chokidar/node_modules/glob-parent": { + "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==", @@ -2948,864 +3486,700 @@ "node": ">= 6" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "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", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/click-outside-vue3": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/click-outside-vue3/-/click-outside-vue3-4.0.1.tgz", - "integrity": "sha512-sbplNecrup5oGqA3o4bo8XmvHRT6q9fvw21Z67aDbTqB9M6LF7CuYLTlLvNtOgKU6W3zst5H5zJuEh4auqA34g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "license": "MIT", - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } + "license": "MIT" }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "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/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" + "reusify": "^1.0.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==", + "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": { - "color-name": "~1.1.4" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=7.0.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "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": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "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": ">= 6" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/concurrently": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", - "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, + "tabbable": "^6.4.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dev": true, - "license": "MIT", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", "dependencies": { - "is-what": "^4.1.8" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=12.13" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { - "node-fetch": "^2.7.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, "engines": { - "node": ">= 8" + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" + "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/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/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==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-fns-tz": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz", - "integrity": "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==", - "license": "MIT", - "peerDependencies": { - "date-fns": ">=2.0.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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "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/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" } }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "MIT", + "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": ">=6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { - "dequal": "^2.0.0" + "is-glob": "^4.0.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" + "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", + "peer": true }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "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": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dompurify": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dropzone": { - "version": "6.0.0-beta.2", - "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-6.0.0-beta.2.tgz", - "integrity": "sha512-k44yLuFFhRk53M8zP71FaaNzJYIzr99SKmpbO/oZKNslDjNXQsBTdfLs+iONd0U0L94zzlFzRnFdqbLcs7h9fQ==", + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", "license": "MIT", "dependencies": { - "@swc/helpers": "^0.2.13", - "just-extend": "^5.0.0" + "delegate": "^3.1.2" } }, - "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==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.185", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.185.tgz", - "integrity": "sha512-dYOZfUk57hSMPePoIQ1fZWl1Fkj+OshhEVuPacNKWzC1efe56OsHY3l/jCfiAgIICOU3VgOIdoq7ahg7r7n6MQ==", + "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" + "license": "ISC", + "peer": true }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "node_modules/gradient-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.1.1.tgz", + "integrity": "sha512-Hu0YfNU+38EsTmnUfLXUKFMXq9yz7htGYpF4x+dlbBhUCvIvzLt0yVLT/gJRmvLKFJdqNFrz4eKkIUjIXSr7Tw==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "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/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "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": ">= 4" + "node": ">=8" } }, - "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/esbuild": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", - "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.6", - "@esbuild/android-arm": "0.25.6", - "@esbuild/android-arm64": "0.25.6", - "@esbuild/android-x64": "0.25.6", - "@esbuild/darwin-arm64": "0.25.6", - "@esbuild/darwin-x64": "0.25.6", - "@esbuild/freebsd-arm64": "0.25.6", - "@esbuild/freebsd-x64": "0.25.6", - "@esbuild/linux-arm": "0.25.6", - "@esbuild/linux-arm64": "0.25.6", - "@esbuild/linux-ia32": "0.25.6", - "@esbuild/linux-loong64": "0.25.6", - "@esbuild/linux-mips64el": "0.25.6", - "@esbuild/linux-ppc64": "0.25.6", - "@esbuild/linux-riscv64": "0.25.6", - "@esbuild/linux-s390x": "0.25.6", - "@esbuild/linux-x64": "0.25.6", - "@esbuild/netbsd-arm64": "0.25.6", - "@esbuild/netbsd-x64": "0.25.6", - "@esbuild/openbsd-arm64": "0.25.6", - "@esbuild/openbsd-x64": "0.25.6", - "@esbuild/openharmony-arm64": "0.25.6", - "@esbuild/sunos-x64": "0.25.6", - "@esbuild/win32-arm64": "0.25.6", - "@esbuild/win32-ia32": "0.25.6", - "@esbuild/win32-x64": "0.25.6" + "bin": { + "hulk": "bin/hulk" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "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==", + "node_modules/htm": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", + "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==", + "license": "Apache-2.0" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "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" + "husky": "bin.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "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", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": ">= 4" } }, - "node_modules/eslint-plugin-vue": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", - "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", + "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": { - "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.3", - "vue-eslint-parser": "^9.4.3", - "xml-name-validator": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": ">=6" }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-vue/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "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", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, "engines": { - "node": ">=4" + "node": ">=0.8.19" } }, - "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==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "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" + "once": "^1.3.0", + "wrappy": "1" } }, - "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==", + "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": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "license": "ISC" + }, + "node_modules/instantsearch-ui-components": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.11.2.tgz", + "integrity": "sha512-XxwqUY6NifxSvHYfyfJRiGhqYqHXQFcFNOEjNyFptB9HOkx14yCdayKar4BZxGx353FnFD6b4Z8LdzbGud+RFA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6" } }, - "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", + "node_modules/instantsearch.js": { + "version": "4.79.1", + "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.79.1.tgz", + "integrity": "sha512-wqU4d3O+LHgTk+HfJaKdrhYCQkfhZ6JXD3S/WjOf0mTNH+zM9ma6ud2QdK7ebwgSwygXLNJ8Opaln+3paoVZQw==", + "license": "MIT", "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" + "@algolia/events": "^4.0.1", + "@types/dom-speech-recognition": "^0.0.1", + "@types/google.maps": "^3.55.12", + "@types/hogan.js": "^3.0.0", + "@types/qs": "^6.5.3", + "algoliasearch-helper": "3.26.0", + "hogan.js": "^3.0.2", + "htm": "^3.0.0", + "instantsearch-ui-components": "0.11.2", + "preact": "^10.10.0", + "qs": "^6.5.1 < 6.10", + "search-insights": "^2.17.2" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, + "node_modules/instantsearch.js/node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { - "estraverse": "^5.1.0" + "side-channel": "^1.1.0" }, "engines": { - "node": ">=0.10" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "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", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { - "node": ">=0.8.x" + "node": ">=8" } }, - "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==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { - "@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" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8.6.0" + "node": ">=0.10.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { - "node": ">= 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-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "node": ">=0.12.0" } }, - "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==", + "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", - "dependencies": { - "flat-cache": "^3.0.4" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "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==", + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { "node": ">=10" }, @@ -3813,2139 +4187,2202 @@ "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==", + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", "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": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/focus-trap": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", - "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", - "dev": true, - "license": "MIT", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" + "@isaacs/cliui": "^8.0.2" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 10.13.0" } }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "bin": { + "jiti": "bin/jiti.js" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", + "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": "ISC" + "license": "MIT" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "peer": true + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6" } }, - "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==", + "node_modules/jump.js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jump.js/-/jump.js-1.0.2.tgz", + "integrity": "sha512-oUkJJ/Y4ATU5qjkXBntCZSKctbSyS3ewe2jrLaUu/cc9jsQiAn0fnTUxQnZz3mJdDdem1Q279zrD6h3n+Cgxtg==", + "license": "MIT" + }, + "node_modules/just-extend": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-5.1.1.tgz", + "integrity": "sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ==", + "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", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "json-buffer": "3.0.1" } }, - "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==", + "node_modules/laravel-vapor": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/laravel-vapor/-/laravel-vapor-0.7.1.tgz", + "integrity": "sha512-A+SoMGX1ranj12TtKhvSb2Th4J430s/tPDFHAjSwz9L3Yuc77fG5a+/2bFM35xPKIxsfUx1U4L25XWokOIy3mg==", "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "dependencies": { + "axios": "^1.6.0" } }, - "node_modules/get-intrinsic": { + "node_modules/laravel-vite-plugin": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.3.0.tgz", + "integrity": "sha512-P5qyG56YbYxM8OuYmK2OkhcKe0AksNVJUjq9LUZ5tOekU9fBn9LujYyctI4t9XoLjuMvHJXXpCoPntY1oKltuA==", + "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" + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" }, "engines": { - "node": ">= 0.4" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "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": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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" - }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "url": "https://github.com/sponsors/antonk52" } }, - "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", - "peer": true + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/lint-staged": { + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": ">=8" + "node": ">=20.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", - "license": "MIT", - "dependencies": { - "delegate": "^3.1.2" + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=20" } }, - "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==", + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/gradient-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.1.1.tgz", - "integrity": "sha512-Hu0YfNU+38EsTmnUfLXUKFMXq9yz7htGYpF4x+dlbBhUCvIvzLt0yVLT/gJRmvLKFJdqNFrz4eKkIUjIXSr7Tw==", + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "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==", + "node_modules/listr2/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==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/listr2/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/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": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "node_modules/listr2/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==", "dev": true, - "license": "MIT" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" + "peer": true, + "engines": { + "node": ">=6.11.5" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/webpack" } }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.9.0" } }, - "node_modules/hogan.js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", - "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "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": { - "mkdirp": "0.3.0", - "nopt": "1.0.10" + "p-locate": "^5.0.0" }, - "bin": { - "hulk": "bin/hulk" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true, "license": "MIT" }, - "node_modules/htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==", - "license": "Apache-2.0" + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "license": "MIT" }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } + "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==", + "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-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": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "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": ">=6" + "node": ">=18" }, "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==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/log-update/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==", "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=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==", + "node_modules/log-update/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==", "dev": true, - "license": "ISC" - }, - "node_modules/instantsearch-ui-components": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.11.2.tgz", - "integrity": "sha512-XxwqUY6NifxSvHYfyfJRiGhqYqHXQFcFNOEjNyFptB9HOkx14yCdayKar4BZxGx353FnFD6b4Z8LdzbGud+RFA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.27.6" - } + "license": "MIT" }, - "node_modules/instantsearch.js": { - "version": "4.79.1", - "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.79.1.tgz", - "integrity": "sha512-wqU4d3O+LHgTk+HfJaKdrhYCQkfhZ6JXD3S/WjOf0mTNH+zM9ma6ud2QdK7ebwgSwygXLNJ8Opaln+3paoVZQw==", + "node_modules/log-update/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": { - "@algolia/events": "^4.0.1", - "@types/dom-speech-recognition": "^0.0.1", - "@types/google.maps": "^3.55.12", - "@types/hogan.js": "^3.0.0", - "@types/qs": "^6.5.3", - "algoliasearch-helper": "3.26.0", - "hogan.js": "^3.0.2", - "htm": "^3.0.0", - "instantsearch-ui-components": "0.11.2", - "preact": "^10.10.0", - "qs": "^6.5.1 < 6.10", - "search-insights": "^2.17.2" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/instantsearch.js/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "license": "BSD-3-Clause", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=0.6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/log-update/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==", + "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/medium-zoom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", + "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", + "license": "MIT" + }, + "node_modules/meilisearch": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/meilisearch/-/meilisearch-0.25.1.tgz", + "integrity": "sha512-20jO0pK9BhghxHSkOLbdoYn58h/Z0PNL3JQcRq7ipNIeqrxkAetCZZ6ttJC3uxcz0jVglmiFoSXu3Z/lEOLOLQ==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "cross-fetch": "^3.1.5" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 8" } }, - "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==", + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=0.12.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.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==", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/is-retry-allowed": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "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": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "bin": { + "mini-svg-data-uri": "cli.js" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "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": "MIT", - "peer": true, + "license": "ISC", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 10.13.0" + "node": "*" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "license": "MIT" }, - "node_modules/json-buffer": { + "node_modules/mitt": { "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, + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT", - "peer": true + "node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "license": "MIT/X11", + "engines": { + "node": "*" + } }, - "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==", + "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==", "dev": true, "license": "MIT" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { - "json5": "lib/cli.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=6" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/jump.js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jump.js/-/jump.js-1.0.2.tgz", - "integrity": "sha512-oUkJJ/Y4ATU5qjkXBntCZSKctbSyS3ewe2jrLaUu/cc9jsQiAn0fnTUxQnZz3mJdDdem1Q279zrD6h3n+Cgxtg==", - "license": "MIT" - }, - "node_modules/just-extend": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-5.1.1.tgz", - "integrity": "sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ==", + "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/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } + "peer": true }, - "node_modules/laravel-vapor": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/laravel-vapor/-/laravel-vapor-0.7.1.tgz", - "integrity": "sha512-A+SoMGX1ranj12TtKhvSb2Th4J430s/tPDFHAjSwz9L3Yuc77fG5a+/2bFM35xPKIxsfUx1U4L25XWokOIy3mg==", - "dev": 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": { - "axios": "^1.6.0" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/laravel-vite-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.3.0.tgz", - "integrity": "sha512-P5qyG56YbYxM8OuYmK2OkhcKe0AksNVJUjq9LUZ5tOekU9fBn9LujYyctI4t9XoLjuMvHJXXpCoPntY1oKltuA==", + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "vite-plugin-full-reload": "^1.1.0" + "abbrev": "1" }, "bin": { - "clean-orphaned-assets": "bin/clean.js" + "nopt": "bin/nopt.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0" + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "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": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "boolbase": "^1.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "node": ">=0.10.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { - "node": ">=6.11.5" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "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": "MIT", + "license": "ISC", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "wrappy": "1" } }, - "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==", + "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": { - "p-locate": "^5.0.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" + "node_modules/ontology-elements": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ontology-elements/-/ontology-elements-0.2.3.tgz", + "integrity": "sha512-7+VBiAveZ8ek3jeGIGOyZPd4y8D7cDWzDwO57+rBnuZXLDaaKIelZ1z/MV0BF/4ghzVl6IGhtkXiRL3LnSeEWA==", + "dependencies": { + "vue": "^3.2.47" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "node_modules/openchemlib": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-7.5.0.tgz", + "integrity": "sha512-cxEmgL1Szuw5zPDX29PyuAIkokSKPkzEIc/61oPA84GqvGyjMMRrGaF4tbFCDOT4c7ULZ/qmIWk9/ERj3wOg1w==", + "license": "BSD-3-Clause" }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "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": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/medium-zoom": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", - "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", - "license": "MIT" - }, - "node_modules/meilisearch": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/meilisearch/-/meilisearch-0.25.1.tgz", - "integrity": "sha512-20jO0pK9BhghxHSkOLbdoYn58h/Z0PNL3JQcRq7ipNIeqrxkAetCZZ6ttJC3uxcz0jVglmiFoSXu3Z/lEOLOLQ==", - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "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", - "peer": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "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": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "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, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "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, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "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, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, "engines": { - "node": ">=8.6" + "node": ">=0.10.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", "dependencies": { - "mime-db": "1.52.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "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": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", - "bin": { - "mini-svg-data-uri": "cli.js" + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" }, "engines": { - "node": "*" + "node": ">=0.10" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.10.0" } }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "dev": true, - "license": "MIT" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "license": "MIT/X11", + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", "engines": { - "node": "*" + "node": ">= 6" } }, - "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==", - "dev": true, - "license": "MIT" + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "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", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^10 || ^12 || >=14" } }, - "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/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/postcss-import": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.1.tgz", + "integrity": "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==", "dev": true, "license": "MIT", - "peer": 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" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "postcss": "^8.0.0" } }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "license": "MIT", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "camelcase-css": "^2.0.1" }, "engines": { - "node": "*" + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" - }, - "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==", + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": ">=4" } }, - "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==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/preact": { + "version": "10.28.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", + "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "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": ">= 6" + "node": ">= 0.8.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==", + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, "engines": { - "node": ">= 0.4" + "node": ">=10.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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==", + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/oniguruma-to-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", - "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ontology-elements": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ontology-elements/-/ontology-elements-0.2.3.tgz", - "integrity": "sha512-7+VBiAveZ8ek3jeGIGOyZPd4y8D7cDWzDwO57+rBnuZXLDaaKIelZ1z/MV0BF/4ghzVl6IGhtkXiRL3LnSeEWA==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", "dependencies": { - "vue": "^3.2.47" + "pify": "^2.3.0" } }, - "node_modules/openchemlib": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-7.5.0.tgz", - "integrity": "sha512-cxEmgL1Szuw5zPDX29PyuAIkokSKPkzEIc/61oPA84GqvGyjMMRrGaF4tbFCDOT4c7ULZ/qmIWk9/ERj3wOg1w==", - "license": "BSD-3-Clause" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { - "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" + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.10.0" } }, - "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==", + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "regex-utilities": "^2.3.0" } }, - "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==", + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "regex-utilities": "^2.3.0" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-exists": { + "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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": ">=8" + "node": ">=4" } }, - "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==", + "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": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { - "node": ">=8" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "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/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=16 || 14 >=14.18" + "bin": { + "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "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": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" } }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "node_modules/postcss-import": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.1.tgz", - "integrity": "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==", + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=18.0.0" + "node": ">= 10.13.0" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" + "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": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" + "fast-deep-equal": "^3.1.3" }, "peerDependencies": { - "postcss": "^8.2.14" + "ajv": "^8.8.2" } }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/schema-utils/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", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "peer": true + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT" + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/preact": { - "version": "10.26.9", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.9.tgz", - "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "node": ">=8" } }, - "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, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, - "node_modules/proxy-from-env": { + "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "dependencies": { - "side-channel": "^1.1.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { - "safe-buffer": "^5.1.0" + "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/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { - "pify": "^2.3.0" + "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/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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": { - "picomatch": "^2.2.1" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", - "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "node_modules/slice-ansi/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==", "dev": true, "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "node_modules/slice-ansi/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": { - "regex-utilities": "^2.3.0" + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", "license": "MIT" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "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": "MIT", + "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "peer": true, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "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", + "peer": true, "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "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==", + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", "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==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "license": "MIT", + "engines": { + "node": ">=0.6.19" } }, - "node_modules/rollup": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", - "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", - "dev": true, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.45.1", - "@rollup/rollup-android-arm64": "4.45.1", - "@rollup/rollup-darwin-arm64": "4.45.1", - "@rollup/rollup-darwin-x64": "4.45.1", - "@rollup/rollup-freebsd-arm64": "4.45.1", - "@rollup/rollup-freebsd-x64": "4.45.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", - "@rollup/rollup-linux-arm-musleabihf": "4.45.1", - "@rollup/rollup-linux-arm64-gnu": "4.45.1", - "@rollup/rollup-linux-arm64-musl": "4.45.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-musl": "4.45.1", - "@rollup/rollup-linux-s390x-gnu": "4.45.1", - "@rollup/rollup-linux-x64-gnu": "4.45.1", - "@rollup/rollup-linux-x64-musl": "4.45.1", - "@rollup/rollup-win32-arm64-msvc": "4.45.1", - "@rollup/rollup-win32-ia32-msvc": "4.45.1", - "@rollup/rollup-win32-x64-msvc": "4.45.1", - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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", - "peer": true - }, - "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "dev": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=8" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "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", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "engines": { + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "license": "MIT", - "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" }, - "peerDependencies": { - "ajv": "^8.8.2" + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "license": "MIT", - "peer": true - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT" - }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", - "license": "MIT" + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, + "node_modules/sucrase/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, "bin": { - "semver": "bin/semver.js" + "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", "dependencies": { - "randombytes": "^2.1.0" + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "copy-anything": "^4" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "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==", + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5954,434 +6391,460 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/langs": "2.5.0", - "@shikijs/themes": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } + "license": "MIT" }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/tailwindcss": { + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "node_modules/tailwindcss-bg-patterns": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss-bg-patterns/-/tailwindcss-bg-patterns-0.3.0.tgz", + "integrity": "sha512-3pXCiu9MPBvfBAEYgrxpNZLZoDlVHdkofpuQ9uhVQ2RT+80BTTweL9s0uIvakfH2LRl4GCG+nncyCB+1aN1gpA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">2" + } + }, + "node_modules/tailwindcss/node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": ">= 0.4" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.0.0" } }, - "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==", + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { - "node": ">= 0.4" + "node": ">= 14" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "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==", + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { - "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" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=14" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/sortablejs": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", - "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", - "license": "MIT" - }, - "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==", + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-2-Clause", "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "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==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.17", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz", + "integrity": "sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "peer": true }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "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": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "any-promise": "^1.0.0" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT" }, - "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==", + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "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==", + "node_modules/tinyglobby/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": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "is-number": "^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8.0" } }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "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/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "bin": { + "tree-kill": "cli.js" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/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": { - "brace-expansion": "^2.0.1" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "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/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/superjson": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", - "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "dev": true, "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } + "peer": true }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tailwindcss-bg-patterns": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tailwindcss-bg-patterns/-/tailwindcss-bg-patterns-0.3.0.tgz", - "integrity": "sha512-3pXCiu9MPBvfBAEYgrxpNZLZoDlVHdkofpuQ9uhVQ2RT+80BTTweL9s0uIvakfH2LRl4GCG+nncyCB+1aN1gpA==", + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "dev": true, "license": "MIT", - "peerDependencies": { - "tailwindcss": ">2" + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tailwindcss/node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, "funding": [ { "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", @@ -6390,518 +6853,612 @@ ], "license": "MIT", "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">= 14" + "bin": { + "update-browserslist-db": "cli.js" }, "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "browserslist": ">= 4.21.0" } }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", + "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": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "punycode": "^2.1.0" } }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "dev": true, - "license": "BSD-2-Clause", - "peer": true, + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">= 10.13.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "webpack": "^5.1.0" + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "@swc/core": { + "@types/node": { "optional": true }, - "esbuild": { + "jiti": { "optional": true }, - "uglify-js": { + "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/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } }, - "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==", + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "license": "MIT" + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "license": "MIT" + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=18" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=18" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "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/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "bin": { - "tree-kill": "cli.js" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "0BSD" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=18" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "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" - } + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" ], + "dev": true, "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": ">=18" }, "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-full-reload": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", - "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "picomatch": "^2.3.1" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, "node_modules/vite/node_modules/fdir": { @@ -6920,9 +7477,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "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": { @@ -6975,9 +7532,9 @@ } }, "node_modules/vitepress/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], @@ -6988,13 +7545,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], @@ -7005,13 +7562,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], @@ -7022,13 +7579,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], @@ -7039,13 +7596,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], @@ -7056,13 +7613,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], @@ -7073,13 +7630,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], @@ -7090,13 +7647,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], @@ -7107,13 +7664,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], @@ -7124,13 +7681,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], @@ -7141,13 +7698,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], @@ -7158,13 +7715,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], @@ -7175,13 +7732,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], @@ -7192,13 +7749,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], @@ -7209,13 +7766,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], @@ -7226,13 +7783,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], @@ -7243,13 +7800,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], @@ -7260,13 +7817,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/vitepress/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], @@ -7277,13 +7851,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/vitepress/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], @@ -7294,13 +7885,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], @@ -7311,13 +7902,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], @@ -7328,13 +7919,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], @@ -7345,13 +7936,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], @@ -7362,7 +7953,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vitepress/node_modules/@types/web-bluetooth": { @@ -7399,9 +7990,9 @@ } }, "node_modules/vitepress/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7409,32 +8000,34 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, "node_modules/vitepress/node_modules/vite": { @@ -7783,9 +8376,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "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", "peer": true, @@ -7804,9 +8397,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.100.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.2.tgz", - "integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==", + "version": "5.105.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.1.tgz", + "integrity": "sha512-Gdj3X74CLJJ8zy4URmK42W7wTZUJrqL+z8nyGEr4dTN0kb3nVs+ZvjbTOqRYPD7qX4tUmwyHL9Q9K6T1seW6Yw==", "dev": true, "license": "MIT", "peer": true, @@ -7819,22 +8412,22 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.2", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", "webpack-sources": "^3.3.3" }, "bin": { @@ -7989,15 +8582,18 @@ } }, "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { diff --git a/package.json b/package.json index 448442efe..f97cf9bbe 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,17 @@ "format": "prettier resources/js --write", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", - "docs:preview": "vitepress preview docs" + "docs:preview": "vitepress preview docs", + "prepare": "husky" + }, + "lint-staged": { + "*.php": [ + "vendor/bin/pint" + ], + "*.{js,vue}": [ + "eslint --fix", + "prettier --write" + ] }, "devDependencies": { "@tailwindcss/forms": "^0.5.3", @@ -20,8 +30,10 @@ "eslint": "^8.21.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-vue": "^9.3.0", + "husky": "^9.1.7", "laravel-vapor": "^0.7.1", "laravel-vite-plugin": "^1.2.0", + "lint-staged": "^16.2.7", "lodash": "^4.17.19", "postcss": "^8.4.19", "postcss-import": "^16.1.0", @@ -55,6 +67,7 @@ "openchemlib": "^7.4.3", "pluralize": "^8.0.0", "popper.js": "^1.16.1", + "qs": "^6.14.2", "vue-instantsearch": "^4.3.3", "vue-simple-context-menu": "^4.0.4", "vue3-clipboard": "^1.0.0", @@ -62,5 +75,13 @@ "vue3-slider": "^1.7.0", "vue3-tour": "^0.2.0", "vuedraggable": "^4.1.0" + }, + "overrides": { + "ajv": "^6.14.0", + "esbuild": "0.25.0", + "instantsearch.js": { + "qs": "6.14.2" + }, + "preact": ">=10.26.10" } } diff --git a/phpunit.xml b/phpunit.xml index 5410ece8d..0e4879487 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -7,20 +7,43 @@ ./tests/Feature + + ./tests/API + - + + + + + + + - + + + + + + + + + + + ./app + + ./app/Console + ./app/Helper.php + diff --git a/public/build/manifest.json b/public/build/manifest.json index 96555c75b..16fc03ec0 100644 --- a/public/build/manifest.json +++ b/public/build/manifest.json @@ -1,490 +1,527 @@ { - "_AccessDialogue-DaBf4ai0.js": { - "file": "assets/AccessDialogue-DaBf4ai0.js", + "_AccessDialogue-Cateni1h.js": { + "file": "assets/AccessDialogue-Cateni1h.js", "name": "AccessDialogue", "imports": [ "resources/js/app.js", - "_ActionMessage-uxM-o-da.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", - "_ToolTip-B-BuMZla.js", - "_transition-K5DyIAHH.js" + "_ActionMessage-D3hDlqs6.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", + "_ToolTip-CctsjpN9.js", + "_transition-N3Y6B5xr.js" ] }, - "_ActionMessage-uxM-o-da.js": { - "file": "assets/ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js": { + "file": "assets/ActionMessage-D3hDlqs6.js", "name": "ActionMessage", "imports": [ "resources/js/app.js" ] }, - "_ActionSection-DoJrofwP.js": { - "file": "assets/ActionSection-DoJrofwP.js", + "_ActionSection-DGSZ5cOQ.js": { + "file": "assets/ActionSection-DGSZ5cOQ.js", "name": "ActionSection", "imports": [ - "_SectionTitle-rK4YId1t.js", + "_SectionTitle-wvDa7nYi.js", "resources/js/app.js" ] }, - "_AnnouncementBanner-B_CIbGMm.js": { - "file": "assets/AnnouncementBanner-B_CIbGMm.js", + "_AnnouncementBanner-Bi5ktTFR.js": { + "file": "assets/AnnouncementBanner-Bi5ktTFR.js", "name": "AnnouncementBanner", "imports": [ "resources/js/app.js", - "_XMarkIcon-BrZ2BUzq.js" + "_XMarkIcon-BcXHAYXa.js" ] }, - "_AppLayout-shqwEEI1.js": { - "file": "assets/AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js": { + "file": "assets/AppLayout-Dor7lhho.js", "name": "AppLayout", "imports": [ - "_ApplicationLogo-Byie6Ini.js", - "resources/js/app.js", - "_transition-K5DyIAHH.js", - "_ToolTip-B-BuMZla.js", - "_form-Cn9CuD1E.js", - "_use-outside-click-UcI2wRsE.js", - "_use-text-value-BpD-bIcx.js", - "_hidden-2_Kmyvd6.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_ApplicationLogo-DTY9oAac.js", + "resources/js/app.js", + "_ToolTip-CctsjpN9.js", + "_transition-N3Y6B5xr.js", + "_form-BpOT_RbF.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_hidden-F-jzL4rc.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", "resources/js/Pages/Study/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_vue-tags-input-BGwEuaGX.js", - "_InputError-EInikEKW.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_SelectRich-Bh8aQhO2.js" - ] - }, - "_ApplicationLogo-Byie6Ini.js": { - "file": "assets/ApplicationLogo-Byie6Ini.js", + "_DialogModal-kRhYIaZg.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_vue-tags-input-DbsHG6CC.js", + "_InputError-CfIESodf.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_SelectRich-CJpqbOjy.js" + ] + }, + "_ApplicationLogo-DTY9oAac.js": { + "file": "assets/ApplicationLogo-DTY9oAac.js", "name": "ApplicationLogo", "imports": [ "resources/js/app.js" ] }, - "_AuthenticationCard-qrykQH--.js": { - "file": "assets/AuthenticationCard-qrykQH--.js", - "name": "AuthenticationCard", - "imports": [ - "resources/js/app.js" - ] + "_AuthenticationCardLogo-Ch3PkjAO.css": { + "file": "assets/AuthenticationCardLogo-Ch3PkjAO.css", + "src": "_AuthenticationCardLogo-Ch3PkjAO.css" }, - "_AuthenticationCardLogo-B3Uq11MZ.js": { - "file": "assets/AuthenticationCardLogo-B3Uq11MZ.js", + "_AuthenticationCardLogo-MJTb4TXc.js": { + "file": "assets/AuthenticationCardLogo-MJTb4TXc.js", "name": "AuthenticationCardLogo", "imports": [ "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js" + "_ApplicationLogo-DTY9oAac.js" + ], + "css": [ + "assets/AuthenticationCardLogo-Ch3PkjAO.css" ] }, - "_BreadCrumbs-Db7NAUm-.js": { - "file": "assets/BreadCrumbs-Db7NAUm-.js", + "_AuthorCard-D18guzLA.js": { + "file": "assets/AuthorCard-D18guzLA.js", + "name": "AuthorCard", + "imports": [ + "_Tag-C07nHEfs.js", + "resources/js/app.js" + ] + }, + "_BreadCrumbs-DS-h1Jwn.js": { + "file": "assets/BreadCrumbs-DS-h1Jwn.js", "name": "BreadCrumbs", "imports": [ "resources/js/app.js" ] }, - "_Button-Do-BJmWY.js": { - "file": "assets/Button-Do-BJmWY.js", + "_Button-D-DNlnje.js": { + "file": "assets/Button-D-DNlnje.js", "name": "Button", "imports": [ "resources/js/app.js" ] }, - "_CalendarDaysIcon-bzmmtrVA.js": { - "file": "assets/CalendarDaysIcon-bzmmtrVA.js", + "_CalendarDaysIcon-CP-Ljnby.js": { + "file": "assets/CalendarDaysIcon-CP-Ljnby.js", "name": "CalendarDaysIcon", "imports": [ "resources/js/app.js" ] }, - "_Checkbox-CmyOWzuc.js": { - "file": "assets/Checkbox-CmyOWzuc.js", + "_Checkbox-t6wmhQJV.js": { + "file": "assets/Checkbox-t6wmhQJV.js", "name": "Checkbox", "imports": [ "resources/js/app.js" ] }, - "_CircleStackIcon-NWc2meE7.js": { - "file": "assets/CircleStackIcon-NWc2meE7.js", + "_CircleStackIcon-D1Ld0mK2.js": { + "file": "assets/CircleStackIcon-D1Ld0mK2.js", "name": "CircleStackIcon", "imports": [ "resources/js/app.js" ] }, - "_Citation-Dj91Ydnp.js": { - "file": "assets/Citation-Dj91Ydnp.js", + "_Citation-BBqsTw0Q.js": { + "file": "assets/Citation-BBqsTw0Q.js", "name": "Citation", "imports": [ "resources/js/app.js" ] }, - "_CitationCard-mr9Srs1M.js": { - "file": "assets/CitationCard-mr9Srs1M.js", + "_CitationCard-D-wfjUVo.js": { + "file": "assets/CitationCard-D-wfjUVo.js", "name": "CitationCard", "imports": [ - "_Tag-DRPRU5B7.js", "resources/js/app.js" ] }, - "_ClipboardDocumentIcon-DCnLMHiO.js": { - "file": "assets/ClipboardDocumentIcon-DCnLMHiO.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js": { + "file": "assets/ClipboardDocumentIcon-CQaQmjbZ.js", "name": "ClipboardDocumentIcon", "imports": [ "resources/js/app.js" ] }, - "_ConfirmationModal-BqBcQKy5.js": { - "file": "assets/ConfirmationModal-BqBcQKy5.js", + "_ConfirmationModal-CINCDmZJ.js": { + "file": "assets/ConfirmationModal-CINCDmZJ.js", "name": "ConfirmationModal", "imports": [ - "_Modal-D-_sV66W.js", + "_Modal-D64jrvfn.js", "resources/js/app.js" ] }, - "_DOIBadge-BBho5C2T.js": { - "file": "assets/DOIBadge-BBho5C2T.js", + "_DOIBadge-BQ7FAuLx.js": { + "file": "assets/DOIBadge-BQ7FAuLx.js", "name": "DOIBadge", "imports": [ "resources/js/app.js" ] }, - "_DangerButton-DhWljAF_.js": { - "file": "assets/DangerButton-DhWljAF_.js", + "_DangerButton-BGA6_FlM.js": { + "file": "assets/DangerButton-BGA6_FlM.js", "name": "DangerButton", "imports": [ "resources/js/app.js" ] }, - "_Depictor2D-BloOWuSj.js": { - "file": "assets/Depictor2D-BloOWuSj.js", + "_Depictor2D-D8c81TYu.js": { + "file": "assets/Depictor2D-D8c81TYu.js", "name": "Depictor2D", "imports": [ "resources/js/app.js" ] }, - "_Depictor3D-DpHRqJcL.js": { - "file": "assets/Depictor3D-DpHRqJcL.js", + "_Depictor3D-DV_4Quud.js": { + "file": "assets/Depictor3D-DV_4Quud.js", "name": "Depictor3D", "imports": [ "resources/js/app.js" ] }, - "_DialogModal-CmZ6e9E-.js": { - "file": "assets/DialogModal-CmZ6e9E-.js", + "_DialogModal-kRhYIaZg.js": { + "file": "assets/DialogModal-kRhYIaZg.js", "name": "DialogModal", "imports": [ - "_Modal-D-_sV66W.js", + "_Modal-D64jrvfn.js", "resources/js/app.js" ] }, - "_FlashMessages-H7Dz0t6O.js": { - "file": "assets/FlashMessages-H7Dz0t6O.js", + "_EmptySearchState-o9-rntAO.js": { + "file": "assets/EmptySearchState-o9-rntAO.js", + "name": "EmptySearchState", + "imports": [ + "resources/js/app.js" + ] + }, + "_FlashMessages-B9FLcdP2.js": { + "file": "assets/FlashMessages-B9FLcdP2.js", "name": "FlashMessages", "imports": [ "resources/js/app.js" ] }, - "_FormSection-D_YXuO3u.js": { - "file": "assets/FormSection-D_YXuO3u.js", + "_Footer-nhWzX88G.js": { + "file": "assets/Footer-nhWzX88G.js", + "name": "Footer", + "imports": [ + "resources/js/app.js", + "_ApplicationLogo-DTY9oAac.js" + ] + }, + "_FormSection-CGKXQW1v.js": { + "file": "assets/FormSection-CGKXQW1v.js", "name": "FormSection", "imports": [ - "_SectionTitle-rK4YId1t.js", + "_SectionTitle-wvDa7nYi.js", "resources/js/app.js" ] }, - "_HomeIcon-B3apTAEd.js": { - "file": "assets/HomeIcon-B3apTAEd.js", + "_HomeIcon-DwnjDmsR.js": { + "file": "assets/HomeIcon-DwnjDmsR.js", "name": "HomeIcon", "imports": [ "resources/js/app.js" ] }, - "_Icon-qHt8_t4q.js": { - "file": "assets/Icon-qHt8_t4q.js", + "_Icon-CoGNbYth.js": { + "file": "assets/Icon-CoGNbYth.js", "name": "Icon", "imports": [ "resources/js/app.js" ] }, - "_Input-B-ZTzbzW.js": { - "file": "assets/Input-B-ZTzbzW.js", + "_InboxIcon-6kSjCYig.js": { + "file": "assets/InboxIcon-6kSjCYig.js", + "name": "InboxIcon", + "imports": [ + "resources/js/app.js" + ] + }, + "_Input-BlZBuXvW.js": { + "file": "assets/Input-BlZBuXvW.js", "name": "Input", "imports": [ "resources/js/app.js" ] }, - "_InputError-EInikEKW.js": { - "file": "assets/InputError-EInikEKW.js", + "_InputError-CfIESodf.js": { + "file": "assets/InputError-CfIESodf.js", "name": "InputError", "imports": [ "resources/js/app.js" ] }, - "_Label-DGyfHV0z.js": { - "file": "assets/Label-DGyfHV0z.js", + "_Label-MQuMO0BF.js": { + "file": "assets/Label-MQuMO0BF.js", "name": "Label", "imports": [ "resources/js/app.js" ] }, - "_LoadingButton-DQ530rQU.js": { - "file": "assets/LoadingButton-DQ530rQU.js", + "_LoadingButton-B68Xuzxz.js": { + "file": "assets/LoadingButton-B68Xuzxz.js", "name": "LoadingButton", "imports": [ "resources/js/app.js" ] }, - "_LockClosedIcon-CK-FFoS7.js": { - "file": "assets/LockClosedIcon-CK-FFoS7.js", + "_LockClosedIcon-CtxNZ2_i.js": { + "file": "assets/LockClosedIcon-CtxNZ2_i.js", "name": "LockClosedIcon", "imports": [ "resources/js/app.js" ] }, - "_MagnifyingGlassIcon-Cq7Ou0Fo.js": { - "file": "assets/MagnifyingGlassIcon-Cq7Ou0Fo.js", + "_MagnifyingGlassIcon-B7G_6YVF.js": { + "file": "assets/MagnifyingGlassIcon-B7G_6YVF.js", "name": "MagnifyingGlassIcon", "imports": [ - "_portal-viea1unE.js", - "resources/js/app.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js" + "resources/js/app.js" ] }, - "_ManageCitation-A3-Z6aBb.js": { - "file": "assets/ManageCitation-A3-Z6aBb.js", + "_ManageCitation-BZxJ4fLR.js": { + "file": "assets/ManageCitation-BZxJ4fLR.js", "name": "ManageCitation", "imports": [ - "_DialogModal-CmZ6e9E-.js", - "_SecondaryButton-BucXplhe.js", - "_InputError-EInikEKW.js", - "_LoadingButton-DQ530rQU.js", - "_DangerButton-DhWljAF_.js", + "_DialogModal-kRhYIaZg.js", + "_SecondaryButton-DqadZgr8.js", + "_InputError-CfIESodf.js", + "_LoadingButton-B68Xuzxz.js", + "_DangerButton-BGA6_FlM.js", "resources/js/app.js", - "_SelectRich-Bh8aQhO2.js", - "_CitationCard-mr9Srs1M.js", - "_AppLayout-shqwEEI1.js", - "_vue-tags-input-BGwEuaGX.js" + "_SelectRich-CJpqbOjy.js", + "_AuthorCard-D18guzLA.js", + "_RorAffiliationTypeahead-DYrNK_fV.js", + "_AppLayout-Dor7lhho.js", + "_vue-tags-input-DbsHG6CC.js", + "_CitationCard-D-wfjUVo.js" ] }, - "_Modal-D-_sV66W.js": { - "file": "assets/Modal-D-_sV66W.js", + "_Modal-D64jrvfn.js": { + "file": "assets/Modal-D64jrvfn.js", "name": "Modal", "imports": [ "resources/js/app.js" ] }, - "_Pagination-DUPh-k9M.js": { - "file": "assets/Pagination-DUPh-k9M.js", + "_Pagination-BJfz3HvD.js": { + "file": "assets/Pagination-BJfz3HvD.js", "name": "Pagination", "imports": [ "resources/js/app.js" ] }, - "_ProjectCard-C7JLsgIL.js": { - "file": "assets/ProjectCard-C7JLsgIL.js", + "_ProjectCard-HxMXAAdU.js": { + "file": "assets/ProjectCard-HxMXAAdU.js", "name": "ProjectCard", "imports": [ "resources/js/app.js", - "_Tag-DRPRU5B7.js", - "_ScaleIcon-CYgZpCW4.js", - "_ToolTip-B-BuMZla.js" + "_Tag-C07nHEfs.js", + "_ScaleIcon-CtOQtGbS.js", + "_ToolTip-CctsjpN9.js" ] }, - "_ScaleIcon-CYgZpCW4.js": { - "file": "assets/ScaleIcon-CYgZpCW4.js", + "_RorAffiliationTypeahead-DYrNK_fV.js": { + "file": "assets/RorAffiliationTypeahead-DYrNK_fV.js", + "name": "RorAffiliationTypeahead", + "imports": [ + "_Input-BlZBuXvW.js", + "resources/js/app.js" + ] + }, + "_ScaleIcon-CtOQtGbS.js": { + "file": "assets/ScaleIcon-CtOQtGbS.js", "name": "ScaleIcon", "imports": [ "resources/js/app.js" ] }, - "_SecondaryButton-BucXplhe.js": { - "file": "assets/SecondaryButton-BucXplhe.js", + "_SecondaryButton-DqadZgr8.js": { + "file": "assets/SecondaryButton-DqadZgr8.js", "name": "SecondaryButton", "imports": [ "resources/js/app.js" ] }, - "_SectionBorder-Dz4Jb6r4.js": { - "file": "assets/SectionBorder-Dz4Jb6r4.js", + "_SectionBorder-mpmjkaR3.js": { + "file": "assets/SectionBorder-mpmjkaR3.js", "name": "SectionBorder", "imports": [ "resources/js/app.js" ] }, - "_SectionTitle-rK4YId1t.js": { - "file": "assets/SectionTitle-rK4YId1t.js", + "_SectionTitle-wvDa7nYi.js": { + "file": "assets/SectionTitle-wvDa7nYi.js", "name": "SectionTitle", "imports": [ "resources/js/app.js" ] }, - "_SelectOrcidId-D9IuGi3f.js": { - "file": "assets/SelectOrcidId-D9IuGi3f.js", + "_SelectOrcidId-DBsdB99F.js": { + "file": "assets/SelectOrcidId-DBsdB99F.js", "name": "SelectOrcidId", "imports": [ - "_SecondaryButton-BucXplhe.js", - "_DialogModal-CmZ6e9E-.js", - "_LoadingButton-DQ530rQU.js", + "_SecondaryButton-DqadZgr8.js", + "_DialogModal-kRhYIaZg.js", + "_LoadingButton-B68Xuzxz.js", "resources/js/app.js" ] }, - "_SelectRich-Bh8aQhO2.js": { - "file": "assets/SelectRich-Bh8aQhO2.js", + "_SelectRich-CJpqbOjy.js": { + "file": "assets/SelectRich-CJpqbOjy.js", "name": "SelectRich", "imports": [ "resources/js/app.js", - "_hidden-2_Kmyvd6.js", - "_use-outside-click-UcI2wRsE.js", + "_hidden-F-jzL4rc.js", + "_use-outside-click-DAnsQAYx.js", "_micro-task-CxIZtCgj.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js" + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js" ] }, - "_ShareIcon-Bhy_NH0G.js": { - "file": "assets/ShareIcon-Bhy_NH0G.js", + "_ShareIcon-C15yI_6j.js": { + "file": "assets/ShareIcon-C15yI_6j.js", "name": "ShareIcon", "imports": [ "resources/js/app.js" ] }, - "_ShowProjectDates-DEyhF2bt.js": { - "file": "assets/ShowProjectDates-DEyhF2bt.js", + "_ShowProjectDates-3AAxCRab.js": { + "file": "assets/ShowProjectDates-3AAxCRab.js", "name": "ShowProjectDates", "imports": [ "resources/js/app.js", - "_CalendarDaysIcon-bzmmtrVA.js" + "_CalendarDaysIcon-CP-Ljnby.js" ] }, - "_SpectraViewer-DAiohBoS.js": { - "file": "assets/SpectraViewer-DAiohBoS.js", + "_SpectraViewer-BuWGpYyg.js": { + "file": "assets/SpectraViewer-BuWGpYyg.js", "name": "SpectraViewer", "imports": [ "resources/js/app.js" ] }, - "_StarIcon-BYJ8kyod.js": { - "file": "assets/StarIcon-BYJ8kyod.js", + "_StarIcon-DS6sLGXG.js": { + "file": "assets/StarIcon-DS6sLGXG.js", "name": "StarIcon", "imports": [ "resources/js/app.js" ] }, - "_StructureSearch-BAHFDTET.js": { - "file": "assets/StructureSearch-BAHFDTET.js", + "_StructureSearch-XaD5e5AF.js": { + "file": "assets/StructureSearch-XaD5e5AF.js", "name": "StructureSearch", "imports": [ "resources/js/app.js", - "_ToolTip-B-BuMZla.js", - "_transition-K5DyIAHH.js" + "_ToolTip-CctsjpN9.js", + "_transition-N3Y6B5xr.js" ] }, - "_StudyCard-CZirq0ik.js": { - "file": "assets/StudyCard-CZirq0ik.js", + "_StudyCard-CCYIGRAd.js": { + "file": "assets/StudyCard-CCYIGRAd.js", "name": "StudyCard", "imports": [ "resources/js/app.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js" + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js" ] }, - "_StudyCardPublic-03l-9aGV.js": { - "file": "assets/StudyCardPublic-03l-9aGV.js", + "_StudyCardPublic-GT9WWlwu.js": { + "file": "assets/StudyCardPublic-GT9WWlwu.js", "name": "StudyCardPublic", "imports": [ "resources/js/app.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js" + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js" ] }, - "_SuccessButton-CQHcc1CH.js": { - "file": "assets/SuccessButton-CQHcc1CH.js", + "_SuccessButton-DgtR4LP4.js": { + "file": "assets/SuccessButton-DgtR4LP4.js", "name": "SuccessButton", "imports": [ "resources/js/app.js" ] }, - "_Tag-DRPRU5B7.js": { - "file": "assets/Tag-DRPRU5B7.js", + "_Tag-C07nHEfs.js": { + "file": "assets/Tag-C07nHEfs.js", "name": "Tag", "imports": [ "resources/js/app.js" ] }, - "_ToggleButton-C0L2QH2i.js": { - "file": "assets/ToggleButton-C0L2QH2i.js", + "_ToggleButton-BfMegX4R.js": { + "file": "assets/ToggleButton-BfMegX4R.js", "name": "ToggleButton", "imports": [ "resources/js/app.js", - "_switch-DyCbjYu6.js" + "_switch-BiZWBQc9.js" ] }, - "_ToolTip-B-BuMZla.js": { - "file": "assets/ToolTip-B-BuMZla.js", + "_ToolTip-CctsjpN9.js": { + "file": "assets/ToolTip-CctsjpN9.js", "name": "ToolTip", "imports": [ "resources/js/app.js", - "_use-outside-click-UcI2wRsE.js", - "_use-text-value-BpD-bIcx.js" + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js" + ], + "dynamicImports": [ + "resources/js/app.js" ] }, - "_ValidationErrors-Cs3aqeYy.js": { - "file": "assets/ValidationErrors-Cs3aqeYy.js", + "_ValidationErrors-C16clRUe.js": { + "file": "assets/ValidationErrors-C16clRUe.js", "name": "ValidationErrors", "imports": [ "resources/js/app.js" ] }, - "_XMarkIcon-BrZ2BUzq.js": { - "file": "assets/XMarkIcon-BrZ2BUzq.js", + "_XMarkIcon-BcXHAYXa.js": { + "file": "assets/XMarkIcon-BcXHAYXa.js", "name": "XMarkIcon", "imports": [ "resources/js/app.js" ] }, - "_description-D4q-ya34.js": { - "file": "assets/description-D4q-ya34.js", + "_description-Cz3O-WWk.js": { + "file": "assets/description-Cz3O-WWk.js", "name": "description", "imports": [ "resources/js/app.js" ] }, - "_form-Cn9CuD1E.js": { - "file": "assets/form-Cn9CuD1E.js", + "_form-BpOT_RbF.js": { + "file": "assets/form-BpOT_RbF.js", "name": "form", "imports": [ "resources/js/app.js" ] }, - "_hidden-2_Kmyvd6.js": { - "file": "assets/hidden-2_Kmyvd6.js", + "_hidden-F-jzL4rc.js": { + "file": "assets/hidden-F-jzL4rc.js", "name": "hidden", "imports": [ "resources/js/app.js" ] }, - "_index-CwURvEqp.js": { - "file": "assets/index-CwURvEqp.js", + "_index-Ar_5PsMF.js": { + "file": "assets/index-Ar_5PsMF.js", "name": "index", "imports": [ "resources/js/app.js" ] }, - "_main-CITaNMI7.css": { - "file": "assets/main-CITaNMI7.css", - "src": "_main-CITaNMI7.css" - }, - "_main-DPI-_6Az.js": { - "file": "assets/main-DPI-_6Az.js", + "_main-BJ-Gsz84.js": { + "file": "assets/main-BJ-Gsz84.js", "name": "main", "imports": [ "resources/js/app.js" @@ -493,28 +530,46 @@ "assets/main-CITaNMI7.css" ] }, + "_main-CITaNMI7.css": { + "file": "assets/main-CITaNMI7.css", + "src": "_main-CITaNMI7.css" + }, "_micro-task-CxIZtCgj.js": { "file": "assets/micro-task-CxIZtCgj.js", "name": "micro-task" }, - "_pickBy-lvn3s5H6.js": { - "file": "assets/pickBy-lvn3s5H6.js", + "_pickBy-_onoeMUk.js": { + "file": "assets/pickBy-_onoeMUk.js", "name": "pickBy", "imports": [ "resources/js/app.js" ] }, - "_portal-viea1unE.js": { - "file": "assets/portal-viea1unE.js", + "_popover-dJHrdIKh.js": { + "file": "assets/popover-dJHrdIKh.js", + "name": "popover", + "imports": [ + "_portal-BTMSE_oA.js", + "resources/js/app.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js" + ] + }, + "_portal-BTMSE_oA.js": { + "file": "assets/portal-BTMSE_oA.js", "name": "portal", "imports": [ - "_use-outside-click-UcI2wRsE.js", + "_use-outside-click-DAnsQAYx.js", "resources/js/app.js", - "_hidden-2_Kmyvd6.js" + "_hidden-F-jzL4rc.js" ] }, - "_style-2QlRVEvL.js": { - "file": "assets/style-2QlRVEvL.js", + "_style-D0KUwiFO.css": { + "file": "assets/style-D0KUwiFO.css", + "src": "_style-D0KUwiFO.css" + }, + "_style-fRfHuoRD.js": { + "file": "assets/style-fRfHuoRD.js", "name": "style", "imports": [ "resources/js/app.js" @@ -523,2038 +578,2306 @@ "assets/style-D0KUwiFO.css" ] }, - "_style-D0KUwiFO.css": { - "file": "assets/style-D0KUwiFO.css", - "src": "_style-D0KUwiFO.css" - }, - "_switch-DyCbjYu6.js": { - "file": "assets/switch-DyCbjYu6.js", + "_switch-BiZWBQc9.js": { + "file": "assets/switch-BiZWBQc9.js", "name": "switch", "imports": [ - "_form-Cn9CuD1E.js", + "_form-BpOT_RbF.js", "resources/js/app.js", - "_hidden-2_Kmyvd6.js", - "_description-D4q-ya34.js" + "_hidden-F-jzL4rc.js", + "_description-Cz3O-WWk.js" ] }, - "_transition-K5DyIAHH.js": { - "file": "assets/transition-K5DyIAHH.js", + "_transition-N3Y6B5xr.js": { + "file": "assets/transition-N3Y6B5xr.js", "name": "transition", "imports": [ - "_portal-viea1unE.js", - "_hidden-2_Kmyvd6.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "resources/js/app.js", - "_use-outside-click-UcI2wRsE.js", + "_use-outside-click-DAnsQAYx.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js" + "_description-Cz3O-WWk.js" ] }, - "_use-outside-click-UcI2wRsE.js": { - "file": "assets/use-outside-click-UcI2wRsE.js", + "_use-outside-click-DAnsQAYx.js": { + "file": "assets/use-outside-click-DAnsQAYx.js", "name": "use-outside-click", "imports": [ "resources/js/app.js" ] }, - "_use-text-value-BpD-bIcx.js": { - "file": "assets/use-text-value-BpD-bIcx.js", + "_use-text-value-DP7g6SXN.js": { + "file": "assets/use-text-value-DP7g6SXN.js", "name": "use-text-value", "imports": [ "resources/js/app.js" ] }, - "_vue-tags-input-BGwEuaGX.js": { - "file": "assets/vue-tags-input-BGwEuaGX.js", + "_vue-tags-input-DbsHG6CC.js": { + "file": "assets/vue-tags-input-DbsHG6CC.js", "name": "vue-tags-input", "imports": [ "resources/js/app.js" ] }, + "resources/css/app.css": { + "file": "assets/app-Bx1gscc4.css", + "src": "resources/css/app.css", + "isEntry": true + }, "resources/js/Pages/API/Index.vue": { - "file": "assets/Index-wDDwTVt7.js", + "file": "assets/Index-CUpYcJVn.js", "name": "Index", "src": "resources/js/Pages/API/Index.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/API/Partials/ApiTokenManager.vue", - "_AppLayout-shqwEEI1.js", - "resources/js/app.js", - "_ActionMessage-uxM-o-da.js", - "_ActionSection-DoJrofwP.js", - "_SectionTitle-rK4YId1t.js", - "_Button-Do-BJmWY.js", - "_ConfirmationModal-BqBcQKy5.js", - "_Modal-D-_sV66W.js", - "_DangerButton-DhWljAF_.js", - "_DialogModal-CmZ6e9E-.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_Checkbox-CmyOWzuc.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", - "_SecondaryButton-BucXplhe.js", - "_SectionBorder-Dz4Jb6r4.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "resources/js/app.js", + "_ActionMessage-D3hDlqs6.js", + "_ActionSection-DGSZ5cOQ.js", + "_SectionTitle-wvDa7nYi.js", + "_Button-D-DNlnje.js", + "_ConfirmationModal-CINCDmZJ.js", + "_Modal-D64jrvfn.js", + "_DangerButton-BGA6_FlM.js", + "_DialogModal-kRhYIaZg.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_Checkbox-t6wmhQJV.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", + "_SecondaryButton-DqadZgr8.js", + "_SectionBorder-mpmjkaR3.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js" + "_vue-tags-input-DbsHG6CC.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/API/Partials/ApiTokenManager.vue": { - "file": "assets/ApiTokenManager-CrMpqUch.js", + "file": "assets/ApiTokenManager-BicYkesn.js", "name": "ApiTokenManager", "src": "resources/js/Pages/API/Partials/ApiTokenManager.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-uxM-o-da.js", - "_ActionSection-DoJrofwP.js", - "_Button-Do-BJmWY.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_DialogModal-CmZ6e9E-.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_Checkbox-CmyOWzuc.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", - "_SecondaryButton-BucXplhe.js", - "_SectionBorder-Dz4Jb6r4.js", - "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_ActionMessage-D3hDlqs6.js", + "_ActionSection-DGSZ5cOQ.js", + "_Button-D-DNlnje.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_DialogModal-kRhYIaZg.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_Checkbox-t6wmhQJV.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", + "_SecondaryButton-DqadZgr8.js", + "_SectionBorder-mpmjkaR3.js", + "resources/js/app.js", + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/About.vue": { - "file": "assets/About-DsSjYaOL.js", + "file": "assets/About-JThrM_vF.js", "name": "About", "src": "resources/js/Pages/About.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_FlashMessages-H7Dz0t6O.js", - "_MagnifyingGlassIcon-Cq7Ou0Fo.js", - "_XMarkIcon-BrZ2BUzq.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js" + "_ApplicationLogo-DTY9oAac.js", + "_FlashMessages-B9FLcdP2.js", + "_Footer-nhWzX88G.js", + "_popover-dJHrdIKh.js", + "_XMarkIcon-BcXHAYXa.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_InboxIcon-6kSjCYig.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js" + ], + "css": [ + "assets/About-B_ycmUNx.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Announcement/Index.vue": { - "file": "assets/Index-BZzqK1VE.js", + "file": "assets/Index-CczgqNrN.js", "name": "Index", "src": "resources/js/Pages/Announcement/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_BreadCrumbs-Db7NAUm-.js", - "_Icon-qHt8_t4q.js", + "_AppLayout-Dor7lhho.js", + "_BreadCrumbs-DS-h1Jwn.js", + "_Icon-CoGNbYth.js", "resources/js/Pages/Announcement/Partials/Create.vue", "resources/js/Pages/Announcement/Partials/Edit.vue", - "_DangerButton-DhWljAF_.js", - "_SecondaryButton-BucXplhe.js", - "_DialogModal-CmZ6e9E-.js", - "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_DangerButton-BGA6_FlM.js", + "_SecondaryButton-DqadZgr8.js", + "_DialogModal-kRhYIaZg.js", + "resources/js/app.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_Modal-D-_sV66W.js", - "_ToggleButton-C0L2QH2i.js", - "_main-DPI-_6Az.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_Modal-D64jrvfn.js", + "_ToggleButton-BfMegX4R.js", + "_main-BJ-Gsz84.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Announcement/Partials/Create.vue": { - "file": "assets/Create-Dxec--Kk.js", + "file": "assets/Create-BUdfM5Rl.js", "name": "Create", "src": "resources/js/Pages/Announcement/Partials/Create.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-CmZ6e9E-.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_ToggleButton-C0L2QH2i.js", - "_main-DPI-_6Az.js", + "_DialogModal-kRhYIaZg.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_ToggleButton-BfMegX4R.js", + "_main-BJ-Gsz84.js", "resources/js/app.js", - "_Modal-D-_sV66W.js", - "_switch-DyCbjYu6.js", - "_form-Cn9CuD1E.js", - "_hidden-2_Kmyvd6.js", - "_description-D4q-ya34.js" + "_Modal-D64jrvfn.js", + "_switch-BiZWBQc9.js", + "_form-BpOT_RbF.js", + "_hidden-F-jzL4rc.js", + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Announcement/Partials/Edit.vue": { - "file": "assets/Edit-Dr7xby21.js", + "file": "assets/Edit-CJlJx85Z.js", "name": "Edit", "src": "resources/js/Pages/Announcement/Partials/Edit.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-CmZ6e9E-.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_ToggleButton-C0L2QH2i.js", - "_main-DPI-_6Az.js", + "_DialogModal-kRhYIaZg.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_ToggleButton-BfMegX4R.js", + "_main-BJ-Gsz84.js", "resources/js/app.js", - "_Modal-D-_sV66W.js", - "_switch-DyCbjYu6.js", - "_form-Cn9CuD1E.js", - "_hidden-2_Kmyvd6.js", - "_description-D4q-ya34.js" + "_Modal-D64jrvfn.js", + "_switch-BiZWBQc9.js", + "_form-BpOT_RbF.js", + "_hidden-F-jzL4rc.js", + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/ConfirmPassword.vue": { - "file": "assets/ConfirmPassword-C3_l58cZ.js", + "file": "assets/ConfirmPassword--K3i2Txb.js", "name": "ConfirmPassword", "src": "resources/js/Pages/Auth/ConfirmPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ValidationErrors-Cs3aqeYy.js", - "_ApplicationLogo-Byie6Ini.js" + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ValidationErrors-C16clRUe.js", + "_ApplicationLogo-DTY9oAac.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/ForgotPassword.vue": { - "file": "assets/ForgotPassword-BesprtPD.js", + "file": "assets/ForgotPassword-8Ypi9tQg.js", "name": "ForgotPassword", "src": "resources/js/Pages/Auth/ForgotPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ValidationErrors-Cs3aqeYy.js", - "_ApplicationLogo-Byie6Ini.js" + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ValidationErrors-C16clRUe.js", + "_ApplicationLogo-DTY9oAac.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/Login.vue": { - "file": "assets/Login-C3yEUbjr.js", + "file": "assets/Login-waPAsEQz.js", "name": "Login", "src": "resources/js/Pages/Auth/Login.vue", "isDynamicEntry": true, "imports": [ - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_Checkbox-CmyOWzuc.js", - "_Label-DGyfHV0z.js", - "_ValidationErrors-Cs3aqeYy.js", + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_Checkbox-t6wmhQJV.js", + "_Label-MQuMO0BF.js", + "_ValidationErrors-C16clRUe.js", "resources/js/app.js", - "_AnnouncementBanner-B_CIbGMm.js", - "_ApplicationLogo-Byie6Ini.js", - "_XMarkIcon-BrZ2BUzq.js" + "_AnnouncementBanner-Bi5ktTFR.js", + "_ApplicationLogo-DTY9oAac.js", + "_XMarkIcon-BcXHAYXa.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/Register.vue": { - "file": "assets/Register-DtrO_O1N.js", + "file": "assets/Register-DsENARSm.js", "name": "Register", "src": "resources/js/Pages/Auth/Register.vue", "isDynamicEntry": true, "imports": [ - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_Checkbox-CmyOWzuc.js", - "_Label-DGyfHV0z.js", - "_ValidationErrors-Cs3aqeYy.js", - "resources/js/app.js", - "_AnnouncementBanner-B_CIbGMm.js", - "_InputError-EInikEKW.js", - "_SelectOrcidId-D9IuGi3f.js", - "_ApplicationLogo-Byie6Ini.js", - "_XMarkIcon-BrZ2BUzq.js", - "_SecondaryButton-BucXplhe.js", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_LoadingButton-DQ530rQU.js" + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_Checkbox-t6wmhQJV.js", + "_Label-MQuMO0BF.js", + "_ValidationErrors-C16clRUe.js", + "resources/js/app.js", + "_AnnouncementBanner-Bi5ktTFR.js", + "_InputError-CfIESodf.js", + "_SelectOrcidId-DBsdB99F.js", + "_RorAffiliationTypeahead-DYrNK_fV.js", + "_ApplicationLogo-DTY9oAac.js", + "_XMarkIcon-BcXHAYXa.js", + "_SecondaryButton-DqadZgr8.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_LoadingButton-B68Xuzxz.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/ResetPassword.vue": { - "file": "assets/ResetPassword--TjZNsBn.js", + "file": "assets/ResetPassword-709SnFL_.js", "name": "ResetPassword", "src": "resources/js/Pages/Auth/ResetPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ValidationErrors-Cs3aqeYy.js", - "_ApplicationLogo-Byie6Ini.js" + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ValidationErrors-C16clRUe.js", + "_ApplicationLogo-DTY9oAac.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/SetPassword.vue": { - "file": "assets/SetPassword-Dw4CoBJs.js", + "file": "assets/SetPassword-pUJwCYKJ.js", "name": "SetPassword", "src": "resources/js/Pages/Auth/SetPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ValidationErrors-Cs3aqeYy.js", - "_ApplicationLogo-Byie6Ini.js" + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ValidationErrors-C16clRUe.js", + "_ApplicationLogo-DTY9oAac.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/TwoFactorChallenge.vue": { - "file": "assets/TwoFactorChallenge-ua3B007q.js", + "file": "assets/TwoFactorChallenge-D3kJH12c.js", "name": "TwoFactorChallenge", "src": "resources/js/Pages/Auth/TwoFactorChallenge.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ValidationErrors-Cs3aqeYy.js", - "_ApplicationLogo-Byie6Ini.js" + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ValidationErrors-C16clRUe.js", + "_ApplicationLogo-DTY9oAac.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Auth/VerifyEmail.vue": { - "file": "assets/VerifyEmail-Dy2xDSk0.js", + "file": "assets/VerifyEmail-BS-6PLLm.js", "name": "VerifyEmail", "src": "resources/js/Pages/Auth/VerifyEmail.vue", "isDynamicEntry": true, "imports": [ - "_AuthenticationCard-qrykQH--.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_Button-Do-BJmWY.js", + "_AuthenticationCardLogo-MJTb4TXc.js", + "_Button-D-DNlnje.js", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js" + "_ApplicationLogo-DTY9oAac.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Index.vue": { - "file": "assets/Index-DNqCPZuu.js", + "file": "assets/Index-uMeYPMtw.js", "name": "Index", "src": "resources/js/Pages/Console/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", - "_Icon-qHt8_t4q.js", - "_ToolTip-B-BuMZla.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_Icon-CoGNbYth.js", + "_ToolTip-CctsjpN9.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_MagnifyingGlassIcon-B7G_6YVF.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Spectra/Index.vue": { - "file": "assets/Index-xVZ32gep.js", + "file": "assets/Index-DdncA8DV.js", "name": "Index", "src": "resources/js/Pages/Console/Spectra/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_BreadCrumbs-Db7NAUm-.js", + "_AppLayout-Dor7lhho.js", + "_BreadCrumbs-DS-h1Jwn.js", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Spectra/Snapshot.vue": { - "file": "assets/Snapshot-PNdJOEoO.js", + "file": "assets/Snapshot-BM7iq12H.js", "name": "Snapshot", "src": "resources/js/Pages/Console/Spectra/Snapshot.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_BreadCrumbs-Db7NAUm-.js", + "_AppLayout-Dor7lhho.js", + "_BreadCrumbs-DS-h1Jwn.js", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Users/Create.vue": { - "file": "assets/Create-BnHnkykD.js", + "file": "assets/Create-2Glu_psO.js", "name": "Create", "src": "resources/js/Pages/Console/Users/Create.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_BreadCrumbs-Db7NAUm-.js", + "_AppLayout-Dor7lhho.js", + "_BreadCrumbs-DS-h1Jwn.js", "resources/js/Pages/Console/Users/Partials/UserProfile.vue", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_FormSection-D_YXuO3u.js", - "_SectionTitle-rK4YId1t.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ActionMessage-uxM-o-da.js", - "_SelectOrcidId-D9IuGi3f.js", - "_LoadingButton-DQ530rQU.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_FormSection-CGKXQW1v.js", + "_SectionTitle-wvDa7nYi.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ActionMessage-D3hDlqs6.js", + "_SelectOrcidId-DBsdB99F.js", + "_LoadingButton-B68Xuzxz.js", + "_RorAffiliationTypeahead-DYrNK_fV.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Users/Edit.vue": { - "file": "assets/Edit-C6WGund9.js", + "file": "assets/Edit-DfWkxXVj.js", "name": "Edit", "src": "resources/js/Pages/Console/Users/Edit.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_BreadCrumbs-Db7NAUm-.js", + "_AppLayout-Dor7lhho.js", + "_BreadCrumbs-DS-h1Jwn.js", "resources/js/Pages/Console/Users/Partials/UserProfile.vue", "resources/js/Pages/Console/Users/Partials/UserPassword.vue", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_FormSection-D_YXuO3u.js", - "_SectionTitle-rK4YId1t.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ActionMessage-uxM-o-da.js", - "_SelectOrcidId-D9IuGi3f.js", - "_LoadingButton-DQ530rQU.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_FormSection-CGKXQW1v.js", + "_SectionTitle-wvDa7nYi.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ActionMessage-D3hDlqs6.js", + "_SelectOrcidId-DBsdB99F.js", + "_LoadingButton-B68Xuzxz.js", + "_RorAffiliationTypeahead-DYrNK_fV.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Users/Index.vue": { - "file": "assets/Index-Chvea0vj.js", + "file": "assets/Index-DN-XOeAk.js", "name": "Index", "src": "resources/js/Pages/Console/Users/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_pickBy-lvn3s5H6.js", - "resources/js/app.js", - "_DialogModal-CmZ6e9E-.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_BreadCrumbs-Db7NAUm-.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "_pickBy-_onoeMUk.js", + "resources/js/app.js", + "_DialogModal-kRhYIaZg.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_BreadCrumbs-DS-h1Jwn.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_Modal-D-_sV66W.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_Modal-D64jrvfn.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Users/Partials/UserPassword.vue": { - "file": "assets/UserPassword-CGZAv6P5.js", + "file": "assets/UserPassword-GNA-fJ_Y.js", "name": "UserPassword", "src": "resources/js/Pages/Console/Users/Partials/UserPassword.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-uxM-o-da.js", - "_Button-Do-BJmWY.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", + "_ActionMessage-D3hDlqs6.js", + "_Button-D-DNlnje.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js" + "_SectionTitle-wvDa7nYi.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Console/Users/Partials/UserProfile.vue": { - "file": "assets/UserProfile-3N4JikwH.js", + "file": "assets/UserProfile-OR7iaF_R.js", "name": "UserProfile", "src": "resources/js/Pages/Console/Users/Partials/UserProfile.vue", "isDynamicEntry": true, "imports": [ - "_Button-Do-BJmWY.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", - "_ActionMessage-uxM-o-da.js", - "_SecondaryButton-BucXplhe.js", - "_SelectOrcidId-D9IuGi3f.js", - "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_LoadingButton-DQ530rQU.js" + "_Button-D-DNlnje.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", + "_ActionMessage-D3hDlqs6.js", + "_SecondaryButton-DqadZgr8.js", + "_SelectOrcidId-DBsdB99F.js", + "_RorAffiliationTypeahead-DYrNK_fV.js", + "resources/js/app.js", + "_SectionTitle-wvDa7nYi.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_LoadingButton-B68Xuzxz.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Dashboard.vue": { - "file": "assets/Dashboard-CLVWDe8B.js", + "file": "assets/Dashboard-DP8hg-o9.js", "name": "Dashboard", "src": "resources/js/Pages/Dashboard.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Project/Index.vue", - "_StudyCard-CZirq0ik.js", - "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_ToolTip-B-BuMZla.js", - "_use-outside-click-UcI2wRsE.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_hidden-2_Kmyvd6.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_StudyCard-CCYIGRAd.js", + "resources/js/app.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_EmptySearchState-o9-rntAO.js", + "_ToolTip-CctsjpN9.js", + "_form-BpOT_RbF.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_hidden-F-jzL4rc.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", "_micro-task-CxIZtCgj.js", - "_switch-DyCbjYu6.js", - "_description-D4q-ya34.js", + "_switch-BiZWBQc9.js", + "_description-Cz3O-WWk.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_ShowProjectDates-DEyhF2bt.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_StarIcon-BYJ8kyod.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js", - "_portal-viea1unE.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_ShowProjectDates-3AAxCRab.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_StarIcon-DS6sLGXG.js", + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js", + "_portal-BTMSE_oA.js", + "_MagnifyingGlassIcon-B7G_6YVF.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" + ] + }, + "resources/js/Pages/Predict.vue": { + "file": "assets/Predict-xY0lNull.js", + "name": "Predict", + "src": "resources/js/Pages/Predict.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_ApplicationLogo-DTY9oAac.js", + "_FlashMessages-B9FLcdP2.js", + "_Footer-nhWzX88G.js", + "_XMarkIcon-BcXHAYXa.js", + "_popover-dJHrdIKh.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/PrivacyPolicy.vue": { - "file": "assets/PrivacyPolicy-CAMk5yhX.js", + "file": "assets/PrivacyPolicy-B-LPDwuM.js", "name": "PrivacyPolicy", "src": "resources/js/Pages/PrivacyPolicy.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_ApplicationLogo-Byie6Ini.js" + "_ApplicationLogo-DTY9oAac.js", + "_Footer-nhWzX88G.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Profile/Partials/DeleteUserForm.vue": { - "file": "assets/DeleteUserForm-c8u_GeKx.js", + "file": "assets/DeleteUserForm-C_z-ivNS.js", "name": "DeleteUserForm", "src": "resources/js/Pages/Profile/Partials/DeleteUserForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_DialogModal-CmZ6e9E-.js", - "_DangerButton-DhWljAF_.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", + "_ActionSection-DGSZ5cOQ.js", + "_DialogModal-kRhYIaZg.js", + "_DangerButton-BGA6_FlM.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue": { - "file": "assets/LogoutOtherBrowserSessionsForm-CgVEg4qL.js", + "file": "assets/LogoutOtherBrowserSessionsForm-DDlN72rz.js", "name": "LogoutOtherBrowserSessionsForm", "src": "resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-uxM-o-da.js", - "_ActionSection-DoJrofwP.js", - "_Button-Do-BJmWY.js", - "_DialogModal-CmZ6e9E-.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", + "_ActionMessage-D3hDlqs6.js", + "_ActionSection-DGSZ5cOQ.js", + "_Button-D-DNlnje.js", + "_DialogModal-kRhYIaZg.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue": { - "file": "assets/TwoFactorAuthenticationForm-Be_MxRp_.js", + "file": "assets/TwoFactorAuthenticationForm-BJsng1tc.js", "name": "TwoFactorAuthenticationForm", "src": "resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_Button-Do-BJmWY.js", - "_DialogModal-CmZ6e9E-.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", + "_ActionSection-DGSZ5cOQ.js", + "_Button-D-DNlnje.js", + "_DialogModal-kRhYIaZg.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", "resources/js/app.js", - "_DangerButton-DhWljAF_.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_DangerButton-BGA6_FlM.js", + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue": { - "file": "assets/UpdatePasswordForm-D8gDPMFW.js", + "file": "assets/UpdatePasswordForm-DbX6bLc2.js", "name": "UpdatePasswordForm", "src": "resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-uxM-o-da.js", - "_Button-Do-BJmWY.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", + "_ActionMessage-D3hDlqs6.js", + "_Button-D-DNlnje.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js" + "_SectionTitle-wvDa7nYi.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue": { - "file": "assets/UpdateProfileInformationForm-BdjXeRia.js", + "file": "assets/UpdateProfileInformationForm-Df1P5bv-.js", "name": "UpdateProfileInformationForm", "src": "resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue", "isDynamicEntry": true, "imports": [ - "_Button-Do-BJmWY.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", - "_ActionMessage-uxM-o-da.js", - "_SecondaryButton-BucXplhe.js", - "_SelectOrcidId-D9IuGi3f.js", - "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_LoadingButton-DQ530rQU.js" + "_Button-D-DNlnje.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", + "_ActionMessage-D3hDlqs6.js", + "_SecondaryButton-DqadZgr8.js", + "_SelectOrcidId-DBsdB99F.js", + "_RorAffiliationTypeahead-DYrNK_fV.js", + "resources/js/app.js", + "_SectionTitle-wvDa7nYi.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_LoadingButton-B68Xuzxz.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Profile/Show.vue": { - "file": "assets/Show-CzQxFZ0r.js", + "file": "assets/Show-iIAtvk25.js", "name": "Show", "src": "resources/js/Pages/Profile/Show.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Profile/Partials/DeleteUserForm.vue", - "_SectionBorder-Dz4Jb6r4.js", + "_SectionBorder-mpmjkaR3.js", "resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue", "resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue", "resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue", "resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_ActionSection-DoJrofwP.js", - "_SectionTitle-rK4YId1t.js", - "_Input-B-ZTzbzW.js", - "_ActionMessage-uxM-o-da.js", - "_FormSection-D_YXuO3u.js", - "_Label-DGyfHV0z.js", - "_SelectOrcidId-D9IuGi3f.js", - "_LoadingButton-DQ530rQU.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_ActionSection-DGSZ5cOQ.js", + "_SectionTitle-wvDa7nYi.js", + "_Input-BlZBuXvW.js", + "_ActionMessage-D3hDlqs6.js", + "_FormSection-CGKXQW1v.js", + "_Label-MQuMO0BF.js", + "_SelectOrcidId-DBsdB99F.js", + "_LoadingButton-B68Xuzxz.js", + "_RorAffiliationTypeahead-DYrNK_fV.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Index.vue": { - "file": "assets/Index-BANH-5Nf.js", + "file": "assets/Index-CjlId_FW.js", "name": "Index", "src": "resources/js/Pages/Project/Index.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_Tag-DRPRU5B7.js", - "_ShowProjectDates-DEyhF2bt.js", - "_StarIcon-BYJ8kyod.js", - "_CalendarDaysIcon-bzmmtrVA.js" + "_Tag-C07nHEfs.js", + "_ShowProjectDates-3AAxCRab.js", + "_StarIcon-DS6sLGXG.js", + "_CalendarDaysIcon-CP-Ljnby.js" + ], + "css": [ + "assets/Index-tn0RQdqM.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Partials/Activity.vue": { - "file": "assets/Activity-HsIibMtO.js", + "file": "assets/Activity-vdKo5ySL.js", "name": "Activity", "src": "resources/js/Pages/Project/Partials/Activity.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_XMarkIcon-BrZ2BUzq.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_XMarkIcon-BcXHAYXa.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js" + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Partials/Archive.vue": { - "file": "assets/Archive-2S7froJ9.js", + "file": "assets/Archive-0DglpBHn.js", "name": "Archive", "src": "resources/js/Pages/Project/Partials/Archive.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_DialogModal-CmZ6e9E-.js", - "_DangerButton-DhWljAF_.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", - "_LoadingButton-DQ530rQU.js", + "_ActionSection-DGSZ5cOQ.js", + "_DialogModal-kRhYIaZg.js", + "_DangerButton-BGA6_FlM.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", + "_LoadingButton-B68Xuzxz.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Partials/Create.vue": { - "file": "assets/Create-uBrHqsep.js", + "file": "assets/Create-Ds-CjTPb.js", "name": "Create", "src": "resources/js/Pages/Project/Partials/Create.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-CmZ6e9E-.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", + "_DialogModal-kRhYIaZg.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", "resources/js/app.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", - "_Modal-D-_sV66W.js", - "_hidden-2_Kmyvd6.js", - "_use-outside-click-UcI2wRsE.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", + "_Modal-D64jrvfn.js", + "_hidden-F-jzL4rc.js", + "_use-outside-click-DAnsQAYx.js", "_micro-task-CxIZtCgj.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_description-D4q-ya34.js" + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Partials/Delete.vue": { - "file": "assets/Delete-CBncv3vl.js", + "file": "assets/Delete-BgKPCVQC.js", "name": "Delete", "src": "resources/js/Pages/Project/Partials/Delete.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_DialogModal-CmZ6e9E-.js", - "_DangerButton-DhWljAF_.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", - "_LoadingButton-DQ530rQU.js", + "_ActionSection-DGSZ5cOQ.js", + "_DialogModal-kRhYIaZg.js", + "_DangerButton-BGA6_FlM.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", + "_LoadingButton-B68Xuzxz.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Partials/Details.vue": { - "file": "assets/Details-D72sP5nr.js", + "file": "assets/Details-DD5w_QT_.js", "name": "Details", "src": "resources/js/Pages/Project/Partials/Details.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/app.js", - "_InputError-EInikEKW.js", + "_InputError-CfIESodf.js", "resources/js/Pages/Project/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_SecondaryButton-BucXplhe.js", - "_SelectRich-Bh8aQhO2.js", - "_Button-Do-BJmWY.js", - "_vue-tags-input-BGwEuaGX.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_XMarkIcon-BrZ2BUzq.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_style-fRfHuoRD.js", + "_SecondaryButton-DqadZgr8.js", + "_SelectRich-CJpqbOjy.js", + "_Button-D-DNlnje.js", + "_vue-tags-input-DbsHG6CC.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_XMarkIcon-BcXHAYXa.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js" + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Partials/Restore.vue": { - "file": "assets/Restore-9yIb-R9t.js", + "file": "assets/Restore-B5y0A3U9.js", "name": "Restore", "src": "resources/js/Pages/Project/Partials/Restore.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_DialogModal-CmZ6e9E-.js", - "_SuccessButton-CQHcc1CH.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", - "_LoadingButton-DQ530rQU.js", + "_ActionSection-DGSZ5cOQ.js", + "_DialogModal-kRhYIaZg.js", + "_SuccessButton-DgtR4LP4.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", + "_LoadingButton-B68Xuzxz.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Partials/Unarchive.vue": { - "file": "assets/Unarchive-CGt_XB2P.js", + "file": "assets/Unarchive-BHEjeqlC.js", "name": "Unarchive", "src": "resources/js/Pages/Project/Partials/Unarchive.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_DialogModal-CmZ6e9E-.js", - "_DangerButton-DhWljAF_.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", - "_LoadingButton-DQ530rQU.js", + "_ActionSection-DGSZ5cOQ.js", + "_DialogModal-kRhYIaZg.js", + "_DangerButton-BGA6_FlM.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", + "_LoadingButton-B68Xuzxz.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Settings.vue": { - "file": "assets/Settings-PrYT47Rc.js", + "file": "assets/Settings-agoO894c.js", "name": "Settings", "src": "resources/js/Pages/Project/Settings.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", "resources/js/Pages/Project/Partials/Delete.vue", "resources/js/Pages/Project/Partials/Restore.vue", "resources/js/Pages/Project/Partials/Archive.vue", "resources/js/Pages/Project/Partials/Unarchive.vue", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_ActionSection-DoJrofwP.js", - "_SectionTitle-rK4YId1t.js", - "_Input-B-ZTzbzW.js", - "_LoadingButton-DQ530rQU.js", - "_SuccessButton-CQHcc1CH.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_ActionSection-DGSZ5cOQ.js", + "_SectionTitle-wvDa7nYi.js", + "_Input-BlZBuXvW.js", + "_LoadingButton-B68Xuzxz.js", + "_SuccessButton-DgtR4LP4.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Show.vue": { - "file": "assets/Show-CpO7pd3h.js", + "file": "assets/Show-C7TXtbOa.js", "name": "Show", "src": "resources/js/Pages/Project/Show.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_AccessDialogue-DaBf4ai0.js", + "_AppLayout-Dor7lhho.js", + "_AccessDialogue-Cateni1h.js", "resources/js/app.js", "resources/js/Pages/Study/Index.vue", "resources/js/Pages/Project/Partials/Details.vue", - "_ManageCitation-A3-Z6aBb.js", - "_ToolTip-B-BuMZla.js", - "_Citation-Dj91Ydnp.js", - "_CitationCard-mr9Srs1M.js", - "_DOIBadge-BBho5C2T.js", - "_Tag-DRPRU5B7.js", - "_main-DPI-_6Az.js", - "_ConfirmationModal-BqBcQKy5.js", - "_SecondaryButton-BucXplhe.js", - "_SuccessButton-CQHcc1CH.js", - "_ShowProjectDates-DEyhF2bt.js", - "_StarIcon-BYJ8kyod.js", - "_transition-K5DyIAHH.js", - "_ApplicationLogo-Byie6Ini.js", - "_form-Cn9CuD1E.js", - "_use-outside-click-UcI2wRsE.js", - "_use-text-value-BpD-bIcx.js", - "_hidden-2_Kmyvd6.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_ManageCitation-BZxJ4fLR.js", + "_ToolTip-CctsjpN9.js", + "_Citation-BBqsTw0Q.js", + "_AuthorCard-D18guzLA.js", + "_CitationCard-D-wfjUVo.js", + "_DOIBadge-BQ7FAuLx.js", + "_Tag-C07nHEfs.js", + "_main-BJ-Gsz84.js", + "_ConfirmationModal-CINCDmZJ.js", + "_SecondaryButton-DqadZgr8.js", + "_SuccessButton-DgtR4LP4.js", + "_ShowProjectDates-3AAxCRab.js", + "_StarIcon-DS6sLGXG.js", + "_transition-N3Y6B5xr.js", + "_ApplicationLogo-DTY9oAac.js", + "_form-BpOT_RbF.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_hidden-F-jzL4rc.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", "_micro-task-CxIZtCgj.js", - "_switch-DyCbjYu6.js", - "_description-D4q-ya34.js", + "_switch-BiZWBQc9.js", + "_description-Cz3O-WWk.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_DangerButton-DhWljAF_.js", - "_ActionMessage-uxM-o-da.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_StudyCard-CZirq0ik.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js", + "_vue-tags-input-DbsHG6CC.js", + "_DangerButton-BGA6_FlM.js", + "_ActionMessage-D3hDlqs6.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_StudyCard-CCYIGRAd.js", + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js", "resources/js/Pages/Project/Partials/Activity.vue", - "_portal-viea1unE.js", - "_style-2QlRVEvL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_LoadingButton-DQ530rQU.js", - "_CalendarDaysIcon-bzmmtrVA.js" + "_portal-BTMSE_oA.js", + "_style-fRfHuoRD.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_LoadingButton-B68Xuzxz.js", + "_RorAffiliationTypeahead-DYrNK_fV.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_CalendarDaysIcon-CP-Ljnby.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Project/Validation.vue": { - "file": "assets/Validation-bZ-nNA82.js", + "file": "assets/Validation-D9O4LQhB.js", "name": "Validation", "src": "resources/js/Pages/Project/Validation.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Compounds.vue": { - "file": "assets/Compounds-BMz_txSB.js", + "file": "assets/Compounds-DxIpoNEE.js", "name": "Compounds", "src": "resources/js/Pages/Public/Compounds.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "_Depictor2D-BloOWuSj.js", + "_AppLayout-Dor7lhho.js", + "_Depictor2D-D8c81TYu.js", "resources/js/app.js", - "_StructureSearch-BAHFDTET.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_StructureSearch-XaD5e5AF.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/Compounds-Cyxz3eRr.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Datasets.vue": { - "file": "assets/Datasets-Bk2IgHUa.js", + "file": "assets/Datasets-BJMUE-kD.js", "name": "Datasets", "src": "resources/js/Pages/Public/Datasets.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", - "_ScaleIcon-CYgZpCW4.js", - "_pickBy-lvn3s5H6.js", - "_Pagination-DUPh-k9M.js", - "_ToolTip-B-BuMZla.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ScaleIcon-CtOQtGbS.js", + "_pickBy-_onoeMUk.js", + "_Pagination-BJfz3HvD.js", + "_ToolTip-CctsjpN9.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_MagnifyingGlassIcon-B7G_6YVF.js" + ], + "css": [ + "assets/Datasets-CzTU3bJO.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Embed/Dataset.vue": { - "file": "assets/Dataset-C_iBn6GR.js", + "file": "assets/Dataset-D6JIqO7v.js", "name": "Dataset", "src": "resources/js/Pages/Public/Embed/Dataset.vue", "isDynamicEntry": true, "imports": [ - "_SpectraViewer-DAiohBoS.js", + "_SpectraViewer-BuWGpYyg.js", "resources/js/app.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Embed/Sample.vue": { - "file": "assets/Sample-SpmQRIgb.js", + "file": "assets/Sample-CKGj8xcz.js", "name": "Sample", "src": "resources/js/Pages/Public/Embed/Sample.vue", "isDynamicEntry": true, "imports": [ - "_SpectraViewer-DAiohBoS.js", + "_SpectraViewer-BuWGpYyg.js", "resources/js/app.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Project/Dataset.vue": { - "file": "assets/Dataset-CpEyPbx5.js", + "file": "assets/Dataset-CvGtQ0kc.js", "name": "Dataset", "src": "resources/js/Pages/Public/Project/Dataset.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_SpectraViewer-DAiohBoS.js", - "_DOIBadge-BBho5C2T.js", - "_Depictor2D-BloOWuSj.js", - "resources/js/app.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_ShareIcon-Bhy_NH0G.js", - "_ToolTip-B-BuMZla.js", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_SpectraViewer-BuWGpYyg.js", + "_DOIBadge-BQ7FAuLx.js", + "_Depictor2D-D8c81TYu.js", + "resources/js/app.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_ShareIcon-C15yI_6j.js", + "_ToolTip-CctsjpN9.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_ScaleIcon-CYgZpCW4.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_ScaleIcon-CtOQtGbS.js", + "_MagnifyingGlassIcon-B7G_6YVF.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Project/Files.vue": { - "file": "assets/Files-CpkSF9_N.js", + "file": "assets/Files-BE06w1UI.js", "name": "Files", "src": "resources/js/Pages/Public/Project/Files.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_AppLayout-shqwEEI1.js", - "resources/js/app.js", - "_HomeIcon-B3apTAEd.js", - "_DOIBadge-BBho5C2T.js", - "_Tag-DRPRU5B7.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_ScaleIcon-CYgZpCW4.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "resources/js/app.js", + "_HomeIcon-DwnjDmsR.js", + "_DOIBadge-BQ7FAuLx.js", + "_Tag-C07nHEfs.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_ScaleIcon-CtOQtGbS.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Project/Layout.vue": { - "file": "assets/Layout-DNjK53lj.js", + "file": "assets/Layout-gK1WB-D7.js", "name": "Layout", "src": "resources/js/Pages/Public/Project/Layout.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "resources/js/app.js", - "_DOIBadge-BBho5C2T.js", - "_Tag-DRPRU5B7.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_ScaleIcon-CYgZpCW4.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "resources/js/app.js", + "_DOIBadge-BQ7FAuLx.js", + "_Tag-C07nHEfs.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_ScaleIcon-CtOQtGbS.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Project/License.vue": { - "file": "assets/License-CIYsdsG1.js", + "file": "assets/License-BfoJTJCr.js", "name": "License", "src": "resources/js/Pages/Public/Project/License.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", "resources/js/app.js", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_DOIBadge-BBho5C2T.js", - "_Tag-DRPRU5B7.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_ScaleIcon-CYgZpCW4.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_DOIBadge-BQ7FAuLx.js", + "_Tag-C07nHEfs.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_ScaleIcon-CtOQtGbS.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Project/Samples.vue": { - "file": "assets/Samples-D9Ch_3Y7.js", + "file": "assets/Samples-DSW2EvfW.js", "name": "Samples", "src": "resources/js/Pages/Public/Project/Samples.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_StudyCardPublic-03l-9aGV.js", - "resources/js/app.js", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_StudyCardPublic-GT9WWlwu.js", + "resources/js/app.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_DOIBadge-BBho5C2T.js", - "_Tag-DRPRU5B7.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_ScaleIcon-CYgZpCW4.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_DOIBadge-BQ7FAuLx.js", + "_Tag-C07nHEfs.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_ScaleIcon-CtOQtGbS.js", + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Project/Show.vue": { - "file": "assets/Show-BAnUmhkW.js", + "file": "assets/Show-0GY-WYWM.js", "name": "Show", "src": "resources/js/Pages/Public/Project/Show.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_CitationCard-mr9Srs1M.js", - "_index-CwURvEqp.js", - "_Citation-Dj91Ydnp.js", - "resources/js/app.js", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AuthorCard-D18guzLA.js", + "_CitationCard-D-wfjUVo.js", + "_index-Ar_5PsMF.js", + "_Citation-BBqsTw0Q.js", + "resources/js/app.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_DOIBadge-BBho5C2T.js", - "_Tag-DRPRU5B7.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_ScaleIcon-CYgZpCW4.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_DOIBadge-BQ7FAuLx.js", + "_Tag-C07nHEfs.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_ScaleIcon-CtOQtGbS.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Project/Study.vue": { - "file": "assets/Study-Qa5hdwJy.js", + "file": "assets/Study-Dr6ovf57.js", "name": "Study", "src": "resources/js/Pages/Public/Project/Study.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_SpectraViewer-DAiohBoS.js", - "_Depictor2D-BloOWuSj.js", - "_Depictor3D-DpHRqJcL.js", - "_DOIBadge-BBho5C2T.js", - "resources/js/app.js", - "_Citation-Dj91Ydnp.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_ShareIcon-Bhy_NH0G.js", - "_ToolTip-B-BuMZla.js", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_SpectraViewer-BuWGpYyg.js", + "_Depictor2D-D8c81TYu.js", + "_Depictor3D-DV_4Quud.js", + "_DOIBadge-BQ7FAuLx.js", + "resources/js/app.js", + "_Citation-BBqsTw0Q.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_ShareIcon-C15yI_6j.js", + "_ToolTip-CctsjpN9.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_ScaleIcon-CYgZpCW4.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_ScaleIcon-CtOQtGbS.js", + "_MagnifyingGlassIcon-B7G_6YVF.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Projects.vue": { - "file": "assets/Projects-C0nlvgGM.js", + "file": "assets/Projects-BKsO7-6f.js", "name": "Projects", "src": "resources/js/Pages/Public/Projects.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_pickBy-lvn3s5H6.js", - "_AppLayout-shqwEEI1.js", - "_ProjectCard-C7JLsgIL.js", - "_Pagination-DUPh-k9M.js", - "_ToolTip-B-BuMZla.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_pickBy-_onoeMUk.js", + "_AppLayout-Dor7lhho.js", + "_ProjectCard-HxMXAAdU.js", + "_Pagination-BJfz3HvD.js", + "_ToolTip-CctsjpN9.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_ScaleIcon-CYgZpCW4.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_ScaleIcon-CtOQtGbS.js", + "_MagnifyingGlassIcon-B7G_6YVF.js" + ], + "css": [ + "assets/Projects-CyRAIvDh.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Sample/Layout.vue": { - "file": "assets/Layout-DWaWL8_r.js", + "file": "assets/Layout-DKn6wbrn.js", "name": "Layout", "src": "resources/js/Pages/Public/Sample/Layout.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Sample/Show.vue": { - "file": "assets/Show-CFKNZClV.js", + "file": "assets/Show-MEggxd5s.js", "name": "Show", "src": "resources/js/Pages/Public/Sample/Show.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Sample/Layout.vue", - "_SpectraViewer-DAiohBoS.js", - "_Depictor2D-BloOWuSj.js", - "_DOIBadge-BBho5C2T.js", - "resources/js/app.js", - "_Citation-Dj91Ydnp.js", - "_ShowProjectDates-DEyhF2bt.js", - "_Depictor3D-DpHRqJcL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_ShareIcon-Bhy_NH0G.js", - "_ToolTip-B-BuMZla.js", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_SpectraViewer-BuWGpYyg.js", + "_Depictor2D-D8c81TYu.js", + "_DOIBadge-BQ7FAuLx.js", + "resources/js/app.js", + "_Citation-BBqsTw0Q.js", + "_ShowProjectDates-3AAxCRab.js", + "_Depictor3D-DV_4Quud.js", + "_AuthorCard-D18guzLA.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_ShareIcon-C15yI_6j.js", + "_ToolTip-CctsjpN9.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_CalendarDaysIcon-bzmmtrVA.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_Tag-C07nHEfs.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Public/Studies.vue": { - "file": "assets/Studies-DbbilOmo.js", + "file": "assets/Studies-6epTdex1.js", "name": "Studies", "src": "resources/js/Pages/Public/Studies.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", - "_StudyCardPublic-03l-9aGV.js", - "_pickBy-lvn3s5H6.js", - "_Pagination-DUPh-k9M.js", - "_ToolTip-B-BuMZla.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_StudyCardPublic-GT9WWlwu.js", + "_pickBy-_onoeMUk.js", + "_Pagination-BJfz3HvD.js", + "_ToolTip-CctsjpN9.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js", + "_MagnifyingGlassIcon-B7G_6YVF.js" + ], + "css": [ + "assets/Studies-DZ0j2glf.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Publish.vue": { - "file": "assets/Publish-DVcN48gb.js", + "file": "assets/Publish-CUscU4ZQ.js", "name": "Publish", "src": "resources/js/Pages/Publish.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "resources/js/app.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", - "_vue-tags-input-BGwEuaGX.js", - "_main-DPI-_6Az.js", - "_ManageCitation-A3-Z6aBb.js", - "_CitationCard-mr9Srs1M.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js", - "_SelectRich-Bh8aQhO2.js", - "_ToggleButton-C0L2QH2i.js", - "_index-CwURvEqp.js", - "_ConfirmationModal-BqBcQKy5.js", - "_SuccessButton-CQHcc1CH.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "resources/js/app.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", + "_vue-tags-input-DbsHG6CC.js", + "_main-BJ-Gsz84.js", + "_ManageCitation-BZxJ4fLR.js", + "_AuthorCard-D18guzLA.js", + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js", + "_SelectRich-CJpqbOjy.js", + "_CitationCard-D-wfjUVo.js", + "_ToggleButton-BfMegX4R.js", + "_index-Ar_5PsMF.js", + "_ConfirmationModal-CINCDmZJ.js", + "_SuccessButton-DgtR4LP4.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_Button-Do-BJmWY.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_Button-D-DNlnje.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_DangerButton-DhWljAF_.js", - "_LoadingButton-DQ530rQU.js", - "_Tag-DRPRU5B7.js" + "_DangerButton-BGA6_FlM.js", + "_LoadingButton-B68Xuzxz.js", + "_RorAffiliationTypeahead-DYrNK_fV.js", + "_Input-BlZBuXvW.js", + "_Tag-C07nHEfs.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Recent.vue": { - "file": "assets/Recent-TJku6q1i.js", + "file": "assets/Recent-B68JifmZ.js", "name": "Recent", "src": "resources/js/Pages/Recent.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Project/Index.vue", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_ShowProjectDates-DEyhF2bt.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_StarIcon-BYJ8kyod.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_ShowProjectDates-3AAxCRab.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_StarIcon-DS6sLGXG.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/SharedWithMe.vue": { - "file": "assets/SharedWithMe-fWP6Yees.js", + "file": "assets/SharedWithMe-DgeS4-a4.js", "name": "SharedWithMe", "src": "resources/js/Pages/SharedWithMe.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Project/Index.vue", - "_StudyCard-CZirq0ik.js", - "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_StudyCard-CCYIGRAd.js", + "resources/js/app.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_ShowProjectDates-DEyhF2bt.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_StarIcon-BYJ8kyod.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_ShowProjectDates-3AAxCRab.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_StarIcon-DS6sLGXG.js", + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Starred.vue": { - "file": "assets/Starred-AO7GGajB.js", + "file": "assets/Starred-K5lVdbIy.js", "name": "Starred", "src": "resources/js/Pages/Starred.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Project/Index.vue", "resources/js/app.js", - "_StudyCard-CZirq0ik.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_StudyCard-CCYIGRAd.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_ShowProjectDates-DEyhF2bt.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_StarIcon-BYJ8kyod.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_ShowProjectDates-3AAxCRab.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_StarIcon-DS6sLGXG.js", + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/About.vue": { - "file": "assets/About-CSm3066P.js", + "file": "assets/About-CVAlSBTz.js", "name": "About", "src": "resources/js/Pages/Study/About.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Study/Content.vue", - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", - "_ToolTip-B-BuMZla.js", - "_InputError-EInikEKW.js", - "_Depictor2D-BloOWuSj.js", + "_ToolTip-CctsjpN9.js", + "_InputError-CfIESodf.js", + "_Depictor2D-D8c81TYu.js", + "_AuthorCard-D18guzLA.js", "resources/js/Pages/Study/Layout.vue", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_XMarkIcon-BrZ2BUzq.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_XMarkIcon-BcXHAYXa.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_style-2QlRVEvL.js", - "_Button-Do-BJmWY.js", - "_SelectRich-Bh8aQhO2.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_SecondaryButton-BucXplhe.js", - "_vue-tags-input-BGwEuaGX.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_CircleStackIcon-NWc2meE7.js", - "_ApplicationLogo-Byie6Ini.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_style-fRfHuoRD.js", + "_Button-D-DNlnje.js", + "_SelectRich-CJpqbOjy.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_SecondaryButton-DqadZgr8.js", + "_vue-tags-input-DbsHG6CC.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_CircleStackIcon-D1Ld0mK2.js", + "_ApplicationLogo-DTY9oAac.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_Tag-C07nHEfs.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Content.vue": { - "file": "assets/Content-D9WfmHUt.js", + "file": "assets/Content-BU2b6OP9.js", "name": "Content", "src": "resources/js/Pages/Study/Content.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Study/Layout.vue", "resources/js/app.js", - "_CircleStackIcon-NWc2meE7.js", - "_AppLayout-shqwEEI1.js", + "_CircleStackIcon-D1Ld0mK2.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", - "_InputError-EInikEKW.js", + "_ActionMessage-D3hDlqs6.js", + "_InputError-CfIESodf.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_XMarkIcon-BrZ2BUzq.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_XMarkIcon-BcXHAYXa.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_style-2QlRVEvL.js", - "_Button-Do-BJmWY.js", - "_SelectRich-Bh8aQhO2.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_SecondaryButton-BucXplhe.js", - "_vue-tags-input-BGwEuaGX.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_ToolTip-B-BuMZla.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_ApplicationLogo-Byie6Ini.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_style-fRfHuoRD.js", + "_Button-D-DNlnje.js", + "_SelectRich-CJpqbOjy.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_SecondaryButton-DqadZgr8.js", + "_vue-tags-input-DbsHG6CC.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_ToolTip-CctsjpN9.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_ApplicationLogo-DTY9oAac.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Datasets.vue": { - "file": "assets/Datasets-DkPsuWgp.js", + "file": "assets/Datasets-_HCu03l8.js", "name": "Datasets", "src": "resources/js/Pages/Study/Datasets.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Study/Content.vue", - "_LoadingButton-DQ530rQU.js", - "_SpectraViewer-DAiohBoS.js", - "_AppLayout-shqwEEI1.js", + "_LoadingButton-B68Xuzxz.js", + "_SpectraViewer-BuWGpYyg.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_ShareIcon-Bhy_NH0G.js", - "_ToolTip-B-BuMZla.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_ShareIcon-C15yI_6j.js", + "_ToolTip-CctsjpN9.js", "resources/js/Pages/Study/Layout.vue", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", - "_InputError-EInikEKW.js", + "_ActionMessage-D3hDlqs6.js", + "_InputError-CfIESodf.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_XMarkIcon-BrZ2BUzq.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_XMarkIcon-BcXHAYXa.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_style-2QlRVEvL.js", - "_Button-Do-BJmWY.js", - "_SelectRich-Bh8aQhO2.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_SecondaryButton-BucXplhe.js", - "_vue-tags-input-BGwEuaGX.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_ApplicationLogo-Byie6Ini.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_style-fRfHuoRD.js", + "_Button-D-DNlnje.js", + "_SelectRich-CJpqbOjy.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_SecondaryButton-DqadZgr8.js", + "_vue-tags-input-DbsHG6CC.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_ApplicationLogo-DTY9oAac.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_CircleStackIcon-NWc2meE7.js" + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_CircleStackIcon-D1Ld0mK2.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Files.vue": { - "file": "assets/Files-BM_oQcaU.js", + "file": "assets/Files-DCgNi12J.js", "name": "Files", "src": "resources/js/Pages/Study/Files.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", "resources/js/Pages/Study/Content.vue", - "_ToolTip-B-BuMZla.js", - "_HomeIcon-B3apTAEd.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ToolTip-CctsjpN9.js", + "_HomeIcon-DwnjDmsR.js", + "_ApplicationLogo-DTY9oAac.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", "resources/js/Pages/Study/Layout.vue", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_CircleStackIcon-NWc2meE7.js" + "_style-fRfHuoRD.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_CircleStackIcon-D1Ld0mK2.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Index.vue": { - "file": "assets/Index-C82ZXMLZ.js", + "file": "assets/Index-DmJygZaW.js", "name": "Index", "src": "resources/js/Pages/Study/Index.vue", "isDynamicEntry": true, "imports": [ - "_StudyCard-CZirq0ik.js", + "_StudyCard-CCYIGRAd.js", "resources/js/app.js", - "_Depictor2D-BloOWuSj.js", - "_LockClosedIcon-CK-FFoS7.js" + "_Depictor2D-D8c81TYu.js", + "_LockClosedIcon-CtxNZ2_i.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Integrations.vue": { - "file": "assets/Integrations-CAsr5-W8.js", + "file": "assets/Integrations-DF67807M.js", "name": "Integrations", "src": "resources/js/Pages/Study/Integrations.vue", "isDynamicEntry": true, @@ -2562,92 +2885,100 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_CircleStackIcon-NWc2meE7.js" + "_style-fRfHuoRD.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_CircleStackIcon-D1Ld0mK2.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Layout.vue": { - "file": "assets/Layout-DaLtTPjz.js", + "file": "assets/Layout-CIn9QJ0j.js", "name": "Layout", "src": "resources/js/Pages/Study/Layout.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", "resources/js/Pages/Study/Partials/Details.vue", - "_AccessDialogue-DaBf4ai0.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AccessDialogue-Cateni1h.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_ActionMessage-uxM-o-da.js", + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js" + "_style-fRfHuoRD.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/MolecularIdentifications.vue": { - "file": "assets/MolecularIdentifications-DeOIcevJ.js", + "file": "assets/MolecularIdentifications-CrHBJWFm.js", "name": "MolecularIdentifications", "src": "resources/js/Pages/Study/MolecularIdentifications.vue", "isDynamicEntry": true, @@ -2655,47 +2986,51 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_CircleStackIcon-NWc2meE7.js" + "_style-fRfHuoRD.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_CircleStackIcon-D1Ld0mK2.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Notifications.vue": { - "file": "assets/Notifications-Cyza3xAp.js", + "file": "assets/Notifications-fLvKZJAB.js", "name": "Notifications", "src": "resources/js/Pages/Study/Notifications.vue", "isDynamicEntry": true, @@ -2703,129 +3038,145 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_CircleStackIcon-NWc2meE7.js" + "_style-fRfHuoRD.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_CircleStackIcon-D1Ld0mK2.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Partials/Activity.vue": { - "file": "assets/Activity-BHNnVIIB.js", + "file": "assets/Activity-CMN0X4bl.js", "name": "Activity", "src": "resources/js/Pages/Study/Partials/Activity.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_XMarkIcon-BrZ2BUzq.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_XMarkIcon-BcXHAYXa.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_use-outside-click-DAnsQAYx.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js" + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Partials/Create.vue": { - "file": "assets/Create-BVLvjQxD.js", + "file": "assets/Create-DCCWlK6k.js", "name": "Create", "src": "resources/js/Pages/Study/Partials/Create.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-CmZ6e9E-.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", + "_DialogModal-kRhYIaZg.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", "resources/js/app.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", - "_Modal-D-_sV66W.js", - "_hidden-2_Kmyvd6.js", - "_use-outside-click-UcI2wRsE.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", + "_Modal-D64jrvfn.js", + "_hidden-F-jzL4rc.js", + "_use-outside-click-DAnsQAYx.js", "_micro-task-CxIZtCgj.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_description-D4q-ya34.js" + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Partials/Delete.vue": { - "file": "assets/Delete-uegnL0wb.js", + "file": "assets/Delete-BXIJRa--.js", "name": "Delete", "src": "resources/js/Pages/Study/Partials/Delete.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_DialogModal-CmZ6e9E-.js", - "_DangerButton-DhWljAF_.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", + "_ActionSection-DGSZ5cOQ.js", + "_DialogModal-kRhYIaZg.js", + "_DangerButton-BGA6_FlM.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Partials/Details.vue": { - "file": "assets/Details-BAAPFtXS.js", + "file": "assets/Details-DjnArW3b.js", "name": "Details", "src": "resources/js/Pages/Study/Partials/Details.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_ActionMessage-uxM-o-da.js", - "_InputError-EInikEKW.js", + "_ActionMessage-D3hDlqs6.js", + "_InputError-CfIESodf.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_Button-Do-BJmWY.js", - "_SelectRich-Bh8aQhO2.js", - "_SecondaryButton-BucXplhe.js", - "_vue-tags-input-BGwEuaGX.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_XMarkIcon-BrZ2BUzq.js", - "_transition-K5DyIAHH.js", - "_hidden-2_Kmyvd6.js", - "_use-outside-click-UcI2wRsE.js", + "_style-fRfHuoRD.js", + "_Button-D-DNlnje.js", + "_SelectRich-CJpqbOjy.js", + "_SecondaryButton-DqadZgr8.js", + "_vue-tags-input-DbsHG6CC.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_XMarkIcon-BcXHAYXa.js", + "_transition-N3Y6B5xr.js", + "_hidden-F-jzL4rc.js", + "_use-outside-click-DAnsQAYx.js", "_micro-task-CxIZtCgj.js", - "_form-Cn9CuD1E.js", - "_use-text-value-BpD-bIcx.js", - "_portal-viea1unE.js", - "_description-D4q-ya34.js" + "_form-BpOT_RbF.js", + "_use-text-value-DP7g6SXN.js", + "_portal-BTMSE_oA.js", + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Protocols.vue": { - "file": "assets/Protocols-0MJ994Qs.js", + "file": "assets/Protocols-Dvj0Plfk.js", "name": "Protocols", "src": "resources/js/Pages/Study/Protocols.vue", "isDynamicEntry": true, @@ -2833,360 +3184,409 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-shqwEEI1.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-uxM-o-da.js", + "_ActionMessage-D3hDlqs6.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-2QlRVEvL.js", - "_ClipboardDocumentIcon-DCnLMHiO.js", - "_AccessDialogue-DaBf4ai0.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js", - "_Citation-Dj91Ydnp.js", - "_StarIcon-BYJ8kyod.js", - "_CircleStackIcon-NWc2meE7.js" + "_style-fRfHuoRD.js", + "_ClipboardDocumentIcon-CQaQmjbZ.js", + "_AccessDialogue-Cateni1h.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js", + "_Citation-BBqsTw0Q.js", + "_StarIcon-DS6sLGXG.js", + "_CircleStackIcon-D1Ld0mK2.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Study/Settings.vue": { - "file": "assets/Settings-DJePdnOZ.js", + "file": "assets/Settings-LPHamsdA.js", "name": "Settings", "src": "resources/js/Pages/Study/Settings.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/app.js", "resources/js/Pages/Study/Partials/Delete.vue", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_ActionSection-DoJrofwP.js", - "_SectionTitle-rK4YId1t.js", - "_Input-B-ZTzbzW.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_ActionSection-DGSZ5cOQ.js", + "_SectionTitle-wvDa7nYi.js", + "_Input-BlZBuXvW.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Teams/Create.vue": { - "file": "assets/Create-QXAAHtHo.js", + "file": "assets/Create-oSfMowzg.js", "name": "Create", "src": "resources/js/Pages/Teams/Create.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Teams/Partials/CreateTeamForm.vue", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_FormSection-D_YXuO3u.js", - "_SectionTitle-rK4YId1t.js", - "_Input-B-ZTzbzW.js", - "_Label-DGyfHV0z.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_FormSection-CGKXQW1v.js", + "_SectionTitle-wvDa7nYi.js", + "_Input-BlZBuXvW.js", + "_Label-MQuMO0BF.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Teams/Partials/CreateTeamForm.vue": { - "file": "assets/CreateTeamForm-DrMhQhpS.js", + "file": "assets/CreateTeamForm-DhkD3ubP.js", "name": "CreateTeamForm", "src": "resources/js/Pages/Teams/Partials/CreateTeamForm.vue", "isDynamicEntry": true, "imports": [ - "_Button-Do-BJmWY.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", + "_Button-D-DNlnje.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js" + "_SectionTitle-wvDa7nYi.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Teams/Partials/DeleteTeamForm.vue": { - "file": "assets/DeleteTeamForm-X8EJMnBB.js", + "file": "assets/DeleteTeamForm-DcVfE6BA.js", "name": "DeleteTeamForm", "src": "resources/js/Pages/Teams/Partials/DeleteTeamForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DoJrofwP.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_SecondaryButton-BucXplhe.js", - "_InputError-EInikEKW.js", - "_Input-B-ZTzbzW.js", + "_ActionSection-DGSZ5cOQ.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_SecondaryButton-DqadZgr8.js", + "_InputError-CfIESodf.js", + "_Input-BlZBuXvW.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Teams/Partials/TeamMemberManager.vue": { - "file": "assets/TeamMemberManager-BJHjubQm.js", + "file": "assets/TeamMemberManager-Brz89cRs.js", "name": "TeamMemberManager", "src": "resources/js/Pages/Teams/Partials/TeamMemberManager.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-uxM-o-da.js", - "_ActionSection-DoJrofwP.js", - "_Button-Do-BJmWY.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_DialogModal-CmZ6e9E-.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", - "_SecondaryButton-BucXplhe.js", - "_SectionBorder-Dz4Jb6r4.js", - "resources/js/app.js", - "_SectionTitle-rK4YId1t.js", - "_Modal-D-_sV66W.js" + "_ActionMessage-D3hDlqs6.js", + "_ActionSection-DGSZ5cOQ.js", + "_Button-D-DNlnje.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_DialogModal-kRhYIaZg.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", + "_SecondaryButton-DqadZgr8.js", + "_SectionBorder-mpmjkaR3.js", + "resources/js/app.js", + "_SectionTitle-wvDa7nYi.js", + "_Modal-D64jrvfn.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Teams/Partials/UpdateTeamNameForm.vue": { - "file": "assets/UpdateTeamNameForm-Cx6F-aRP.js", + "file": "assets/UpdateTeamNameForm-DEF5gU38.js", "name": "UpdateTeamNameForm", "src": "resources/js/Pages/Teams/Partials/UpdateTeamNameForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-uxM-o-da.js", - "_Button-Do-BJmWY.js", - "_FormSection-D_YXuO3u.js", - "_Input-B-ZTzbzW.js", - "_InputError-EInikEKW.js", - "_Label-DGyfHV0z.js", + "_ActionMessage-D3hDlqs6.js", + "_Button-D-DNlnje.js", + "_FormSection-CGKXQW1v.js", + "_Input-BlZBuXvW.js", + "_InputError-CfIESodf.js", + "_Label-MQuMO0BF.js", "resources/js/app.js", - "_SectionTitle-rK4YId1t.js" + "_SectionTitle-wvDa7nYi.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Teams/Show.vue": { - "file": "assets/Show-CcKcY4qN.js", + "file": "assets/Show-Tfx6ht-V.js", "name": "Show", "src": "resources/js/Pages/Teams/Show.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Teams/Partials/DeleteTeamForm.vue", - "_SectionBorder-Dz4Jb6r4.js", + "_SectionBorder-mpmjkaR3.js", "resources/js/Pages/Teams/Partials/TeamMemberManager.vue", "resources/js/Pages/Teams/Partials/UpdateTeamNameForm.vue", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_ActionSection-DoJrofwP.js", - "_SectionTitle-rK4YId1t.js", - "_Input-B-ZTzbzW.js", - "_ActionMessage-uxM-o-da.js", - "_FormSection-D_YXuO3u.js", - "_Label-DGyfHV0z.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_ActionSection-DGSZ5cOQ.js", + "_SectionTitle-wvDa7nYi.js", + "_Input-BlZBuXvW.js", + "_ActionMessage-D3hDlqs6.js", + "_FormSection-CGKXQW1v.js", + "_Label-MQuMO0BF.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/TermsOfService.vue": { - "file": "assets/TermsOfService-DImG-bQc.js", + "file": "assets/TermsOfService-DH3foBR4.js", "name": "TermsOfService", "src": "resources/js/Pages/TermsOfService.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCardLogo-B3Uq11MZ.js", - "_ApplicationLogo-Byie6Ini.js" + "_ApplicationLogo-DTY9oAac.js", + "_Footer-nhWzX88G.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Trashed.vue": { - "file": "assets/Trashed-WZAbWqOM.js", + "file": "assets/Trashed-BjeBhLlX.js", "name": "Trashed", "src": "resources/js/Pages/Trashed.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", + "_AppLayout-Dor7lhho.js", "resources/js/Pages/Project/Index.vue", "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-CmZ6e9E-.js", - "_Modal-D-_sV66W.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_InputError-EInikEKW.js", - "_SelectRich-Bh8aQhO2.js", - "_switch-DyCbjYu6.js", + "_DialogModal-kRhYIaZg.js", + "_Modal-D64jrvfn.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_InputError-CfIESodf.js", + "_SelectRich-CJpqbOjy.js", + "_switch-BiZWBQc9.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-BGwEuaGX.js", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js", - "_Tag-DRPRU5B7.js", - "_ShowProjectDates-DEyhF2bt.js", - "_CalendarDaysIcon-bzmmtrVA.js", - "_StarIcon-BYJ8kyod.js" + "_vue-tags-input-DbsHG6CC.js", + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js", + "_Tag-C07nHEfs.js", + "_ShowProjectDates-3AAxCRab.js", + "_CalendarDaysIcon-CP-Ljnby.js", + "_StarIcon-DS6sLGXG.js" + ], + "css": [ + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Upload.vue": { - "file": "assets/Upload-4gCobcYZ.js", + "file": "assets/Upload-nTzPpRye.js", "name": "Upload", "src": "resources/js/Pages/Upload.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-shqwEEI1.js", - "resources/js/app.js", - "_InputError-EInikEKW.js", - "_SecondaryButton-BucXplhe.js", - "_Button-Do-BJmWY.js", - "_DialogModal-CmZ6e9E-.js", - "_Depictor2D-BloOWuSj.js", - "_Depictor3D-DpHRqJcL.js", - "_vue-tags-input-BGwEuaGX.js", - "_index-CwURvEqp.js", - "_SelectRich-Bh8aQhO2.js", - "_ApplicationLogo-Byie6Ini.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_AppLayout-Dor7lhho.js", + "resources/js/app.js", + "_InputError-CfIESodf.js", + "_SecondaryButton-DqadZgr8.js", + "_Button-D-DNlnje.js", + "_DialogModal-kRhYIaZg.js", + "_EmptySearchState-o9-rntAO.js", + "_Depictor2D-D8c81TYu.js", + "_Depictor3D-DV_4Quud.js", + "_vue-tags-input-DbsHG6CC.js", + "_index-Ar_5PsMF.js", + "_SelectRich-CJpqbOjy.js", + "_ApplicationLogo-DTY9oAac.js", + "_ToolTip-CctsjpN9.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_transition-N3Y6B5xr.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_ToolTip-B-BuMZla.js", - "_use-text-value-BpD-bIcx.js", - "_form-Cn9CuD1E.js", - "_XMarkIcon-BrZ2BUzq.js", - "_FlashMessages-H7Dz0t6O.js", - "_AnnouncementBanner-B_CIbGMm.js", + "_description-Cz3O-WWk.js", + "_form-BpOT_RbF.js", + "_XMarkIcon-BcXHAYXa.js", + "_FlashMessages-B9FLcdP2.js", + "_AnnouncementBanner-Bi5ktTFR.js", "resources/js/Pages/Project/Partials/Create.vue", - "_switch-DyCbjYu6.js", - "_Modal-D-_sV66W.js", + "_switch-BiZWBQc9.js", + "_Modal-D64jrvfn.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-BqBcQKy5.js", - "_DangerButton-DhWljAF_.js" + "_ConfirmationModal-CINCDmZJ.js", + "_DangerButton-BGA6_FlM.js" + ], + "css": [ + "assets/Upload-Z_BbUaex.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/Pages/Welcome.vue": { - "file": "assets/Welcome-Dr7UzoV3.js", + "file": "assets/Welcome-Ch8qlCuL.js", "name": "Welcome", "src": "resources/js/Pages/Welcome.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_ApplicationLogo-Byie6Ini.js", - "_ProjectCard-C7JLsgIL.js", - "_StructureSearch-BAHFDTET.js", - "_ToolTip-B-BuMZla.js", - "_FlashMessages-H7Dz0t6O.js", - "_CircleStackIcon-NWc2meE7.js", - "_XMarkIcon-BrZ2BUzq.js", - "_MagnifyingGlassIcon-Cq7Ou0Fo.js", - "_Tag-DRPRU5B7.js", - "_ScaleIcon-CYgZpCW4.js", - "_transition-K5DyIAHH.js", - "_portal-viea1unE.js", - "_use-outside-click-UcI2wRsE.js", - "_hidden-2_Kmyvd6.js", + "_ApplicationLogo-DTY9oAac.js", + "_ProjectCard-HxMXAAdU.js", + "_Footer-nhWzX88G.js", + "_StructureSearch-XaD5e5AF.js", + "_ToolTip-CctsjpN9.js", + "_FlashMessages-B9FLcdP2.js", + "_CircleStackIcon-D1Ld0mK2.js", + "_XMarkIcon-BcXHAYXa.js", + "_MagnifyingGlassIcon-B7G_6YVF.js", + "_InboxIcon-6kSjCYig.js", + "_transition-N3Y6B5xr.js", + "_popover-dJHrdIKh.js", + "_Tag-C07nHEfs.js", + "_ScaleIcon-CtOQtGbS.js", + "_use-outside-click-DAnsQAYx.js", + "_use-text-value-DP7g6SXN.js", + "_portal-BTMSE_oA.js", + "_hidden-F-jzL4rc.js", "_micro-task-CxIZtCgj.js", - "_description-D4q-ya34.js", - "_use-text-value-BpD-bIcx.js" + "_description-Cz3O-WWk.js" + ], + "css": [ + "assets/Welcome-CMoZ_mC2.css", + "assets/app-Bx1gscc4.css" ] }, "resources/js/app.js": { - "file": "assets/app-B0IVowKw.js", + "file": "assets/app-CK-PGG6c.js", "name": "app", "src": "resources/js/app.js", "isEntry": true, + "isDynamicEntry": true, "dynamicImports": [ "resources/js/Pages/API/Index.vue", "resources/js/Pages/API/Partials/ApiTokenManager.vue", @@ -3211,6 +3611,7 @@ "resources/js/Pages/Console/Users/Partials/UserPassword.vue", "resources/js/Pages/Console/Users/Partials/UserProfile.vue", "resources/js/Pages/Dashboard.vue", + "resources/js/Pages/Predict.vue", "resources/js/Pages/PrivacyPolicy.vue", "resources/js/Pages/Profile/Partials/DeleteUserForm.vue", "resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue", @@ -3275,7 +3676,7 @@ "resources/js/Pages/Welcome.vue" ], "css": [ - "assets/app-DisLJtzg.css" + "assets/app-Bx1gscc4.css" ] } } \ No newline at end of file diff --git a/public/img/FSU-Jena-logo.jpg b/public/img/FSU-Jena-logo.jpg new file mode 100644 index 000000000..7f825a576 Binary files /dev/null and b/public/img/FSU-Jena-logo.jpg differ diff --git a/public/img/UniversiteDeGeneve.png b/public/img/UniversiteDeGeneve.png new file mode 100644 index 000000000..0d428d80f Binary files /dev/null and b/public/img/UniversiteDeGeneve.png differ diff --git a/public/img/UniversiteParisSaclay.png b/public/img/UniversiteParisSaclay.png new file mode 100644 index 000000000..423854abe Binary files /dev/null and b/public/img/UniversiteParisSaclay.png differ diff --git a/public/img/eln/nobs.png b/public/img/eln/nobs.png new file mode 100644 index 000000000..f8ffa0f82 Binary files /dev/null and b/public/img/eln/nobs.png differ diff --git a/public/img/imbe-logo.png b/public/img/imbe-logo.png new file mode 100644 index 000000000..baff06f93 Binary files /dev/null and b/public/img/imbe-logo.png differ diff --git a/public/img/instrument-format.png b/public/img/instrument-format.png new file mode 100644 index 000000000..fa03a1564 Binary files /dev/null and b/public/img/instrument-format.png differ diff --git a/public/img/metadata-format.png b/public/img/metadata-format.png new file mode 100644 index 000000000..014c90c4e Binary files /dev/null and b/public/img/metadata-format.png differ diff --git a/public/img/molecule-formats.png b/public/img/molecule-formats.png new file mode 100644 index 000000000..ad00d5477 Binary files /dev/null and b/public/img/molecule-formats.png differ diff --git a/public/img/nmrxiv-logo.png b/public/img/nfdi4chem-logo.png similarity index 100% rename from public/img/nmrxiv-logo.png rename to public/img/nfdi4chem-logo.png diff --git a/public/img/old-logo.svg b/public/img/old-logo.svg deleted file mode 100644 index 8350812bf..000000000 --- a/public/img/old-logo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/public/img/ph.jpg b/public/img/ph.jpg deleted file mode 100644 index a987c2619..000000000 Binary files a/public/img/ph.jpg and /dev/null differ diff --git a/public/img/spectra-format.png b/public/img/spectra-format.png new file mode 100644 index 000000000..85a7f6cf6 Binary files /dev/null and b/public/img/spectra-format.png differ diff --git a/public/img/spectra/1.png b/public/img/spectra/1.png new file mode 100644 index 000000000..222de0883 Binary files /dev/null and b/public/img/spectra/1.png differ diff --git a/public/img/spectra/2.png b/public/img/spectra/2.png new file mode 100644 index 000000000..a9d452f08 Binary files /dev/null and b/public/img/spectra/2.png differ diff --git a/public/img/spectra/3.png b/public/img/spectra/3.png new file mode 100644 index 000000000..2bab4eb8c Binary files /dev/null and b/public/img/spectra/3.png differ diff --git a/public/img/spectra/4.png b/public/img/spectra/4.png new file mode 100644 index 000000000..188a43a59 Binary files /dev/null and b/public/img/spectra/4.png differ diff --git a/public/js/app.js b/public/js/app.js index 27433a8b3..227dc30f6 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -38472,14 +38472,14 @@ var footerNavigation = { href: "https://docs.nmrxiv.org" }, { name: "Guides", - href: "https://docs.nmrxiv.org/docs/submission-guides/overview" + href: "https://docs.nmrxiv.org/submission-guides/overview" }, { name: "API Status", - href: "https://docs.nmrxiv.org/docs/developer-guides/API" + href: "https://docs.nmrxiv.org/developer-guides/API" }], About: [{ name: "Adivsory Board", - href: "https://docs.nmrxiv.org/docs/contributing/contributors-and-steering-committee" + href: "https://docs.nmrxiv.org/contributing/contributors-and-steering-committee" } // { name: "Metrics", href: "#" }, // { name: "Blog", href: "#" }, // { name: "Press", href: "#" }, diff --git a/resources/js/App/FAQs.vue b/resources/js/App/FAQs.vue index 5b2a2ab67..72d54d44e 100644 --- a/resources/js/App/FAQs.vue +++ b/resources/js/App/FAQs.vue @@ -1,49 +1,74 @@