diff --git a/.env.example b/.env.example deleted file mode 100644 index 4bf10e5..0000000 --- a/.env.example +++ /dev/null @@ -1,11 +0,0 @@ -# Domain Scanner -DATABASE_URL=postgresql://scanner:scanner@localhost:5432/domain_scanner?schema=public -REDIS_URL=redis://localhost:6379 -NEXTAUTH_URL=http://localhost:3000 -NEXTAUTH_SECRET=change-me-to-a-long-random-string -NEXT_PUBLIC_APP_URL=http://localhost:3000 -IPINFO_TOKEN= -SCAN_RATE_LIMIT_PER_HOUR=30 -MONITOR_INTERVAL_MS=300000 -SEED_ADMIN_EMAIL= -SEED_ADMIN_PASSWORD= diff --git a/.gitignore b/.gitignore index 3fabbc6..559a058 100644 --- a/.gitignore +++ b/.gitignore @@ -1,41 +1,7 @@ -# dependencies -/node_modules -/.pnp -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/versions - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc .DS_Store -*.pem .env -.env*.local - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - -# prisma -prisma/*.db +.env.* +!.env.example +node_modules/ +.next/ +*.log diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index db976a8..0000000 --- a/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM node:22-alpine AS base -RUN apk add --no-cache libc6-compat openssl -WORKDIR /app - -FROM base AS deps -COPY package.json package-lock.json* ./ -COPY prisma ./prisma/ -RUN npm ci - -FROM base AS builder -COPY --from=deps /app/node_modules ./node_modules -COPY . . -ENV NEXT_TELEMETRY_DISABLED=1 -RUN npx prisma generate && npm run build - -FROM base AS runner -ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 -RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs -COPY --from=builder /app/public ./public -COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static -COPY --from=builder /app/prisma ./prisma -COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma -USER nextjs -EXPOSE 3000 -ENV PORT=3000 -ENV HOSTNAME=0.0.0.0 -CMD ["node", "server.js"] diff --git a/README.md b/README.md index 2adfdb8..03594f7 100644 --- a/README.md +++ b/README.md @@ -1,107 +1,66 @@ -# Domain Scanner +# Domain Web (PCA Lab) -Modern domain intelligence and infrastructure analysis platform with premium UX, real-time monitoring, and scalable self-hosted architecture. +Лёгкий статический сайт: кабинет студента (VPN Amnezia), смена региона магазинов, кураторские списки заблокированных в РФ доменов. -![Domain Scanner](https://img.shields.io/badge/Next.js-15-black?style=flat-square) -![TypeScript](https://img.shields.io/badge/TypeScript-5-blue?style=flat-square) -![Docker](https://img.shields.io/badge/Docker-ready-2496ED?style=flat-square) +**Без поиска доменов** на сайте (crt.sh и API сканера отключены). Списки — статические пресеты. -## Features +## Возможности -- **DNS** — A, AAAA, CNAME, MX, TXT, NS resolution -- **WHOIS** — Registrar and domain metadata -- **SSL** — Certificate validity, issuer, expiry -- **HTTP** — Status, redirects, response headers -- **Geo/IP** — Location via ip-api.com (or IPinfo with token) -- **Security** — Header scoring and grade -- **Tech/CDN** — Server, Cloudflare, Vercel signals -- **Export** — JSON and CSV downloads -- **Live progress** — Server-Sent Events during scans -- **Monitoring** — DNS change + SSL expiry checks via background worker -- **Analytics** — 7-day charts from scan history (Recharts) -- **Auth** — Register / sign-in (NextAuth credentials) +- **Главная** — обложка PCA Lab (исследования AI и кибербезопасности) +- **Кабинет студента** — пошаговое подключение WireGuard / Amnezia VPN +- **VPN по региону** — инструкции смены региона App Store / Google Play / Microsoft Store +- **Группы доменов** — карточки по категориям: + - Медиа (Netflix, YouTube, …) + - Социальные сети (Instagram, Facebook, X, …) + - Искусственный интеллект (ChatGPT, Claude, …) + - Мессенджеры (Telegram, WhatsApp, …) + - Другое / VPN / Dev (GitHub, Steam, …) +- Копирование списка доменов / IP, скачивание **Keenetic .bat** (статические маршруты) -## Roadmap status +Связанный Telegram-бот (поиск доменов): [domain-finder-bot](https://github.com/andrey271192/domain-finder-bot) — на сайте только статика. -| Area | Status | -|------|--------| -| Premium UI (glass, motion, dark/light) | Done | -| Scan API + SSE progress + CDN/WAF heuristics | Done | -| Analytics from DB | Done | -| Monitor worker (DNS/SSL MVP) | Done | -| Auth register + optional admin seed | Done | -| Email/Slack alert delivery | Planned | -| GraphQL public API | Planned | -| Paid tiers / billing | Planned | - -## Quick start (Docker) - -```bash -git clone https://github.com/andrey271192/Domain_web.git -cd Domain_web -cp .env.example .env -docker compose up -d -docker compose exec web npx prisma db push -open http://localhost:3000 -``` - -## One-line VPS install +## Установка на VPS (одна строка) ```bash curl -fsSL https://raw.githubusercontent.com/andrey271192/Domain_web/main/install.sh | sudo bash ``` -On small VPS disks (<4GB free), the install script uses a **lite path**: Postgres/Redis in Docker, Next.js built on the host. For full container deploy on larger machines: `docker compose up -d && docker compose exec web npx prisma db push`. +Переменные окружения (опционально): -If `npm ci` / `npm run build` OOM on a ~1GB RAM VPS, build on your Mac (`npm run build`), then rsync `.next/` and `.next/standalone/` to the server and run `node .next/standalone/server.js` (systemd unit in production). Always run `npx prisma db push` on the VPS after schema changes. +| Переменная | По умолчанию | +|------------|----------------| +| `DOMAIN_WEB_ROOT` | `/var/www/domain-web` | +| `DOMAIN_WEB_INSTALL_SRC` | `/opt/domain-web-src` | +| `DOMAIN_WEB_BRANCH` | `main` | -Legacy GeoExport mirror in `site/` is **not** deployed (see `site/ARCHIVED.md`). +Скрипт: -## Uninstall +- ставит **nginx** и отдаёт каталог `web/` на **порту 80**; +- **не останавливает** Amnezia (443), Docker и `domain-finder-bot`; +- отключает legacy-сервис `domain-scanner` (Node), если был установлен ранее. + +## Удаление ```bash curl -fsSL https://raw.githubusercontent.com/andrey271192/Domain_web/main/uninstall.sh | sudo bash ``` -## Development +## Локальный просмотр ```bash -npm install -cp .env.example .env -# Start Postgres + Redis (docker compose up postgres redis -d) -npm run db:push -npm run dev +cd web && python3 -m http.server 8080 +# http://127.0.0.1:8080/ ``` -## Environment +## Структура -| Variable | Description | -|----------|-------------| -| `DATABASE_URL` | PostgreSQL connection string | -| `REDIS_URL` | Redis for scan cache | -| `NEXTAUTH_SECRET` | Auth signing secret | -| `NEXTAUTH_URL` | Public app URL | -| `IPINFO_TOKEN` | Optional IPinfo token | -| `SCAN_RATE_LIMIT_PER_HOUR` | Per-IP scan limit (default 30) | -| `MONITOR_INTERVAL_MS` | Monitor worker interval (default 300000) | -| `SEED_ADMIN_EMAIL` | Optional admin email on install | -| `SEED_ADMIN_PASSWORD` | Optional admin password on install | +``` +web/ — HTML + React (CDN) + JSX +nginx/ — шаблон vhost +install.sh — деплой на сервер +uninstall.sh +``` -## API +## Лицензия -See [docs/API.md](docs/API.md) and the in-app `/api-docs` page. - -## Docs - -- [Architecture](docs/ARCHITECTURE.md) -- [API](docs/API.md) -- [Deployment](docs/DEPLOYMENT.md) -- [Marketing](docs/MARKETING.md) - -## License - -MIT — see [LICENSE](LICENSE) - -## Topics - -`domain-scanner` `dns` `whois` `ssl` `networking` `cybersecurity` `nextjs` `typescript` `self-hosted` `monitoring` `analytics` `infrastructure` `devtools` `open-source` `docker` `postgresql` `redis` `webapp` `dashboard` `security` +См. [LICENSE](LICENSE). diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index d988548..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,53 +0,0 @@ -services: - web: - build: . - ports: - - "${PORT:-3000}:3000" - environment: - NODE_ENV: production - DATABASE_URL: postgresql://scanner:scanner@postgres:5432/domain_scanner?schema=public - REDIS_URL: redis://redis:6379 - NEXTAUTH_URL: ${NEXTAUTH_URL:-http://localhost:3000} - NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:-change-me-in-production} - NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3000} - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - restart: unless-stopped - - postgres: - image: postgres:16-alpine - ports: - - "127.0.0.1:5432:5432" - environment: - POSTGRES_USER: scanner - POSTGRES_PASSWORD: scanner - POSTGRES_DB: domain_scanner - volumes: - - postgres_data:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U scanner -d domain_scanner"] - interval: 5s - timeout: 5s - retries: 5 - restart: unless-stopped - - redis: - image: redis:7-alpine - ports: - - "127.0.0.1:6379:6379" - command: redis-server --appendonly yes - volumes: - - redis_data:/data - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 5s - timeout: 3s - retries: 5 - restart: unless-stopped - -volumes: - postgres_data: - redis_data: diff --git a/docs/API.md b/docs/API.md deleted file mode 100644 index d604cfd..0000000 --- a/docs/API.md +++ /dev/null @@ -1,51 +0,0 @@ -# API Reference - -Base URL: your deployment origin (e.g. `http://SERVER_IP`) - -## POST /api/scan - -Start a domain scan. - -**Body** - -```json -{ "domain": "example.com" } -``` - -**Response** - -```json -{ "id": "clx...", "domain": "example.com" } -``` - -## GET /api/scan/:id - -Poll scan status and full result. - -## GET /api/scan/:id/stream - -Server-Sent Events. Each event: - -```json -{ "id": "...", "status": "RUNNING", "progress": 45, "domain": "example.com" } -``` - -## GET /api/export?id=:scanId&format=json|csv - -Download completed scan. - -## GET /api/scan - -List recent scans (public metadata). - -## POST /api/monitors - -Requires session. Body: `{ "domain": "example.com", "type": "DNS" }` - -## GET /api/health - -Database connectivity check. - -## Rate limits - -Default 30 scans/hour per IP (`SCAN_RATE_LIMIT_PER_HOUR`). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md deleted file mode 100644 index 987d264..0000000 --- a/docs/ARCHITECTURE.md +++ /dev/null @@ -1,44 +0,0 @@ -# Architecture - -## Overview - -Domain Scanner is a Next.js 15 application with PostgreSQL (Prisma) and optional Redis caching. Scans run in-process on the web server using Node.js built-ins and public APIs. - -## Components - -``` -┌─────────────┐ ┌──────────────┐ ┌─────────────┐ -│ Browser │────▶│ Next.js App │────▶│ PostgreSQL │ -│ (SSE/REST) │ │ scan worker │ │ scans │ -└─────────────┘ └──────┬───────┘ └─────────────┘ - │ - ┌──────▼───────┐ - │ Redis │ - │ scan cache │ - └──────────────┘ -``` - -## Scan pipeline - -1. `POST /api/scan` validates domain, checks rate limit, creates `Scan` row -2. Async `runDomainScan()` updates progress in DB -3. Client subscribes to `GET /api/scan/:id/stream` (SSE) -4. Completed results cached in Redis (1h) and stored as JSON in Postgres - -## Data model - -- **User** — credentials auth (NextAuth) -- **Scan** — domain, status, progress, result JSON -- **Monitor** — per-user DNS/SSL/uptime watch (cron stub) -- **ApiRateLimit** — hourly per-IP counters - -## Competitive positioning - -Tools like DNSChecker and SecurityTrails focus on single-record lookups or enterprise datasets. Domain Scanner targets unified infrastructure snapshots with export and self-hosting — not a clone of their UI patterns. - -## Roadmap - -- BullMQ worker container for monitors -- GraphQL server (schema placeholder in `src/lib/graphql/schema.ts`) -- Blacklist checks (Spamhaus, etc.) -- DNS diff history diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md deleted file mode 100644 index b1d7b56..0000000 --- a/docs/DEPLOYMENT.md +++ /dev/null @@ -1,45 +0,0 @@ -# Deployment - -## Docker (recommended) - -```bash -docker compose up -d --build -docker compose exec web npx prisma db push -``` - -## VPS one-liner - -```bash -curl -fsSL https://raw.githubusercontent.com/andrey271192/Domain_web/main/install.sh | sudo bash -``` - -Install path: `/opt/domain-scanner` (lite VPS install via `install.sh`) -Service: `domain-scanner.service` — `npm start` from repo root (not standalone `server.js` alone) -Nginx site: `domain-scanner` on port 80 → app `:3000`, with `/_next/static/` served from disk - -**CSS / static assets:** After `next build`, run `scripts/sync-standalone-assets.sh` (also via `postbuild`) so `.next/static` and `public` exist under `.next/standalone` for Docker. Host deploy must keep `${INSTALL_DIR}/.next/static` — never run `node .next/standalone/server.js` without that copy. - -## Environment on server - -Edit `/opt/domain-scanner/.env`: - -- `NEXTAUTH_SECRET` — auto-generated on first install -- `NEXTAUTH_URL` / `NEXT_PUBLIC_APP_URL` — public IP or domain - -## Manual Node deploy - -```bash -npm ci && npm run build -DATABASE_URL=... npx prisma db push -PORT=3000 npm start -``` - -## SSL / HTTPS - -Place certbot in front of nginx or terminate TLS at a reverse proxy. - -## Upgrades - -```bash -cd /opt/domain-scanner && git pull && npm ci && npm run build && systemctl restart domain-scanner nginx -``` diff --git a/docs/MARKETING.md b/docs/MARKETING.md deleted file mode 100644 index aee5997..0000000 --- a/docs/MARKETING.md +++ /dev/null @@ -1,32 +0,0 @@ -# Marketing - -## GitHub About - -Modern domain intelligence and infrastructure analysis platform with premium UX, real-time monitoring, and scalable self-hosted architecture. - -## Tagline - -See every layer of your domain. - -## Product Hunt (draft) - -**Title:** Domain Scanner — self-hosted domain intelligence -**Subtitle:** DNS, WHOIS, SSL, security headers, and exports in one premium dashboard. - -**First comment outline:** Built for SREs and indie hackers who want SecurityTrails-grade signals without SaaS lock-in. Docker + Postgres + real scans via Node. - -## Twitter / X - -Shipped Domain Scanner — open-source domain intel with cinematic UI, live SSE scans, JSON/CSV export. Self-host on your VPS in one command. - -## Dev.to outline - -1. Why unified domain scans beat tab-hopping -2. Architecture: Next.js + Prisma + Redis -3. Implementing SSL checks with Node tls -4. SSE for scan progress -5. One-line VPS deploy - -## SEO keywords - -domain scanner, dns lookup tool, ssl checker, whois api, self-hosted security tools diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index bbd17c7..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import { dirname } from "path"; -import { fileURLToPath } from "url"; -import { FlatCompat } from "@eslint/eslintrc"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -const compat = new FlatCompat({ - baseDirectory: __dirname, -}); - -const eslintConfig = [...compat.extends("next/core-web-vitals", "next/typescript")]; - -export default eslintConfig; diff --git a/install.sh b/install.sh index 3709434..18865ac 100755 --- a/install.sh +++ b/install.sh @@ -1,269 +1,107 @@ #!/usr/bin/env bash -# Domain Scanner — VPS install (Postgres/Redis in Docker, Next.js on host) -# Full `docker compose up` (web image) needs ~4GB free disk; this script uses the lite path. +# Domain Web — lightweight static site (nginx :80) +# curl -fsSL https://raw.githubusercontent.com/andrey271192/Domain_web/main/install.sh | sudo bash set -euo pipefail -REPO_URL="${DOMAIN_SCANNER_REPO_URL:-https://github.com/andrey271192/Domain_web.git}" -BRANCH="${DOMAIN_SCANNER_BRANCH:-main}" -INSTALL_DIR="${DOMAIN_SCANNER_INSTALL_DIR:-/opt/domain-scanner}" -SERVICE_NAME="domain-scanner" -NGINX_SITE="domain-scanner" -APP_PORT="${DOMAIN_SCANNER_PORT:-3000}" -LEGACY_SERVICE="geoexport-site" -LEGACY_NGINX="geoexport-site" +REPO_URL="${DOMAIN_WEB_REPO_URL:-https://github.com/andrey271192/Domain_web.git}" +BRANCH="${DOMAIN_WEB_BRANCH:-main}" +INSTALL_SRC="${DOMAIN_WEB_INSTALL_SRC:-/opt/domain-web-src}" +WEB_ROOT="${DOMAIN_WEB_ROOT:-/var/www/domain-web}" +NGINX_SITE="domain-web" +LEGACY_SERVICES=("domain-scanner" "geoexport-site") export DEBIAN_FRONTEND=noninteractive -log() { echo "[domain-scanner-install] $*"; } +log() { echo "[domain-web] $*"; } + need_root() { if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then - echo "Run as root: sudo bash install.sh" >&2 + echo "Run as root: sudo bash" >&2 exit 1 fi } install_packages() { - log "Installing system packages..." + log "Installing nginx, git, curl..." apt-get update -qq - apt-get install -y -qq curl ca-certificates git nginx openssl >/dev/null + apt-get install -y -qq nginx git curl ca-certificates rsync >/dev/null } -install_node() { - if command -v node >/dev/null 2>&1 && [[ "$(node -p 'process.versions.node.split(".")[0]')" -ge 20 ]]; then - log "Node $(node -v) already installed" - return - fi - log "Installing Node.js 22..." - curl -fsSL https://deb.nodesource.com/setup_22.x | bash - - apt-get install -y -qq nodejs >/dev/null -} - -install_docker() { - if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then - log "Docker already installed" - else - log "Installing Docker..." - curl -fsSL https://get.docker.com | sh - fi - systemctl enable docker.socket docker.service 2>/dev/null || true - systemctl start docker.socket 2>/dev/null || true - systemctl start docker.service 2>/dev/null || true -} - -stop_legacy() { - log "Stopping legacy GeoExport mirror (if present)..." - systemctl stop "${LEGACY_SERVICE}.service" 2>/dev/null || true - systemctl disable "${LEGACY_SERVICE}.service" 2>/dev/null || true - rm -f "/etc/systemd/system/${LEGACY_SERVICE}.service" - rm -f "/etc/nginx/sites-enabled/${LEGACY_NGINX}" - rm -f "/etc/nginx/sites-available/${LEGACY_NGINX}" - rm -rf /opt/domain_web 2>/dev/null || true +stop_legacy_scanner() { + log "Disabling legacy Node scanner site (if present)..." + for svc in "${LEGACY_SERVICES[@]}"; do + systemctl stop "${svc}.service" 2>/dev/null || true + systemctl disable "${svc}.service" 2>/dev/null || true + rm -f "/etc/systemd/system/${svc}.service" + done + rm -f /etc/nginx/sites-enabled/domain-scanner 2>/dev/null || true + rm -f /etc/nginx/sites-available/domain-scanner 2>/dev/null || true systemctl daemon-reload 2>/dev/null || true } -clone_or_update() { - log "Cloning/updating repository at ${INSTALL_DIR}..." - if [[ -d "${INSTALL_DIR}/.git" ]]; then - git -C "${INSTALL_DIR}" fetch origin "${BRANCH}" - git -C "${INSTALL_DIR}" checkout "${BRANCH}" - git -C "${INSTALL_DIR}" reset --hard "origin/${BRANCH}" +clone_repo() { + log "Fetching ${REPO_URL} (${BRANCH})..." + if [[ -d "${INSTALL_SRC}/.git" ]]; then + git -C "${INSTALL_SRC}" fetch origin "${BRANCH}" + git -C "${INSTALL_SRC}" checkout "${BRANCH}" + git -C "${INSTALL_SRC}" reset --hard "origin/${BRANCH}" else - rm -rf "${INSTALL_DIR}" - git clone --depth 1 --branch "${BRANCH}" "${REPO_URL}" "${INSTALL_DIR}" + rm -rf "${INSTALL_SRC}" + git clone --depth 1 --branch "${BRANCH}" "${REPO_URL}" "${INSTALL_SRC}" fi } -setup_env() { - local ip - ip="$(hostname -I | awk '{print $1}')" - cd "${INSTALL_DIR}" - if [[ ! -f .env ]]; then - cp .env.example .env - fi - local secret - secret="$(openssl rand -base64 32)" - sed -i "s|^NEXTAUTH_SECRET=.*|NEXTAUTH_SECRET=${secret}|" .env - sed -i "s|^NEXTAUTH_URL=.*|NEXTAUTH_URL=http://${ip}|" .env - sed -i "s|^NEXT_PUBLIC_APP_URL=.*|NEXT_PUBLIC_APP_URL=http://${ip}|" .env - sed -i "s|^DATABASE_URL=.*|DATABASE_URL=postgresql://scanner:scanner@127.0.0.1:5432/domain_scanner?schema=public|" .env - sed -i "s|^REDIS_URL=.*|REDIS_URL=redis://127.0.0.1:6379|" .env +deploy_web() { + log "Deploying static files to ${WEB_ROOT}..." + mkdir -p "${WEB_ROOT}" + rsync -a --delete "${INSTALL_SRC}/web/" "${WEB_ROOT}/" + chown -R www-data:www-data "${WEB_ROOT}" 2>/dev/null || chown -R nginx:nginx "${WEB_ROOT}" 2>/dev/null || true } -deploy_data_services() { - log "Starting Postgres and Redis (Docker)..." - cd "${INSTALL_DIR}" - docker compose up -d postgres redis - for i in $(seq 1 30); do - if docker compose exec -T postgres pg_isready -U scanner -d domain_scanner >/dev/null 2>&1; then - break +configure_nginx() { + log "Configuring nginx (HTTP :80)..." + local conf_src="${INSTALL_SRC}/nginx/domain-web.conf" + if [[ ! -f "${conf_src}" ]]; then + echo "Missing nginx config in repo" >&2 + exit 1 + fi + + # Backup existing default if it listens on 80 and is not ours + if [[ -f /etc/nginx/sites-enabled/default ]] && ! grep -q "domain-web" /etc/nginx/sites-enabled/default 2>/dev/null; then + if grep -q "listen 80" /etc/nginx/sites-enabled/default 2>/dev/null; then + mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.bak.$(date +%s) 2>/dev/null || true fi - sleep 2 - done -} - -build_app() { - log "Building Next.js app on host..." - cd "${INSTALL_DIR}" - export NODE_ENV=production - npm ci - npx prisma generate - npx prisma db push - npm run build - bash scripts/sync-standalone-assets.sh "${INSTALL_DIR}" - # Keep production deps at repo root; `next start` is more reliable than - # standalone on small VPS (avoids incomplete traced node_modules). - npm ci --omit=dev - npx prisma generate - journalctl --vacuum-size=80M 2>/dev/null || true - apt-get clean 2>/dev/null || true -} - -install_monitor_worker() { - log "Installing monitor worker (${SERVICE_NAME}-worker)..." - cat >"/etc/systemd/system/${SERVICE_NAME}-worker.service" <"/etc/systemd/system/${SERVICE_NAME}.service" <"/etc/nginx/sites-available/${NGINX_SITE}" </dev/null || true + sed "s|/var/www/domain-web|${WEB_ROOT}|g" "${conf_src}" > "/etc/nginx/sites-available/${NGINX_SITE}" ln -sf "/etc/nginx/sites-available/${NGINX_SITE}" "/etc/nginx/sites-enabled/${NGINX_SITE}" + nginx -t systemctl enable nginx - systemctl restart nginx + systemctl reload nginx } -verify() { - log "Verifying deployment..." - sleep 4 - if ! systemctl is-active --quiet "${SERVICE_NAME}.service"; then - systemctl status "${SERVICE_NAME}.service" --no-pager || true - journalctl -u "${SERVICE_NAME}.service" -n 30 --no-pager || true - exit 1 - fi - if ! curl -fsS -o /dev/null "http://127.0.0.1:${APP_PORT}/api/health"; then - echo "Health check failed on port ${APP_PORT}" >&2 - exit 1 - fi - local css - css="$(find "${INSTALL_DIR}/.next/static/css" -name '*.css' -type f 2>/dev/null | head -1 || true)" - if [[ -z "${css}" ]]; then - echo "ERROR: no CSS build output in .next/static/css" >&2 - exit 1 - fi - local css_url="/_next/static/css/$(basename "${css}")" - if ! curl -fsSI "http://127.0.0.1${css_url}" | grep -qi 'content-type:.*css'; then - echo "ERROR: CSS not served (${css_url})" >&2 - exit 1 - fi - log "CSS OK: ${css_url}" - local title - title="$(curl -fsS "http://127.0.0.1/" | grep -o '[^<]*' | head -1 || true)" - if echo "${title}" | grep -qi geoexport; then - echo "ERROR: GeoExport mirror still served — aborting" >&2 - exit 1 - fi +print_done() { local ip - ip="$(hostname -I | awk '{print $1}')" - log "Done. Domain Scanner: http://${ip}/" - log "Title: ${title:-Domain Scanner}" + ip="$(hostname -I 2>/dev/null | awk '{print $1}' || echo 'SERVER_IP')" + log "Done." + echo "" + echo " Site root: ${WEB_ROOT}" + echo " URL: http://${ip}/" + echo " Pages: /connect.html /domains.html" + echo "" + echo " Amnezia (443) and Docker containers were not stopped." + echo "" } -need_root -install_packages -install_node -install_docker -stop_legacy -clone_or_update -setup_env -deploy_data_services -build_app -install_systemd -install_nginx -verify +main() { + need_root + install_packages + stop_legacy_scanner + clone_repo + deploy_web + configure_nginx + print_done +} + +main "$@" diff --git a/next.config.ts b/next.config.ts deleted file mode 100644 index 339a77b..0000000 --- a/next.config.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = { - output: "standalone", - poweredByHeader: false, - async headers() { - return [ - { - source: "/(.*)", - headers: [ - { key: "X-Frame-Options", value: "DENY" }, - { key: "X-Content-Type-Options", value: "nosniff" }, - { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, - { - key: "Permissions-Policy", - value: "camera=(), microphone=(), geolocation=()", - }, - ], - }, - ]; - }, -}; - -export default nextConfig; diff --git a/nginx/domain-web.conf b/nginx/domain-web.conf new file mode 100644 index 0000000..554aa55 --- /dev/null +++ b/nginx/domain-web.conf @@ -0,0 +1,24 @@ +# PCA Lab / Domain Web — static site on port 80 +# Installed to /etc/nginx/sites-available/domain-web + +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name _; + + root /var/www/domain-web; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location ~* \.(json|jsx|html|css|js|png|jpg|svg|ico|woff2?)$ { + expires 1h; + add_header Cache-Control "public"; + } + + # Do not proxy — Amnezia and other services stay on 443 separately + access_log /var/log/nginx/domain-web-access.log; + error_log /var/log/nginx/domain-web-error.log; +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 728b6b4..0000000 --- a/package-lock.json +++ /dev/null @@ -1,10123 +0,0 @@ -{ - "name": "domain-scanner", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "domain-scanner", - "version": "1.0.0", - "hasInstallScript": true, - "dependencies": { - "@prisma/client": "^6.9.0", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "bcryptjs": "^3.0.2", - "bullmq": "^5.56.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "dns2": "^2.1.0", - "framer-motion": "^12.16.0", - "ioredis": "^5.6.1", - "lucide-react": "^0.513.0", - "next": "^15.3.3", - "next-auth": "^5.0.0-beta.28", - "next-themes": "^0.4.6", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "recharts": "^2.15.3", - "sonner": "^2.0.5", - "tailwind-merge": "^3.3.0", - "whois": "^2.14.2", - "zod": "^3.25.51" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4", - "@types/bcryptjs": "^2.4.6", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "^15.3.3", - "prisma": "^6.9.0", - "tailwindcss": "^4", - "tsx": "^4.22.3", - "typescript": "^5" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@auth/core": { - "version": "0.41.2", - "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.41.2.tgz", - "integrity": "sha512-Hx5MNBxN2fJTbJKGUKAA0wca43D0Akl3TvufY54Gn8lop7F+34vU1zA1pn0vQfIoVuLIrpfc2nkyjwIaPJMW7w==", - "license": "ISC", - "dependencies": { - "@panva/hkdf": "^1.2.1", - "jose": "^6.0.6", - "oauth4webapi": "^3.3.0", - "preact": "10.24.3", - "preact-render-to-string": "6.5.11" - }, - "peerDependencies": { - "@simplewebauthn/browser": "^9.0.1", - "@simplewebauthn/server": "^9.0.2", - "nodemailer": "^7.0.7" - }, - "peerDependenciesMeta": { - "@simplewebauthn/browser": { - "optional": true - }, - "@simplewebauthn/server": { - "optional": true - }, - "nodemailer": { - "optional": true - } - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.6" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "license": "MIT" - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz", - "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==", - "license": "MIT" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@next/env": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz", - "integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.18.tgz", - "integrity": "sha512-w4MYq8M26a8PNrfto0JosLf5/3ssln1rsyP96g2DkC8uFVymStM5DLSz5ElxxrPRg2XnTMnFo3kREFlhYvxhWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz", - "integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz", - "integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz", - "integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz", - "integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz", - "integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz", - "integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz", - "integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz", - "integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@panva/hkdf": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", - "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@prisma/client": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.3.tgz", - "integrity": "sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@prisma/config": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.3.tgz", - "integrity": "sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "c12": "3.1.0", - "deepmerge-ts": "7.1.5", - "effect": "3.21.0", - "empathic": "2.0.0" - } - }, - "node_modules/@prisma/debug": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz", - "integrity": "sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.3.tgz", - "integrity": "sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.3", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/fetch-engine": "6.19.3", - "@prisma/get-platform": "6.19.3" - } - }, - "node_modules/@prisma/engines-version": { - "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", - "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.3.tgz", - "integrity": "sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.3", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/get-platform": "6.19.3" - } - }, - "node_modules/@prisma/get-platform": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.3.tgz", - "integrity": "sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.3" - } - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", - "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", - "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", - "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", - "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", - "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.21.0", - "jiti": "^2.6.1", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.3.0" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", - "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.0", - "@tailwindcss/oxide-darwin-arm64": "4.3.0", - "@tailwindcss/oxide-darwin-x64": "4.3.0", - "@tailwindcss/oxide-freebsd-x64": "4.3.0", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", - "@tailwindcss/oxide-linux-x64-musl": "4.3.0", - "@tailwindcss/oxide-wasm32-wasi": "4.3.0", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", - "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", - "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", - "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", - "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", - "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", - "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", - "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", - "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", - "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", - "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.10.0", - "@emnapi/runtime": "^1.10.0", - "@emnapi/wasi-threads": "^1.2.1", - "@napi-rs/wasm-runtime": "^1.1.4", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", - "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", - "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", - "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.3.0", - "@tailwindcss/oxide": "4.3.0", - "postcss": "^8.5.10", - "tailwindcss": "4.3.0" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/bcryptjs": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", - "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/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" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", - "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/react": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", - "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", - "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/type-utils": "8.59.4", - "@typescript-eslint/utils": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.59.4", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", - "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", - "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.4", - "@typescript-eslint/types": "^8.59.4", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", - "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", - "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", - "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4", - "@typescript-eslint/utils": "8.59.4", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", - "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", - "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.59.4", - "@typescript-eslint/tsconfig-utils": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", - "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", - "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.4", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", - "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", - "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", - "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", - "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", - "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", - "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", - "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", - "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", - "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", - "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-loong64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", - "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", - "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", - "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", - "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", - "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", - "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", - "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-openharmony-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", - "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", - "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", - "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", - "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", - "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", - "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/bcryptjs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", - "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", - "license": "BSD-3-Clause", - "bin": { - "bcrypt": "bin/bcrypt" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bullmq": { - "version": "5.77.2", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.77.2.tgz", - "integrity": "sha512-3I3LdL8vR8/hetgPZghwFvsxVFhRJdUfhjeA4kXTQtHehRwQRTndIVzxOBwo/Bv+bP2uBzHJo894Or7qAhbwDw==", - "license": "MIT", - "dependencies": { - "cron-parser": "4.9.0", - "ioredis": "5.10.1", - "msgpackr": "2.0.1", - "node-abort-controller": "3.1.1", - "semver": "7.8.0", - "tslib": "2.8.1" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "redis": ">=5.0.0" - }, - "peerDependenciesMeta": { - "redis": { - "optional": true - } - } - }, - "node_modules/c12": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^16.6.1", - "exsolve": "^1.0.7", - "giget": "^2.0.0", - "jiti": "^2.4.2", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", - "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/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/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/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "license": "MIT", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defu": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/dns2": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.1.0.tgz", - "integrity": "sha512-m27K11aQalRbmUs7RLaz6aPyceLjAoqjPRNTdE7qUouQpl+PC8Bi67O+i9SuJUPbQC8dxFrczAxfmTPuTKHNkw==", - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/effect": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz", - "integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "fast-check": "^3.23.1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/empathic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.0.tgz", - "integrity": "sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", - "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.0", - "@esbuild/android-arm": "0.28.0", - "@esbuild/android-arm64": "0.28.0", - "@esbuild/android-x64": "0.28.0", - "@esbuild/darwin-arm64": "0.28.0", - "@esbuild/darwin-x64": "0.28.0", - "@esbuild/freebsd-arm64": "0.28.0", - "@esbuild/freebsd-x64": "0.28.0", - "@esbuild/linux-arm": "0.28.0", - "@esbuild/linux-arm64": "0.28.0", - "@esbuild/linux-ia32": "0.28.0", - "@esbuild/linux-loong64": "0.28.0", - "@esbuild/linux-mips64el": "0.28.0", - "@esbuild/linux-ppc64": "0.28.0", - "@esbuild/linux-riscv64": "0.28.0", - "@esbuild/linux-s390x": "0.28.0", - "@esbuild/linux-x64": "0.28.0", - "@esbuild/netbsd-arm64": "0.28.0", - "@esbuild/netbsd-x64": "0.28.0", - "@esbuild/openbsd-arm64": "0.28.0", - "@esbuild/openbsd-x64": "0.28.0", - "@esbuild/openharmony-arm64": "0.28.0", - "@esbuild/sunos-x64": "0.28.0", - "@esbuild/win32-arm64": "0.28.0", - "@esbuild/win32-ia32": "0.28.0", - "@esbuild/win32-x64": "0.28.0" - } - }, - "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": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-next": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.18.tgz", - "integrity": "sha512-HuoJU6uUPD00eyiud78IBnT4HLhztFj2V+ild2Uon5ZUrYZKe0Olu2QRD99e9IgL4/H1eg5Onka3BsfRW2U0Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "15.5.18", - "@rushstack/eslint-patch": "^1.10.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^5.0.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.16.1", - "resolve": "^2.0.0-next.6" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/fast-check": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", - "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT", - "dependencies": { - "pure-rand": "^6.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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-equals": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", - "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/framer-motion": { - "version": "12.40.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", - "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.40.0", - "motion-utils": "^12.39.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/ioredis": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz", - "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "1.5.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "devOptional": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/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": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lucide-react": { - "version": "0.513.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.513.0.tgz", - "integrity": "sha512-CJZKq2g8Y8yN4Aq002GahSXbG2JpFv9kXwyiOAMvUBv7pxeOFHUWKB0mO7MiY4ZVFCV4aNjv2BJFq/z3DgKPQg==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/motion-dom": { - "version": "12.40.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", - "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.39.0" - } - }, - "node_modules/motion-utils": { - "version": "12.39.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", - "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/msgpackr": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.0.1.tgz", - "integrity": "sha512-9J+tqTEsbHqY8YohazYgty7LgerFIWxvMLpUjqETSmjHojtJm2WnX2kK/2a1fLI7CO7ERP1YSEUXMucz4j+yBA==", - "license": "MIT", - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "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/next": { - "version": "15.5.18", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz", - "integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==", - "license": "MIT", - "dependencies": { - "@next/env": "15.5.18", - "@swc/helpers": "0.5.15", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.18", - "@next/swc-darwin-x64": "15.5.18", - "@next/swc-linux-arm64-gnu": "15.5.18", - "@next/swc-linux-arm64-musl": "15.5.18", - "@next/swc-linux-x64-gnu": "15.5.18", - "@next/swc-linux-x64-musl": "15.5.18", - "@next/swc-win32-arm64-msvc": "15.5.18", - "@next/swc-win32-x64-msvc": "15.5.18", - "sharp": "^0.34.3" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-auth": { - "version": "5.0.0-beta.31", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-5.0.0-beta.31.tgz", - "integrity": "sha512-1OBgCKPzo+S7UWWMp3xgvGvIJ0OpV7B3vR4ZDRqD9a4Ch+OT6dakLXG9ivhtmIWVa71nTSXattOHyCg8sNi8/Q==", - "license": "ISC", - "dependencies": { - "@auth/core": "0.41.2" - }, - "peerDependencies": { - "@simplewebauthn/browser": "^9.0.1", - "@simplewebauthn/server": "^9.0.2", - "next": "^14.0.0-0 || ^15.0.0 || ^16.0.0", - "nodemailer": "^7.0.7", - "react": "^18.2.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@simplewebauthn/browser": { - "optional": true - }, - "@simplewebauthn/server": { - "optional": true - }, - "nodemailer": { - "optional": true - } - } - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" - }, - "node_modules/node-exports-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/node-exports-info/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/nypm": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz", - "integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.2.2", - "pathe": "^2.0.3", - "tinyexec": "^1.1.1" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nypm/node_modules/citty": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", - "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/oauth4webapi": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.6.tgz", - "integrity": "sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "devOptional": true, - "license": "MIT" - }, - "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==", - "devOptional": 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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.24.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", - "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/preact-render-to-string": { - "version": "6.5.11", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz", - "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==", - "license": "MIT", - "peerDependencies": { - "preact": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prisma": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.3.tgz", - "integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/config": "6.19.3", - "@prisma/engines": "6.19.3" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/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/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/react": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", - "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", - "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.6" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-smooth": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", - "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", - "license": "MIT", - "dependencies": { - "fast-equals": "^5.0.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/recharts": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", - "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", - "deprecated": "1.x and 2.x branches are no longer active. Bump to Recharts v3 to receive latest features and bugfixes. See https://github.com/recharts/recharts/wiki/3.0-migration-guide", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.21", - "react-is": "^18.3.1", - "react-smooth": "^4.0.4", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "license": "MIT", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/recharts/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, - "node_modules/resolve": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", - "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.2", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", - "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/sonner": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", - "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "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/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", - "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", - "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.2.tgz", - "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/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": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.3.tgz", - "integrity": "sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.28.0" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unrs-resolver": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", - "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.4" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.12.2", - "@unrs/resolver-binding-android-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-x64": "1.12.2", - "@unrs/resolver-binding-freebsd-x64": "1.12.2", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", - "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", - "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-musl": "1.12.2", - "@unrs/resolver-binding-openharmony-arm64": "1.12.2", - "@unrs/resolver-binding-wasm32-wasi": "1.12.2", - "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", - "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", - "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/whois": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/whois/-/whois-2.16.1.tgz", - "integrity": "sha512-gCxr+knAuXzsHJlHaIi8bCZoRU9anysyKbo0mgjAkkanNdOvUhBZShgG/ckcpKryDUVs2cH684MU+wOLjBYlAA==", - "license": "FreeBSD", - "dependencies": { - "socks": "^2.2.2", - "underscore": "^1.9.1", - "yargs": "^15.4.1" - }, - "bin": { - "whois": "bin.js" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 3a6acc1..0000000 --- a/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "domain-scanner", - "version": "1.0.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "prisma generate && next build", - "postbuild": "bash scripts/sync-standalone-assets.sh", - "start": "next start", - "lint": "eslint", - "postinstall": "prisma generate", - "db:push": "prisma db push", - "db:studio": "prisma studio", - "worker:monitors": "npx tsx scripts/monitor-worker.ts", - "seed:admin": "npx tsx scripts/seed-admin.ts", - "smoke": "bash scripts/smoke-test.sh" - }, - "dependencies": { - "@prisma/client": "^6.9.0", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "bcryptjs": "^3.0.2", - "bullmq": "^5.56.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "dns2": "^2.1.0", - "framer-motion": "^12.16.0", - "ioredis": "^5.6.1", - "lucide-react": "^0.513.0", - "next": "^15.3.3", - "next-auth": "^5.0.0-beta.28", - "next-themes": "^0.4.6", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "recharts": "^2.15.3", - "sonner": "^2.0.5", - "tailwind-merge": "^3.3.0", - "whois": "^2.14.2", - "zod": "^3.25.51" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4", - "@types/bcryptjs": "^2.4.6", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "^15.3.3", - "prisma": "^6.9.0", - "tailwindcss": "^4", - "tsx": "^4.22.3", - "typescript": "^5" - } -} diff --git a/postcss.config.mjs b/postcss.config.mjs deleted file mode 100644 index 61e3684..0000000 --- a/postcss.config.mjs +++ /dev/null @@ -1,7 +0,0 @@ -const config = { - plugins: { - "@tailwindcss/postcss": {}, - }, -}; - -export default config; diff --git a/prisma/schema.prisma b/prisma/schema.prisma deleted file mode 100644 index e1b6ec2..0000000 --- a/prisma/schema.prisma +++ /dev/null @@ -1,85 +0,0 @@ -generator client { - provider = "prisma-client-js" - binaryTargets = ["native", "debian-openssl-3.0.x"] -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -enum Role { - USER - ADMIN -} - -enum ScanStatus { - PENDING - RUNNING - COMPLETED - FAILED -} - -enum MonitorType { - DNS - SSL - UPTIME -} - -model User { - id String @id @default(cuid()) - email String @unique - name String? - passwordHash String - role Role @default(USER) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - scans Scan[] - monitors Monitor[] -} - -model Scan { - id String @id @default(cuid()) - domain String - status ScanStatus @default(PENDING) - progress Int @default(0) - stage String? - result Json? - error String? - userId String? - user User? @relation(fields: [userId], references: [id], onDelete: SetNull) - ip String? - userAgent String? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@index([domain]) - @@index([createdAt]) - @@map("scans") -} - -model Monitor { - id String @id @default(cuid()) - domain String - type MonitorType - enabled Boolean @default(true) - lastChecked DateTime? - lastResult Json? - userId String - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@index([userId]) - @@map("monitors") -} - -model ApiRateLimit { - id String @id @default(cuid()) - key String @unique - count Int @default(0) - windowEnd DateTime - updatedAt DateTime @updatedAt - - @@map("api_rate_limits") -} diff --git a/scripts/install-node.sh b/scripts/install-node.sh deleted file mode 100644 index 6c5ab38..0000000 --- a/scripts/install-node.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env bash -# Node-native production deploy (low disk — no Docker image build) -set -euo pipefail - -INSTALL_DIR="${DOMAIN_SCANNER_INSTALL_DIR:-/opt/domain_web}" -SERVICE_NAME="domain-scanner" -NGINX_SITE="domain-scanner" -APP_PORT="${DOMAIN_SCANNER_PORT:-3000}" -NODE_PORT="${APP_PORT}" - -log() { echo "[domain-scanner-node] $*"; } - -install_packages() { - apt-get update -qq - apt-get install -y -qq nginx git curl ca-certificates >/dev/null - if ! command -v node >/dev/null || [[ $(node -v | cut -d. -f1 | tr -d v) -lt 20 ]]; then - curl -fsSL https://deb.nodesource.com/setup_22.x | bash - - apt-get install -y -qq nodejs >/dev/null - fi -} - -setup_compose_db() { - cd "${INSTALL_DIR}" - if command -v docker-compose >/dev/null; then - DC=docker-compose - else - DC="docker compose" - fi - $DC up -d postgres redis - sleep 5 -} - -setup_env() { - if [[ ! -f "${INSTALL_DIR}/.env" ]]; then - cp "${INSTALL_DIR}/.env.example" "${INSTALL_DIR}/.env" - SECRET=$(openssl rand -base64 32 2>/dev/null || head -c 32 /dev/urandom | base64) - cat >>"${INSTALL_DIR}/.env" <"/etc/systemd/system/${SERVICE_NAME}.service" <"/etc/nginx/sites-available/${NGINX_SITE}" </dev/null || true - rm -f /etc/nginx/sites-enabled/default - ln -sf "/etc/nginx/sites-available/${NGINX_SITE}" "/etc/nginx/sites-enabled/${NGINX_SITE}" - nginx -t && systemctl restart nginx -} - -if [[ "${EUID}" -ne 0 ]]; then echo "Run as root" >&2; exit 1; fi -install_packages -setup_env -setup_compose_db -build_app -install_systemd -install_nginx -log "Done: http://$(hostname -I | awk '{print $1}')/" diff --git a/scripts/monitor-worker.ts b/scripts/monitor-worker.ts deleted file mode 100644 index 6fef658..0000000 --- a/scripts/monitor-worker.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Background monitor checks (DNS change + SSL expiry MVP). - * Run via: npm run worker:monitors - */ -import { runAllMonitorChecks } from "../src/lib/monitoring/check"; - -const intervalMs = Number(process.env.MONITOR_INTERVAL_MS ?? 300_000); - -async function tick() { - const summary = await runAllMonitorChecks(); - console.log( - `[monitor-worker] ${new Date().toISOString()} checked=${summary.checked} with_alerts=${summary.alerts}` - ); -} - -async function main() { - await tick(); - setInterval(() => { - tick().catch((e) => console.error("[monitor-worker]", e)); - }, intervalMs); - console.log(`[monitor-worker] interval ${intervalMs / 1000}s`); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/scripts/seed-admin.ts b/scripts/seed-admin.ts deleted file mode 100644 index 1c60f5f..0000000 --- a/scripts/seed-admin.ts +++ /dev/null @@ -1,28 +0,0 @@ -import bcrypt from "bcryptjs"; -import { PrismaClient } from "@prisma/client"; - -const prisma = new PrismaClient(); - -async function main() { - const email = process.env.SEED_ADMIN_EMAIL?.toLowerCase(); - const password = process.env.SEED_ADMIN_PASSWORD; - if (!email || !password) { - console.log("[seed-admin] SEED_ADMIN_EMAIL / SEED_ADMIN_PASSWORD not set — skip"); - return; - } - - const passwordHash = await bcrypt.hash(password, 12); - await prisma.user.upsert({ - where: { email }, - create: { email, passwordHash, role: "ADMIN", name: "Admin" }, - update: { passwordHash, role: "ADMIN" }, - }); - console.log(`[seed-admin] admin ready: ${email}`); -} - -main() - .catch((e) => { - console.error(e); - process.exit(1); - }) - .finally(() => prisma.$disconnect()); diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh deleted file mode 100644 index 9e27185..0000000 --- a/scripts/smoke-test.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE="${SMOKE_BASE_URL:-http://127.0.0.1:3000}" -DOMAIN="${SMOKE_DOMAIN:-example.com}" - -echo "[smoke] health" -curl -fsS "${BASE}/api/health" | grep -q '"ok"' || { echo "health failed"; exit 1; } - -echo "[smoke] scan POST" -SCAN_JSON="$(curl -fsS -X POST "${BASE}/api/scan" \ - -H 'Content-Type: application/json' \ - -d "{\"domain\":\"${DOMAIN}\"}")" -SCAN_ID="$(echo "${SCAN_JSON}" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p' | head -1)" -if [[ -z "${SCAN_ID}" ]]; then - echo "scan id missing: ${SCAN_JSON}" - exit 1 -fi - -echo "[smoke] wait scan ${SCAN_ID}" -for _ in $(seq 1 90); do - STATUS="$(curl -fsS "${BASE}/api/scan/${SCAN_ID}" | sed -n 's/.*"status":"\([^"]*\)".*/\1/p' | head -1)" - if [[ "${STATUS}" == "COMPLETED" || "${STATUS}" == "FAILED" ]]; then - break - fi - sleep 1 -done -if [[ "${STATUS}" != "COMPLETED" ]]; then - echo "scan did not complete: ${STATUS}" - exit 1 -fi - -for path in / /dashboard /analytics /monitoring /api-docs /login; do - echo "[smoke] GET ${path}" - code="$(curl -s -o /dev/null -w '%{http_code}' "${BASE}${path}")" - if [[ "${code}" != "200" ]]; then - echo "page ${path} returned ${code}" - exit 1 - fi -done - -echo "[smoke] OK" diff --git a/scripts/sync-standalone-assets.sh b/scripts/sync-standalone-assets.sh deleted file mode 100755 index ad7785a..0000000 --- a/scripts/sync-standalone-assets.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# Copy Next.js static assets into standalone output (required for `node server.js`). -set -euo pipefail - -ROOT="${1:-$(cd "$(dirname "$0")/.." && pwd)}" -STANDALONE="${ROOT}/.next/standalone" -STATIC_SRC="${ROOT}/.next/static" -PUBLIC_SRC="${ROOT}/public" - -if [[ ! -d "${STANDALONE}" ]]; then - echo "[sync-standalone-assets] No .next/standalone — skipping (non-standalone build?)" >&2 - exit 0 -fi - -if [[ ! -d "${STATIC_SRC}" ]]; then - echo "[sync-standalone-assets] ERROR: missing ${STATIC_SRC} — run npm run build first" >&2 - exit 1 -fi - -mkdir -p "${STANDALONE}/.next" -rm -rf "${STANDALONE}/.next/static" -cp -a "${STATIC_SRC}" "${STANDALONE}/.next/static" - -if [[ -d "${PUBLIC_SRC}" ]]; then - rm -rf "${STANDALONE}/public" - cp -a "${PUBLIC_SRC}" "${STANDALONE}/public" -fi - -echo "[sync-standalone-assets] OK: .next/static + public → ${STANDALONE}" diff --git a/site/.gitignore b/site/.gitignore deleted file mode 100644 index 2752eb9..0000000 --- a/site/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -.DS_Store diff --git a/site/ARCHIVED.md b/site/ARCHIVED.md deleted file mode 100644 index 3adf32b..0000000 --- a/site/ARCHIVED.md +++ /dev/null @@ -1,7 +0,0 @@ -# Archived — GeoExport mirror - -The `site/` directory is a **legacy static mirror** of geoexport.org. It is **not** deployed by `install.sh`. - -Production installs use the **Domain Scanner** Next.js app at the repository root (`docker compose`). - -Kept in git for reference only. diff --git a/site/README.md b/site/README.md deleted file mode 100644 index a59d1ea..0000000 --- a/site/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# GeoExport — локальная копия - -Зеркало интерфейса [geoexport.org](https://geoexport.org/): экспорт списков geoip/geosite для VPN-клиентов (Xray, 3x-ui, V2Ray). - -## Запуск - -```bash -cd ~/geoexport-clone -npm start -``` - -Откройте в браузере: **http://127.0.0.1:4173** - -Другой порт: `PORT=8080 npm start` - -## Состав - -| Путь | Назначение | -|------|------------| -| `index.html` | Точка входа SPA | -| `assets/` | Собранный фронтенд (React + Tailwind) с оригинала | -| `data/*.json` | Кэш API: пресеты, источники, дата обновления | -| `server.mjs` | Локальный сервер: статика + JSON + прокси динамических API | - -## Обновление данных - -```bash -curl -sL https://geoexport.org/api/presets -o data/presets.json -curl -sL https://geoexport.org/api/sources -o data/sources.json -curl -sL https://geoexport.org/api/last-update -o data/last-update.json -curl -sL https://geoexport.org/api/routing/presets -o data/routing-presets.json -``` - -## Патч экспорта - -Перед запуском применяется `patch-bundle.mjs` (превью/скачивание, Keenetic, пустые ответы API). - -```bash -npm start # prestart → patch автоматически -``` - -Карточка про Telegram-бота `@domain_searchPro_bot` — `assets/telegram-bot.js`. - -## Ограничения - -- Экспорт, поиск, DNS lookup и генерация routing проксируются на живой `geoexport.org` (нужен интернет). -- Это копия UI и кэшированных справочников, не полный автономный бэкенд с базами `.dat`. diff --git a/site/assets/index-VQj200iM.js b/site/assets/index-VQj200iM.js deleted file mode 100644 index ee8d28d..0000000 --- a/site/assets/index-VQj200iM.js +++ /dev/null @@ -1,69 +0,0 @@ -function od(e,t){for(var n=0;nr[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const s of l)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(l){const s={};return l.integrity&&(s.integrity=l.integrity),l.referrerPolicy&&(s.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?s.credentials="include":l.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(l){if(l.ep)return;l.ep=!0;const s=n(l);fetch(l.href,s)}})();function id(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ma={exports:{}},El={},$a={exports:{}},M={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var pr=Symbol.for("react.element"),ad=Symbol.for("react.portal"),ud=Symbol.for("react.fragment"),cd=Symbol.for("react.strict_mode"),dd=Symbol.for("react.profiler"),fd=Symbol.for("react.provider"),pd=Symbol.for("react.context"),md=Symbol.for("react.forward_ref"),hd=Symbol.for("react.suspense"),vd=Symbol.for("react.memo"),gd=Symbol.for("react.lazy"),gi=Symbol.iterator;function xd(e){return e===null||typeof e!="object"?null:(e=gi&&e[gi]||e["@@iterator"],typeof e=="function"?e:null)}var Da={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Fa=Object.assign,Ba={};function wn(e,t,n){this.props=e,this.context=t,this.refs=Ba,this.updater=n||Da}wn.prototype.isReactComponent={};wn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};wn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Aa(){}Aa.prototype=wn.prototype;function xo(e,t,n){this.props=e,this.context=t,this.refs=Ba,this.updater=n||Da}var yo=xo.prototype=new Aa;yo.constructor=xo;Fa(yo,wn.prototype);yo.isPureReactComponent=!0;var xi=Array.isArray,Va=Object.prototype.hasOwnProperty,ko={current:null},Wa={key:!0,ref:!0,__self:!0,__source:!0};function Ha(e,t,n){var r,l={},s=null,o=null;if(t!=null)for(r in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(s=""+t.key),t)Va.call(t,r)&&!Wa.hasOwnProperty(r)&&(l[r]=t[r]);var i=arguments.length-2;if(i===1)l.children=n;else if(1>>1,ne=L[Y];if(0>>1;Yl(Hl,I))Ltl(jr,Hl)?(L[Y]=jr,L[Lt]=I,Y=Lt):(L[Y]=Hl,L[Pt]=I,Y=Pt);else if(Ltl(jr,I))L[Y]=jr,L[Lt]=I,Y=Lt;else break e}}return O}function l(L,O){var I=L.sortIndex-O.sortIndex;return I!==0?I:L.id-O.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,i=o.now();e.unstable_now=function(){return o.now()-i}}var a=[],c=[],h=1,m=null,v=3,g=!1,y=!1,j=!1,C=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function p(L){for(var O=n(c);O!==null;){if(O.callback===null)r(c);else if(O.startTime<=L)r(c),O.sortIndex=O.expirationTime,t(a,O);else break;O=n(c)}}function x(L){if(j=!1,p(L),!y)if(n(a)!==null)y=!0,F(E);else{var O=n(c);O!==null&&V(x,O.startTime-L)}}function E(L,O){y=!1,j&&(j=!1,f(P),P=-1),g=!0;var I=v;try{for(p(O),m=n(a);m!==null&&(!(m.expirationTime>O)||L&&!$());){var Y=m.callback;if(typeof Y=="function"){m.callback=null,v=m.priorityLevel;var ne=Y(m.expirationTime<=O);O=e.unstable_now(),typeof ne=="function"?m.callback=ne:m===n(a)&&r(a),p(O)}else r(a);m=n(a)}if(m!==null)var Sr=!0;else{var Pt=n(c);Pt!==null&&V(x,Pt.startTime-O),Sr=!1}return Sr}finally{m=null,v=I,g=!1}}var w=!1,S=null,P=-1,z=5,T=-1;function $(){return!(e.unstable_now()-TL||125Y?(L.sortIndex=I,t(c,L),n(a)===null&&L===n(c)&&(j?(f(P),P=-1):j=!0,V(x,I-Y))):(L.sortIndex=ne,t(a,L),y||g||(y=!0,F(E))),L},e.unstable_shouldYield=$,e.unstable_wrapCallback=function(L){var O=v;return function(){var I=v;v=O;try{return L.apply(this,arguments)}finally{v=I}}}})(Xa);Ga.exports=Xa;var Rd=Ga.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Td=k,Ce=Rd;function _(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ws=Object.prototype.hasOwnProperty,zd=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ki={},wi={};function Od(e){return ws.call(wi,e)?!0:ws.call(ki,e)?!1:zd.test(e)?wi[e]=!0:(ki[e]=!0,!1)}function Id(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Ud(e,t,n,r){if(t===null||typeof t>"u"||Id(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function ge(e,t,n,r,l,s,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=o}var ie={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ie[e]=new ge(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ie[t]=new ge(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ie[e]=new ge(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ie[e]=new ge(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ie[e]=new ge(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ie[e]=new ge(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ie[e]=new ge(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ie[e]=new ge(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ie[e]=new ge(e,5,!1,e.toLowerCase(),null,!1,!1)});var So=/[\-:]([a-z])/g;function jo(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(So,jo);ie[t]=new ge(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(So,jo);ie[t]=new ge(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(So,jo);ie[t]=new ge(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ie[e]=new ge(e,1,!1,e.toLowerCase(),null,!1,!1)});ie.xlinkHref=new ge("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ie[e]=new ge(e,1,!1,e.toLowerCase(),null,!0,!0)});function No(e,t,n,r){var l=ie.hasOwnProperty(t)?ie[t]:null;(l!==null?l.type!==0:r||!(2i||l[o]!==s[i]){var a=` -`+l[o].replace(" at new "," at ");return e.displayName&&a.includes("")&&(a=a.replace("",e.displayName)),a}while(1<=o&&0<=i);break}}}finally{Kl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Un(e):""}function Md(e){switch(e.tag){case 5:return Un(e.type);case 16:return Un("Lazy");case 13:return Un("Suspense");case 19:return Un("SuspenseList");case 0:case 2:case 15:return e=Gl(e.type,!1),e;case 11:return e=Gl(e.type.render,!1),e;case 1:return e=Gl(e.type,!0),e;default:return""}}function _s(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Xt:return"Fragment";case Gt:return"Portal";case Ss:return"Profiler";case _o:return"StrictMode";case js:return"Suspense";case Ns:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Za:return(e.displayName||"Context")+".Consumer";case Ja:return(e._context.displayName||"Context")+".Provider";case Eo:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Co:return t=e.displayName||null,t!==null?t:_s(e.type)||"Memo";case st:t=e._payload,e=e._init;try{return _s(e(t))}catch{}}return null}function $d(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return _s(t);case 8:return t===_o?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function wt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function eu(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Dd(e){var t=eu(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(o){r=""+o,s.call(this,o)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(o){r=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Er(e){e._valueTracker||(e._valueTracker=Dd(e))}function tu(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=eu(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function el(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Es(e,t){var n=t.checked;return G({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ji(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=wt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function nu(e,t){t=t.checked,t!=null&&No(e,"checked",t,!1)}function Cs(e,t){nu(e,t);var n=wt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ps(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ps(e,t.type,wt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Ni(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ps(e,t,n){(t!=="number"||el(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Mn=Array.isArray;function on(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Cr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Xn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Fn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Fd=["Webkit","ms","Moz","O"];Object.keys(Fn).forEach(function(e){Fd.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Fn[t]=Fn[e]})});function ou(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Fn.hasOwnProperty(e)&&Fn[e]?(""+t).trim():t+"px"}function iu(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=ou(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Bd=G({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ts(e,t){if(t){if(Bd[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(_(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(_(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(_(61))}if(t.style!=null&&typeof t.style!="object")throw Error(_(62))}}function zs(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Os=null;function Po(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Is=null,an=null,un=null;function Ci(e){if(e=vr(e)){if(typeof Is!="function")throw Error(_(280));var t=e.stateNode;t&&(t=Tl(t),Is(e.stateNode,e.type,t))}}function au(e){an?un?un.push(e):un=[e]:an=e}function uu(){if(an){var e=an,t=un;if(un=an=null,Ci(e),t)for(e=0;e>>=0,e===0?32:31-(Jd(e)/Zd|0)|0}var Pr=64,Lr=4194304;function $n(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ll(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,s=e.pingedLanes,o=n&268435455;if(o!==0){var i=o&~l;i!==0?r=$n(i):(s&=o,s!==0&&(r=$n(s)))}else o=n&~l,o!==0?r=$n(o):s!==0&&(r=$n(s));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,s=t&-t,l>=s||l===16&&(s&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function mr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Be(t),e[t]=n}function nf(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=An),Mi=" ",$i=!1;function Lu(e,t){switch(e){case"keyup":return Tf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ru(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Yt=!1;function Of(e,t){switch(e){case"compositionend":return Ru(t);case"keypress":return t.which!==32?null:($i=!0,Mi);case"textInput":return e=t.data,e===Mi&&$i?null:e;default:return null}}function If(e,t){if(Yt)return e==="compositionend"||!Mo&&Lu(e,t)?(e=Cu(),Hr=Oo=ut=null,Yt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ai(n)}}function Iu(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Iu(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Uu(){for(var e=window,t=el();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=el(e.document)}return t}function $o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Wf(e){var t=Uu(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Iu(n.ownerDocument.documentElement,n)){if(r!==null&&$o(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,s=Math.min(r.start,l);r=r.end===void 0?s:Math.min(r.end,l),!e.extend&&s>r&&(l=r,r=s,s=l),l=Vi(n,s);var o=Vi(n,r);l&&o&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),s>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Jt=null,Bs=null,Wn=null,As=!1;function Wi(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;As||Jt==null||Jt!==el(r)||(r=Jt,"selectionStart"in r&&$o(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Wn&&tr(Wn,r)||(Wn=r,r=il(Bs,"onSelect"),0en||(e.current=Ks[en],Ks[en]=null,en--)}function A(e,t){en++,Ks[en]=e.current,e.current=t}var St={},fe=Nt(St),ke=Nt(!1),$t=St;function mn(e,t){var n=e.type.contextTypes;if(!n)return St;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},s;for(s in n)l[s]=t[s];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function we(e){return e=e.childContextTypes,e!=null}function ul(){H(ke),H(fe)}function Yi(e,t,n){if(fe.current!==St)throw Error(_(168));A(fe,t),A(ke,n)}function Hu(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(_(108,$d(e)||"Unknown",l));return G({},n,r)}function cl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||St,$t=fe.current,A(fe,e),A(ke,ke.current),!0}function Ji(e,t,n){var r=e.stateNode;if(!r)throw Error(_(169));n?(e=Hu(e,t,$t),r.__reactInternalMemoizedMergedChildContext=e,H(ke),H(fe),A(fe,e)):H(ke),A(ke,n)}var Xe=null,zl=!1,as=!1;function bu(e){Xe===null?Xe=[e]:Xe.push(e)}function tp(e){zl=!0,bu(e)}function _t(){if(!as&&Xe!==null){as=!0;var e=0,t=B;try{var n=Xe;for(B=1;e>=o,l-=o,Ye=1<<32-Be(t)+l|n<P?(z=S,S=null):z=S.sibling;var T=v(f,S,p[P],x);if(T===null){S===null&&(S=z);break}e&&S&&T.alternate===null&&t(f,S),d=s(T,d,P),w===null?E=T:w.sibling=T,w=T,S=z}if(P===p.length)return n(f,S),b&&Rt(f,P),E;if(S===null){for(;PP?(z=S,S=null):z=S.sibling;var $=v(f,S,T.value,x);if($===null){S===null&&(S=z);break}e&&S&&$.alternate===null&&t(f,S),d=s($,d,P),w===null?E=$:w.sibling=$,w=$,S=z}if(T.done)return n(f,S),b&&Rt(f,P),E;if(S===null){for(;!T.done;P++,T=p.next())T=m(f,T.value,x),T!==null&&(d=s(T,d,P),w===null?E=T:w.sibling=T,w=T);return b&&Rt(f,P),E}for(S=r(f,S);!T.done;P++,T=p.next())T=g(S,f,P,T.value,x),T!==null&&(e&&T.alternate!==null&&S.delete(T.key===null?P:T.key),d=s(T,d,P),w===null?E=T:w.sibling=T,w=T);return e&&S.forEach(function(Et){return t(f,Et)}),b&&Rt(f,P),E}function C(f,d,p,x){if(typeof p=="object"&&p!==null&&p.type===Xt&&p.key===null&&(p=p.props.children),typeof p=="object"&&p!==null){switch(p.$$typeof){case _r:e:{for(var E=p.key,w=d;w!==null;){if(w.key===E){if(E=p.type,E===Xt){if(w.tag===7){n(f,w.sibling),d=l(w,p.props.children),d.return=f,f=d;break e}}else if(w.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===st&&ea(E)===w.type){n(f,w.sibling),d=l(w,p.props),d.ref=Rn(f,w,p),d.return=f,f=d;break e}n(f,w);break}else t(f,w);w=w.sibling}p.type===Xt?(d=Mt(p.props.children,f.mode,x,p.key),d.return=f,f=d):(x=Zr(p.type,p.key,p.props,null,f.mode,x),x.ref=Rn(f,d,p),x.return=f,f=x)}return o(f);case Gt:e:{for(w=p.key;d!==null;){if(d.key===w)if(d.tag===4&&d.stateNode.containerInfo===p.containerInfo&&d.stateNode.implementation===p.implementation){n(f,d.sibling),d=l(d,p.children||[]),d.return=f,f=d;break e}else{n(f,d);break}else t(f,d);d=d.sibling}d=vs(p,f.mode,x),d.return=f,f=d}return o(f);case st:return w=p._init,C(f,d,w(p._payload),x)}if(Mn(p))return y(f,d,p,x);if(_n(p))return j(f,d,p,x);Mr(f,p)}return typeof p=="string"&&p!==""||typeof p=="number"?(p=""+p,d!==null&&d.tag===6?(n(f,d.sibling),d=l(d,p),d.return=f,f=d):(n(f,d),d=hs(p,f.mode,x),d.return=f,f=d),o(f)):n(f,d)}return C}var vn=Xu(!0),Yu=Xu(!1),pl=Nt(null),ml=null,rn=null,Ao=null;function Vo(){Ao=rn=ml=null}function Wo(e){var t=pl.current;H(pl),e._currentValue=t}function Ys(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function dn(e,t){ml=e,Ao=rn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ye=!0),e.firstContext=null)}function Ie(e){var t=e._currentValue;if(Ao!==e)if(e={context:e,memoizedValue:t,next:null},rn===null){if(ml===null)throw Error(_(308));rn=e,ml.dependencies={lanes:0,firstContext:e}}else rn=rn.next=e;return t}var Ot=null;function Ho(e){Ot===null?Ot=[e]:Ot.push(e)}function Ju(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Ho(t)):(n.next=l.next,l.next=n),t.interleaved=n,tt(e,r)}function tt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var ot=!1;function bo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Zu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ze(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function vt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,D&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,tt(e,n)}return l=r.interleaved,l===null?(t.next=t,Ho(r)):(t.next=l.next,l.next=t),r.interleaved=t,tt(e,n)}function Qr(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ro(e,n)}}function ta(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,s=null;if(n=n.firstBaseUpdate,n!==null){do{var o={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};s===null?l=s=o:s=s.next=o,n=n.next}while(n!==null);s===null?l=s=t:s=s.next=t}else l=s=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:s,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function hl(e,t,n,r){var l=e.updateQueue;ot=!1;var s=l.firstBaseUpdate,o=l.lastBaseUpdate,i=l.shared.pending;if(i!==null){l.shared.pending=null;var a=i,c=a.next;a.next=null,o===null?s=c:o.next=c,o=a;var h=e.alternate;h!==null&&(h=h.updateQueue,i=h.lastBaseUpdate,i!==o&&(i===null?h.firstBaseUpdate=c:i.next=c,h.lastBaseUpdate=a))}if(s!==null){var m=l.baseState;o=0,h=c=a=null,i=s;do{var v=i.lane,g=i.eventTime;if((r&v)===v){h!==null&&(h=h.next={eventTime:g,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var y=e,j=i;switch(v=t,g=n,j.tag){case 1:if(y=j.payload,typeof y=="function"){m=y.call(g,m,v);break e}m=y;break e;case 3:y.flags=y.flags&-65537|128;case 0:if(y=j.payload,v=typeof y=="function"?y.call(g,m,v):y,v==null)break e;m=G({},m,v);break e;case 2:ot=!0}}i.callback!==null&&i.lane!==0&&(e.flags|=64,v=l.effects,v===null?l.effects=[i]:v.push(i))}else g={eventTime:g,lane:v,tag:i.tag,payload:i.payload,callback:i.callback,next:null},h===null?(c=h=g,a=m):h=h.next=g,o|=v;if(i=i.next,i===null){if(i=l.shared.pending,i===null)break;v=i,i=v.next,v.next=null,l.lastBaseUpdate=v,l.shared.pending=null}}while(!0);if(h===null&&(a=m),l.baseState=a,l.firstBaseUpdate=c,l.lastBaseUpdate=h,t=l.shared.interleaved,t!==null){l=t;do o|=l.lane,l=l.next;while(l!==t)}else s===null&&(l.shared.lanes=0);Bt|=o,e.lanes=o,e.memoizedState=m}}function na(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=cs.transition;cs.transition={};try{e(!1),t()}finally{B=n,cs.transition=r}}function hc(){return Ue().memoizedState}function sp(e,t,n){var r=xt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},vc(e))gc(t,n);else if(n=Ju(e,t,n,r),n!==null){var l=he();Ae(n,e,r,l),xc(n,t,r)}}function op(e,t,n){var r=xt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(vc(e))gc(t,l);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var o=t.lastRenderedState,i=s(o,n);if(l.hasEagerState=!0,l.eagerState=i,Ve(i,o)){var a=t.interleaved;a===null?(l.next=l,Ho(t)):(l.next=a.next,a.next=l),t.interleaved=l;return}}catch{}finally{}n=Ju(e,t,l,r),n!==null&&(l=he(),Ae(n,e,r,l),xc(n,t,r))}}function vc(e){var t=e.alternate;return e===K||t!==null&&t===K}function gc(e,t){Hn=gl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function xc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ro(e,n)}}var xl={readContext:Ie,useCallback:ae,useContext:ae,useEffect:ae,useImperativeHandle:ae,useInsertionEffect:ae,useLayoutEffect:ae,useMemo:ae,useReducer:ae,useRef:ae,useState:ae,useDebugValue:ae,useDeferredValue:ae,useTransition:ae,useMutableSource:ae,useSyncExternalStore:ae,useId:ae,unstable_isNewReconciler:!1},ip={readContext:Ie,useCallback:function(e,t){return He().memoizedState=[e,t===void 0?null:t],e},useContext:Ie,useEffect:la,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Gr(4194308,4,cc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Gr(4194308,4,e,t)},useInsertionEffect:function(e,t){return Gr(4,2,e,t)},useMemo:function(e,t){var n=He();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=He();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=sp.bind(null,K,e),[r.memoizedState,e]},useRef:function(e){var t=He();return e={current:e},t.memoizedState=e},useState:ra,useDebugValue:qo,useDeferredValue:function(e){return He().memoizedState=e},useTransition:function(){var e=ra(!1),t=e[0];return e=lp.bind(null,e[1]),He().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=K,l=He();if(b){if(n===void 0)throw Error(_(407));n=n()}else{if(n=t(),le===null)throw Error(_(349));Ft&30||nc(r,t,n)}l.memoizedState=n;var s={value:n,getSnapshot:t};return l.queue=s,la(lc.bind(null,r,s,e),[e]),r.flags|=2048,ur(9,rc.bind(null,r,s,n,t),void 0,null),n},useId:function(){var e=He(),t=le.identifierPrefix;if(b){var n=Je,r=Ye;n=(r&~(1<<32-Be(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ir++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=o.createElement(n,{is:r.is}):(e=o.createElement(n),n==="select"&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,n),e[be]=t,e[lr]=r,Pc(e,t,!1,!1),t.stateNode=e;e:{switch(o=zs(n,r),n){case"dialog":W("cancel",e),W("close",e),l=r;break;case"iframe":case"object":case"embed":W("load",e),l=r;break;case"video":case"audio":for(l=0;lyn&&(t.flags|=128,r=!0,Tn(s,!1),t.lanes=4194304)}else{if(!r)if(e=vl(o),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Tn(s,!0),s.tail===null&&s.tailMode==="hidden"&&!o.alternate&&!b)return ue(t),null}else 2*J()-s.renderingStartTime>yn&&n!==1073741824&&(t.flags|=128,r=!0,Tn(s,!1),t.lanes=4194304);s.isBackwards?(o.sibling=t.child,t.child=o):(n=s.last,n!==null?n.sibling=o:t.child=o,s.last=o)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=J(),t.sibling=null,n=Q.current,A(Q,r?n&1|2:n&1),t):(ue(t),null);case 22:case 23:return si(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?je&1073741824&&(ue(t),t.subtreeFlags&6&&(t.flags|=8192)):ue(t),null;case 24:return null;case 25:return null}throw Error(_(156,t.tag))}function hp(e,t){switch(Fo(t),t.tag){case 1:return we(t.type)&&ul(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return gn(),H(ke),H(fe),Go(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Ko(t),null;case 13:if(H(Q),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(_(340));hn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return H(Q),null;case 4:return gn(),null;case 10:return Wo(t.type._context),null;case 22:case 23:return si(),null;case 24:return null;default:return null}}var Dr=!1,ce=!1,vp=typeof WeakSet=="function"?WeakSet:Set,R=null;function ln(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){X(e,t,r)}else n.current=null}function so(e,t,n){try{n()}catch(r){X(e,t,r)}}var ha=!1;function gp(e,t){if(Vs=sl,e=Uu(),$o(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,s=r.focusNode;r=r.focusOffset;try{n.nodeType,s.nodeType}catch{n=null;break e}var o=0,i=-1,a=-1,c=0,h=0,m=e,v=null;t:for(;;){for(var g;m!==n||l!==0&&m.nodeType!==3||(i=o+l),m!==s||r!==0&&m.nodeType!==3||(a=o+r),m.nodeType===3&&(o+=m.nodeValue.length),(g=m.firstChild)!==null;)v=m,m=g;for(;;){if(m===e)break t;if(v===n&&++c===l&&(i=o),v===s&&++h===r&&(a=o),(g=m.nextSibling)!==null)break;m=v,v=m.parentNode}m=g}n=i===-1||a===-1?null:{start:i,end:a}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ws={focusedElem:e,selectionRange:n},sl=!1,R=t;R!==null;)if(t=R,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,R=e;else for(;R!==null;){t=R;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var j=y.memoizedProps,C=y.memoizedState,f=t.stateNode,d=f.getSnapshotBeforeUpdate(t.elementType===t.type?j:$e(t.type,j),C);f.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var p=t.stateNode.containerInfo;p.nodeType===1?p.textContent="":p.nodeType===9&&p.documentElement&&p.removeChild(p.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(_(163))}}catch(x){X(t,t.return,x)}if(e=t.sibling,e!==null){e.return=t.return,R=e;break}R=t.return}return y=ha,ha=!1,y}function bn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var s=l.destroy;l.destroy=void 0,s!==void 0&&so(t,n,s)}l=l.next}while(l!==r)}}function Ul(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function oo(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Tc(e){var t=e.alternate;t!==null&&(e.alternate=null,Tc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[be],delete t[lr],delete t[Qs],delete t[qf],delete t[ep])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function zc(e){return e.tag===5||e.tag===3||e.tag===4}function va(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||zc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function io(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=al));else if(r!==4&&(e=e.child,e!==null))for(io(e,t,n),e=e.sibling;e!==null;)io(e,t,n),e=e.sibling}function ao(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ao(e,t,n),e=e.sibling;e!==null;)ao(e,t,n),e=e.sibling}var se=null,De=!1;function lt(e,t,n){for(n=n.child;n!==null;)Oc(e,t,n),n=n.sibling}function Oc(e,t,n){if(Qe&&typeof Qe.onCommitFiberUnmount=="function")try{Qe.onCommitFiberUnmount(Cl,n)}catch{}switch(n.tag){case 5:ce||ln(n,t);case 6:var r=se,l=De;se=null,lt(e,t,n),se=r,De=l,se!==null&&(De?(e=se,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):se.removeChild(n.stateNode));break;case 18:se!==null&&(De?(e=se,n=n.stateNode,e.nodeType===8?is(e.parentNode,n):e.nodeType===1&&is(e,n),qn(e)):is(se,n.stateNode));break;case 4:r=se,l=De,se=n.stateNode.containerInfo,De=!0,lt(e,t,n),se=r,De=l;break;case 0:case 11:case 14:case 15:if(!ce&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var s=l,o=s.destroy;s=s.tag,o!==void 0&&(s&2||s&4)&&so(n,t,o),l=l.next}while(l!==r)}lt(e,t,n);break;case 1:if(!ce&&(ln(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(i){X(n,t,i)}lt(e,t,n);break;case 21:lt(e,t,n);break;case 22:n.mode&1?(ce=(r=ce)||n.memoizedState!==null,lt(e,t,n),ce=r):lt(e,t,n);break;default:lt(e,t,n)}}function ga(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new vp),t.forEach(function(r){var l=Ep.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Me(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=o),r&=~s}if(r=l,r=J()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*yp(r/1960))-r,10e?16:e,ct===null)var r=!1;else{if(e=ct,ct=null,wl=0,D&6)throw Error(_(331));var l=D;for(D|=4,R=e.current;R!==null;){var s=R,o=s.child;if(R.flags&16){var i=s.deletions;if(i!==null){for(var a=0;aJ()-ri?Ut(e,0):ni|=n),Se(e,t)}function Ac(e,t){t===0&&(e.mode&1?(t=Lr,Lr<<=1,!(Lr&130023424)&&(Lr=4194304)):t=1);var n=he();e=tt(e,t),e!==null&&(mr(e,t,n),Se(e,n))}function _p(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Ac(e,n)}function Ep(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(_(314))}r!==null&&r.delete(t),Ac(e,n)}var Vc;Vc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ke.current)ye=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ye=!1,pp(e,t,n);ye=!!(e.flags&131072)}else ye=!1,b&&t.flags&1048576&&Qu(t,fl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Xr(e,t),e=t.pendingProps;var l=mn(t,fe.current);dn(t,n),l=Yo(null,t,r,e,l,n);var s=Jo();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,we(r)?(s=!0,cl(t)):s=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,bo(t),l.updater=Il,t.stateNode=l,l._reactInternals=t,Zs(t,r,e,n),t=to(null,t,r,!0,s,n)):(t.tag=0,b&&s&&Do(t),pe(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Xr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Pp(r),e=$e(r,e),l){case 0:t=eo(null,t,r,e,n);break e;case 1:t=fa(null,t,r,e,n);break e;case 11:t=ca(null,t,r,e,n);break e;case 14:t=da(null,t,r,$e(r.type,e),n);break e}throw Error(_(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),eo(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),fa(e,t,r,l,n);case 3:e:{if(_c(t),e===null)throw Error(_(387));r=t.pendingProps,s=t.memoizedState,l=s.element,Zu(e,t),hl(t,r,null,n);var o=t.memoizedState;if(r=o.element,s.isDehydrated)if(s={element:r,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){l=xn(Error(_(423)),t),t=pa(e,t,r,n,l);break e}else if(r!==l){l=xn(Error(_(424)),t),t=pa(e,t,r,n,l);break e}else for(_e=ht(t.stateNode.containerInfo.firstChild),Ee=t,b=!0,Fe=null,n=Yu(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(hn(),r===l){t=nt(e,t,n);break e}pe(e,t,r,n)}t=t.child}return t;case 5:return qu(t),e===null&&Xs(t),r=t.type,l=t.pendingProps,s=e!==null?e.memoizedProps:null,o=l.children,Hs(r,l)?o=null:s!==null&&Hs(r,s)&&(t.flags|=32),Nc(e,t),pe(e,t,o,n),t.child;case 6:return e===null&&Xs(t),null;case 13:return Ec(e,t,n);case 4:return Qo(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=vn(t,null,r,n):pe(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),ca(e,t,r,l,n);case 7:return pe(e,t,t.pendingProps,n),t.child;case 8:return pe(e,t,t.pendingProps.children,n),t.child;case 12:return pe(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,s=t.memoizedProps,o=l.value,A(pl,r._currentValue),r._currentValue=o,s!==null)if(Ve(s.value,o)){if(s.children===l.children&&!ke.current){t=nt(e,t,n);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var i=s.dependencies;if(i!==null){o=s.child;for(var a=i.firstContext;a!==null;){if(a.context===r){if(s.tag===1){a=Ze(-1,n&-n),a.tag=2;var c=s.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?a.next=a:(a.next=h.next,h.next=a),c.pending=a}}s.lanes|=n,a=s.alternate,a!==null&&(a.lanes|=n),Ys(s.return,n,t),i.lanes|=n;break}a=a.next}}else if(s.tag===10)o=s.type===t.type?null:s.child;else if(s.tag===18){if(o=s.return,o===null)throw Error(_(341));o.lanes|=n,i=o.alternate,i!==null&&(i.lanes|=n),Ys(o,n,t),o=s.sibling}else o=s.child;if(o!==null)o.return=s;else for(o=s;o!==null;){if(o===t){o=null;break}if(s=o.sibling,s!==null){s.return=o.return,o=s;break}o=o.return}s=o}pe(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,dn(t,n),l=Ie(l),r=r(l),t.flags|=1,pe(e,t,r,n),t.child;case 14:return r=t.type,l=$e(r,t.pendingProps),l=$e(r.type,l),da(e,t,r,l,n);case 15:return Sc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),Xr(e,t),t.tag=1,we(r)?(e=!0,cl(t)):e=!1,dn(t,n),yc(t,r,l),Zs(t,r,l,n),to(null,t,r,!0,e,n);case 19:return Cc(e,t,n);case 22:return jc(e,t,n)}throw Error(_(156,t.tag))};function Wc(e,t){return vu(e,t)}function Cp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ze(e,t,n,r){return new Cp(e,t,n,r)}function ii(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Pp(e){if(typeof e=="function")return ii(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Eo)return 11;if(e===Co)return 14}return 2}function yt(e,t){var n=e.alternate;return n===null?(n=ze(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Zr(e,t,n,r,l,s){var o=2;if(r=e,typeof e=="function")ii(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Xt:return Mt(n.children,l,s,t);case _o:o=8,l|=8;break;case Ss:return e=ze(12,n,t,l|2),e.elementType=Ss,e.lanes=s,e;case js:return e=ze(13,n,t,l),e.elementType=js,e.lanes=s,e;case Ns:return e=ze(19,n,t,l),e.elementType=Ns,e.lanes=s,e;case qa:return $l(n,l,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ja:o=10;break e;case Za:o=9;break e;case Eo:o=11;break e;case Co:o=14;break e;case st:o=16,r=null;break e}throw Error(_(130,e==null?e:typeof e,""))}return t=ze(o,n,t,l),t.elementType=e,t.type=r,t.lanes=s,t}function Mt(e,t,n,r){return e=ze(7,e,r,t),e.lanes=n,e}function $l(e,t,n,r){return e=ze(22,e,r,t),e.elementType=qa,e.lanes=n,e.stateNode={isHidden:!1},e}function hs(e,t,n){return e=ze(6,e,null,t),e.lanes=n,e}function vs(e,t,n){return t=ze(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Lp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Yl(0),this.expirationTimes=Yl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Yl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function ai(e,t,n,r,l,s,o,i,a){return e=new Lp(e,t,n,i,a),t===1?(t=1,s===!0&&(t|=8)):t=0,s=ze(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},bo(s),e}function Rp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Kc)}catch(e){console.error(e)}}Kc(),Ka.exports=Pe;var Up=Ka.exports,_a=Up;ks.createRoot=_a.createRoot,ks.hydrateRoot=_a.hydrateRoot;/** - * @remix-run/router v1.23.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function dr(){return dr=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function fi(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function $p(){return Math.random().toString(36).substr(2,8)}function Ca(e,t){return{usr:e.state,key:e.key,idx:t}}function mo(e,t,n,r){return n===void 0&&(n=null),dr({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Nn(t):t,{state:n,key:t&&t.key||r||$p()})}function Nl(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Nn(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function Dp(e,t,n,r){r===void 0&&(r={});let{window:l=document.defaultView,v5Compat:s=!1}=r,o=l.history,i=dt.Pop,a=null,c=h();c==null&&(c=0,o.replaceState(dr({},o.state,{idx:c}),""));function h(){return(o.state||{idx:null}).idx}function m(){i=dt.Pop;let C=h(),f=C==null?null:C-c;c=C,a&&a({action:i,location:j.location,delta:f})}function v(C,f){i=dt.Push;let d=mo(j.location,C,f);c=h()+1;let p=Ca(d,c),x=j.createHref(d);try{o.pushState(p,"",x)}catch(E){if(E instanceof DOMException&&E.name==="DataCloneError")throw E;l.location.assign(x)}s&&a&&a({action:i,location:j.location,delta:1})}function g(C,f){i=dt.Replace;let d=mo(j.location,C,f);c=h();let p=Ca(d,c),x=j.createHref(d);o.replaceState(p,"",x),s&&a&&a({action:i,location:j.location,delta:0})}function y(C){let f=l.location.origin!=="null"?l.location.origin:l.location.href,d=typeof C=="string"?C:Nl(C);return d=d.replace(/ $/,"%20"),q(f,"No window.location.(origin|href) available to create URL for href: "+d),new URL(d,f)}let j={get action(){return i},get location(){return e(l,o)},listen(C){if(a)throw new Error("A history only accepts one active listener");return l.addEventListener(Ea,m),a=C,()=>{l.removeEventListener(Ea,m),a=null}},createHref(C){return t(l,C)},createURL:y,encodeLocation(C){let f=y(C);return{pathname:f.pathname,search:f.search,hash:f.hash}},push:v,replace:g,go(C){return o.go(C)}};return j}var Pa;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Pa||(Pa={}));function Fp(e,t,n){return n===void 0&&(n="/"),Bp(e,t,n)}function Bp(e,t,n,r){let l=typeof t=="string"?Nn(t):t,s=pi(l.pathname||"/",n);if(s==null)return null;let o=Gc(e);Ap(o);let i=null;for(let a=0;i==null&&a{let a={relativePath:i===void 0?s.path||"":i,caseSensitive:s.caseSensitive===!0,childrenIndex:o,route:s};a.relativePath.startsWith("/")&&(q(a.relativePath.startsWith(r),'Absolute route path "'+a.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),a.relativePath=a.relativePath.slice(r.length));let c=kt([r,a.relativePath]),h=n.concat(a);s.children&&s.children.length>0&&(q(s.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),Gc(s.children,t,h,c)),!(s.path==null&&!s.index)&&t.push({path:c,score:Gp(c,s.index),routesMeta:h})};return e.forEach((s,o)=>{var i;if(s.path===""||!((i=s.path)!=null&&i.includes("?")))l(s,o);else for(let a of Xc(s.path))l(s,o,a)}),t}function Xc(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,l=n.endsWith("?"),s=n.replace(/\?$/,"");if(r.length===0)return l?[s,""]:[s];let o=Xc(r.join("/")),i=[];return i.push(...o.map(a=>a===""?s:[s,a].join("/"))),l&&i.push(...o),i.map(a=>e.startsWith("/")&&a===""?"/":a)}function Ap(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:Xp(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const Vp=/^:[\w-]+$/,Wp=3,Hp=2,bp=1,Qp=10,Kp=-2,La=e=>e==="*";function Gp(e,t){let n=e.split("/"),r=n.length;return n.some(La)&&(r+=Kp),t&&(r+=Hp),n.filter(l=>!La(l)).reduce((l,s)=>l+(Vp.test(s)?Wp:s===""?bp:Qp),r)}function Xp(e,t){return e.length===t.length&&e.slice(0,-1).every((r,l)=>r===t[l])?e[e.length-1]-t[t.length-1]:0}function Yp(e,t,n){let{routesMeta:r}=e,l={},s="/",o=[];for(let i=0;i{let{paramName:v,isOptional:g}=h;if(v==="*"){let j=i[m]||"";o=s.slice(0,s.length-j.length).replace(/(.)\/+$/,"$1")}const y=i[m];return g&&!y?c[v]=void 0:c[v]=(y||"").replace(/%2F/g,"/"),c},{}),pathname:s,pathnameBase:o,pattern:e}}function Zp(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),fi(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,i,a)=>(r.push({paramName:i,isOptional:a!=null}),a?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),r]}function qp(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return fi(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function pi(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}const em=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,tm=e=>em.test(e);function nm(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:l=""}=typeof e=="string"?Nn(e):e,s;if(n)if(tm(n))s=n;else{if(n.includes("//")){let o=n;n=n.replace(/\/\/+/g,"/"),fi(!1,"Pathnames cannot have embedded double slashes - normalizing "+(o+" -> "+n))}n.startsWith("/")?s=Ra(n.substring(1),"/"):s=Ra(n,t)}else s=t;return{pathname:s,search:sm(r),hash:om(l)}}function Ra(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?n.length>1&&n.pop():l!=="."&&n.push(l)}),n.length>1?n.join("/"):"/"}function gs(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function rm(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function Yc(e,t){let n=rm(e);return t?n.map((r,l)=>l===n.length-1?r.pathname:r.pathnameBase):n.map(r=>r.pathnameBase)}function Jc(e,t,n,r){r===void 0&&(r=!1);let l;typeof e=="string"?l=Nn(e):(l=dr({},e),q(!l.pathname||!l.pathname.includes("?"),gs("?","pathname","search",l)),q(!l.pathname||!l.pathname.includes("#"),gs("#","pathname","hash",l)),q(!l.search||!l.search.includes("#"),gs("#","search","hash",l)));let s=e===""||l.pathname==="",o=s?"/":l.pathname,i;if(o==null)i=n;else{let m=t.length-1;if(!r&&o.startsWith("..")){let v=o.split("/");for(;v[0]==="..";)v.shift(),m-=1;l.pathname=v.join("/")}i=m>=0?t[m]:"/"}let a=nm(l,i),c=o&&o!=="/"&&o.endsWith("/"),h=(s||o===".")&&n.endsWith("/");return!a.pathname.endsWith("/")&&(c||h)&&(a.pathname+="/"),a}const kt=e=>e.join("/").replace(/\/\/+/g,"/"),lm=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),sm=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,om=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function im(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Zc=["post","put","patch","delete"];new Set(Zc);const am=["get",...Zc];new Set(am);/** - * React Router v6.30.3 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function fr(){return fr=Object.assign?Object.assign.bind():function(e){for(var t=1;t{i.current=!0}),k.useCallback(function(c,h){if(h===void 0&&(h={}),!i.current)return;if(typeof c=="number"){r.go(c);return}let m=Jc(c,JSON.parse(o),s,h.relative==="path");e==null&&t!=="/"&&(m.pathname=m.pathname==="/"?t:kt([t,m.pathname])),(h.replace?r.replace:r.push)(m,h.state,h)},[t,r,o,s,e])}function td(e,t){let{relative:n}=t===void 0?{}:t,{future:r}=k.useContext(bt),{matches:l}=k.useContext(Qt),{pathname:s}=yr(),o=JSON.stringify(Yc(l,r.v7_relativeSplatPath));return k.useMemo(()=>Jc(e,JSON.parse(o),s,n==="path"),[e,o,s,n])}function fm(e,t){return pm(e,t)}function pm(e,t,n,r){xr()||q(!1);let{navigator:l}=k.useContext(bt),{matches:s}=k.useContext(Qt),o=s[s.length-1],i=o?o.params:{};o&&o.pathname;let a=o?o.pathnameBase:"/";o&&o.route;let c=yr(),h;if(t){var m;let C=typeof t=="string"?Nn(t):t;a==="/"||(m=C.pathname)!=null&&m.startsWith(a)||q(!1),h=C}else h=c;let v=h.pathname||"/",g=v;if(a!=="/"){let C=a.replace(/^\//,"").split("/");g="/"+v.replace(/^\//,"").split("/").slice(C.length).join("/")}let y=Fp(e,{pathname:g}),j=xm(y&&y.map(C=>Object.assign({},C,{params:Object.assign({},i,C.params),pathname:kt([a,l.encodeLocation?l.encodeLocation(C.pathname).pathname:C.pathname]),pathnameBase:C.pathnameBase==="/"?a:kt([a,l.encodeLocation?l.encodeLocation(C.pathnameBase).pathname:C.pathnameBase])})),s,n,r);return t&&j?k.createElement(Vl.Provider,{value:{location:fr({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:dt.Pop}},j):j}function mm(){let e=Sm(),t=im(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return k.createElement(k.Fragment,null,k.createElement("h2",null,"Unexpected Application Error!"),k.createElement("h3",{style:{fontStyle:"italic"}},t),n?k.createElement("pre",{style:l},n):null,null)}const hm=k.createElement(mm,null);class vm extends k.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error!==void 0?k.createElement(Qt.Provider,{value:this.props.routeContext},k.createElement(qc.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function gm(e){let{routeContext:t,match:n,children:r}=e,l=k.useContext(mi);return l&&l.static&&l.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=n.route.id),k.createElement(Qt.Provider,{value:t},r)}function xm(e,t,n,r){var l;if(t===void 0&&(t=[]),n===void 0&&(n=null),r===void 0&&(r=null),e==null){var s;if(!n)return null;if(n.errors)e=n.matches;else if((s=r)!=null&&s.v7_partialHydration&&t.length===0&&!n.initialized&&n.matches.length>0)e=n.matches;else return null}let o=e,i=(l=n)==null?void 0:l.errors;if(i!=null){let h=o.findIndex(m=>m.route.id&&(i==null?void 0:i[m.route.id])!==void 0);h>=0||q(!1),o=o.slice(0,Math.min(o.length,h+1))}let a=!1,c=-1;if(n&&r&&r.v7_partialHydration)for(let h=0;h=0?o=o.slice(0,c+1):o=[o[0]];break}}}return o.reduceRight((h,m,v)=>{let g,y=!1,j=null,C=null;n&&(g=i&&m.route.id?i[m.route.id]:void 0,j=m.route.errorElement||hm,a&&(c<0&&v===0?(Nm("route-fallback"),y=!0,C=null):c===v&&(y=!0,C=m.route.hydrateFallbackElement||null)));let f=t.concat(o.slice(0,v+1)),d=()=>{let p;return g?p=j:y?p=C:m.route.Component?p=k.createElement(m.route.Component,null):m.route.element?p=m.route.element:p=h,k.createElement(gm,{match:m,routeContext:{outlet:h,matches:f,isDataRoute:n!=null},children:p})};return n&&(m.route.ErrorBoundary||m.route.errorElement||v===0)?k.createElement(vm,{location:n.location,revalidation:n.revalidation,component:j,error:g,children:d(),routeContext:{outlet:null,matches:f,isDataRoute:!0}}):d()},null)}var nd=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(nd||{}),rd=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(rd||{});function ym(e){let t=k.useContext(mi);return t||q(!1),t}function km(e){let t=k.useContext(um);return t||q(!1),t}function wm(e){let t=k.useContext(Qt);return t||q(!1),t}function ld(e){let t=wm(),n=t.matches[t.matches.length-1];return n.route.id||q(!1),n.route.id}function Sm(){var e;let t=k.useContext(qc),n=km(),r=ld();return t!==void 0?t:(e=n.errors)==null?void 0:e[r]}function jm(){let{router:e}=ym(nd.UseNavigateStable),t=ld(rd.UseNavigateStable),n=k.useRef(!1);return ed(()=>{n.current=!0}),k.useCallback(function(l,s){s===void 0&&(s={}),n.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,fr({fromRouteId:t},s)))},[e,t])}const Ta={};function Nm(e,t,n){Ta[e]||(Ta[e]=!0)}function _m(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function qr(e){q(!1)}function Em(e){let{basename:t="/",children:n=null,location:r,navigationType:l=dt.Pop,navigator:s,static:o=!1,future:i}=e;xr()&&q(!1);let a=t.replace(/^\/*/,"/"),c=k.useMemo(()=>({basename:a,navigator:s,static:o,future:fr({v7_relativeSplatPath:!1},i)}),[a,i,s,o]);typeof r=="string"&&(r=Nn(r));let{pathname:h="/",search:m="",hash:v="",state:g=null,key:y="default"}=r,j=k.useMemo(()=>{let C=pi(h,a);return C==null?null:{location:{pathname:C,search:m,hash:v,state:g,key:y},navigationType:l}},[a,h,m,v,g,y,l]);return j==null?null:k.createElement(bt.Provider,{value:c},k.createElement(Vl.Provider,{children:n,value:j}))}function Cm(e){let{children:t,location:n}=e;return fm(ho(t),n)}new Promise(()=>{});function ho(e,t){t===void 0&&(t=[]);let n=[];return k.Children.forEach(e,(r,l)=>{if(!k.isValidElement(r))return;let s=[...t,l];if(r.type===k.Fragment){n.push.apply(n,ho(r.props.children,s));return}r.type!==qr&&q(!1),!r.props.index||!r.props.children||q(!1);let o={id:r.props.id||s.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=ho(r.props.children,s)),n.push(o)}),n}/** - * React Router DOM v6.30.3 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function vo(){return vo=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[l]=e[l]);return n}function Lm(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Rm(e,t){return e.button===0&&(!t||t==="_self")&&!Lm(e)}function go(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(l=>[n,l]):[[n,r]])},[]))}function Tm(e,t){let n=go(e);return t&&t.forEach((r,l)=>{n.has(l)||t.getAll(l).forEach(s=>{n.append(l,s)})}),n}const zm=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],Om="6";try{window.__reactRouterVersion=Om}catch{}const Im="startTransition",za=jd[Im];function Um(e){let{basename:t,children:n,future:r,window:l}=e,s=k.useRef();s.current==null&&(s.current=Mp({window:l,v5Compat:!0}));let o=s.current,[i,a]=k.useState({action:o.action,location:o.location}),{v7_startTransition:c}=r||{},h=k.useCallback(m=>{c&&za?za(()=>a(m)):a(m)},[a,c]);return k.useLayoutEffect(()=>o.listen(h),[o,h]),k.useEffect(()=>_m(r),[r]),k.createElement(Em,{basename:t,children:n,location:i.location,navigationType:i.action,navigator:o,future:r})}const Mm=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",$m=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Oa=k.forwardRef(function(t,n){let{onClick:r,relative:l,reloadDocument:s,replace:o,state:i,target:a,to:c,preventScrollReset:h,viewTransition:m}=t,v=Pm(t,zm),{basename:g}=k.useContext(bt),y,j=!1;if(typeof c=="string"&&$m.test(c)&&(y=c,Mm))try{let p=new URL(window.location.href),x=c.startsWith("//")?new URL(p.protocol+c):new URL(c),E=pi(x.pathname,g);x.origin===p.origin&&E!=null?c=E+x.search+x.hash:j=!0}catch{}let C=cm(c,{relative:l}),f=Dm(c,{replace:o,state:i,target:a,preventScrollReset:h,relative:l,viewTransition:m});function d(p){r&&r(p),p.defaultPrevented||f(p)}return k.createElement("a",vo({},v,{href:y||C,onClick:j||s?r:d,ref:n,target:a}))});var Ia;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Ia||(Ia={}));var Ua;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ua||(Ua={}));function Dm(e,t){let{target:n,replace:r,state:l,preventScrollReset:s,relative:o,viewTransition:i}=t===void 0?{}:t,a=kr(),c=yr(),h=td(e,{relative:o});return k.useCallback(m=>{if(Rm(m,n)){m.preventDefault();let v=r!==void 0?r:Nl(c)===Nl(h);a(e,{replace:v,state:l,preventScrollReset:s,relative:o,viewTransition:i})}},[c,a,h,r,l,n,e,s,o,i])}function hi(e){let t=k.useRef(go(e)),n=k.useRef(!1),r=yr(),l=k.useMemo(()=>Tm(r.search,n.current?null:t.current),[r.search]),s=kr(),o=k.useCallback((i,a)=>{const c=go(typeof i=="function"?i(l):i);n.current=!0,s("?"+c,a)},[s,l]);return[l,o]}const me="transition active:brightness-95 active:scale-[0.99] focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-400/60 dark:focus-visible:ring-slate-500/50",wr="rounded-xl px-3 py-2 text-sm border bg-white text-slate-900 border-slate-300 placeholder:text-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-300 dark:bg-slate-950/60 dark:text-slate-100 dark:border-slate-700 dark:placeholder:text-slate-500 dark:focus:ring-slate-700",Vt=wr,de="rounded-2xl border bg-white/80 border-slate-200 shadow-sm dark:bg-slate-900/40 dark:border-slate-800",sd=[{value:"plain-lines",label:"Построчно"},{value:"single-line",label:"Одной строкой"},{value:"keenetic-ip",label:"Keenetic (.bat IPv4 маршруты)"},{value:"json",label:"JSON"}],Fm={runetfreedom:"bg-rose-100 text-rose-700 dark:bg-rose-900/40 dark:text-rose-300",loyalsoldier:"bg-violet-100 text-violet-700 dark:bg-violet-900/40 dark:text-violet-300",daniellavrushin:"bg-amber-100 text-amber-700 dark:bg-amber-900/40 dark:text-amber-300",v2fly:"bg-sky-100 text-sky-700 dark:bg-sky-900/40 dark:text-sky-300"},Bm="bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-400";function Am(){const[e,t]=k.useState(()=>{var r,l;const n=localStorage.getItem("theme");return n==="dark"?!0:n==="light"?!1:((l=(r=window.matchMedia)==null?void 0:r.call(window,"(prefers-color-scheme: dark)"))==null?void 0:l.matches)??!0});return k.useEffect(()=>{document.documentElement.classList.toggle("dark",e),localStorage.setItem("theme",e?"dark":"light")},[e]),u.jsx("button",{onClick:()=>t(n=>!n),className:`text-xs px-3 py-1 rounded-xl border bg-white text-slate-900 border-slate-200 hover:bg-slate-50 dark:bg-slate-800 dark:text-slate-200 dark:border-slate-700 dark:hover:bg-slate-700 ${me}`,type:"button",children:e?"☀ Light":"☾ Dark"})}const Vm=[{id:"popular",label:"Популярные"},{id:"search",label:"Поиск"},{id:"lookup",label:"DNS поиск"},{id:"routing",label:"Для приложений"}];function vi({back:e,tab:t,setTab:n}){return u.jsxs("div",{className:"mb-4",children:[u.jsxs("div",{className:"flex items-center justify-between mb-3",children:[u.jsx("div",{className:"flex items-center gap-3",children:e?u.jsxs(Oa,{to:e.to,className:"text-sm underline text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white",children:["← ",e.label]}):u.jsx("div",{className:"text-xl font-bold tracking-tight",children:"GeoExport"})}),u.jsxs("div",{className:"flex items-center gap-2",children:[!e&&u.jsx(Oa,{to:"/sources",className:"text-xs px-3 py-1.5 rounded-lg hover:bg-slate-200 dark:hover:bg-slate-800 text-slate-600 dark:text-slate-400",children:"Источники"}),u.jsx(Am,{})]})]}),t&&n&&u.jsx("div",{className:"flex gap-1 overflow-x-auto pb-1 -mx-4 px-4 scrollbar-hide",children:Vm.map(r=>u.jsx("button",{onClick:()=>n(r.id),className:`text-xs px-3 py-2 rounded-lg transition-colors whitespace-nowrap shrink-0 ${t===r.id?"bg-slate-900 text-white dark:bg-slate-100 dark:text-slate-900":"bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-400 hover:bg-slate-200 dark:hover:bg-slate-700"}`,type:"button",children:r.label},r.id))})]})}function kn(e){const[t,n]=e.split(":",2),r=n.replace(/^geoip_|^geosite_/,"");return`${t}:${r}`}function _l({text:e}){const[t,n]=Ne.useState(!1),r=l=>{l.stopPropagation(),navigator.clipboard.writeText(e),n(!0),setTimeout(()=>n(!1),1500)};return u.jsx("button",{onClick:r,title:"Скопировать",className:`text-xs px-2 py-0.5 rounded border border-slate-200 dark:border-slate-700 hover:bg-slate-100 dark:hover:bg-slate-700 font-mono transition-colors ${me}`,type:"button",children:t?"✓":"⎘"})}function Wm({type:e}){return u.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full font-mono shrink-0 ${e==="geoip"?"bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300":"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-300"}`,children:e})}function Wl({slug:e,name:t}){const n=Fm[e]??Bm;return u.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full shrink-0 ${n}`,children:t})}function Hm({domain:e,name:t}){const[n,r]=Ne.useState(!1);return!e||n?u.jsx("div",{className:"w-7 h-7 rounded-lg bg-slate-200 dark:bg-slate-700 flex items-center justify-center text-xs font-bold text-slate-500 dark:text-slate-400 shrink-0",children:t[0]}):u.jsx("img",{src:`https://www.google.com/s2/favicons?domain=${e}&sz=64`,alt:t,className:"w-7 h-7 rounded-lg object-contain bg-white dark:bg-slate-800 p-0.5 shrink-0",onError:()=>r(!0)})}function bm({svc:e,sources:t,sourceFilter:n}){const[r,l]=Ne.useState(!1),[s,o]=Ne.useState(""),[i,a]=Ne.useState(!1),[c,h]=Ne.useState("plain-lines"),[m,v]=Ne.useState("domains,ip4,ip6"),[g,y]=Ne.useState(!1),j=kr(),C=Ne.useMemo(()=>{const w=n==="all"?e.categories:e.categories.filter(S=>S.source_slug===n);return w.length>0?w:e.categories},[e.categories,n]),f=C.length>0,d=[...new Set(C.map(w=>w.source_slug))],p=async()=>{if(f){a(!0);try{const w=new URLSearchParams;C.forEach(z=>w.append("category",z.full_name)),w.set("type",m),w.set("format",c==="single-line"?"plain-lines":c),n!=="all"&&w.set("source",n);let P=await(await fetch(`/api/export?${w}`)).text();c==="single-line"&&(P=P.trim().split(/\r?\n/).join(",")),o(P)}finally{a(!1)}}};k.useEffect(()=>{r&&p()},[r,c,m,n]);const x=()=>{const w=new Blob([s],{type:"text/plain;charset=utf-8"}),S=URL.createObjectURL(w),P=document.createElement("a");P.href=S,P.download=`${e.name.replace(/[^a-z0-9]/gi,"_").toLowerCase()}.txt`,P.click(),URL.revokeObjectURL(S)},E=()=>{navigator.clipboard.writeText(s),y(!0),setTimeout(()=>y(!1),1500)};return u.jsxs("div",{className:`${de} overflow-hidden`,children:[u.jsxs("button",{onClick:()=>f&&l(w=>!w),disabled:!f,className:`w-full flex items-center gap-3 px-4 py-3 text-left ${f?"hover:bg-white dark:hover:bg-slate-900/70 "+me:"opacity-40 cursor-not-allowed"}`,type:"button",children:[u.jsx(Hm,{domain:e.domain,name:e.name}),u.jsxs("div",{className:"flex-1 min-w-0",children:[u.jsx("div",{className:"text-sm font-medium text-slate-900 dark:text-slate-100",children:e.name}),f?u.jsxs("div",{className:"flex items-center gap-1 flex-wrap mt-0.5",children:[u.jsxs("span",{className:"text-xs text-slate-400",children:[C.length," ",C.length===1?"категория":C.length<5?"категории":"категорий"]}),d.map(w=>{var P;const S=t.find(z=>z.slug===w);return u.jsx(Wl,{slug:w,name:((P=S==null?void 0:S.name)==null?void 0:P.split(" ")[0])??w},w)})]}):u.jsx("div",{className:"text-xs text-slate-400",children:"Нет в базах данных"})]}),f&&u.jsx("svg",{className:`w-4 h-4 text-slate-400 transition-transform shrink-0 ${r?"rotate-180":""}`,viewBox:"0 0 20 20",fill:"currentColor",children:u.jsx("path",{fillRule:"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z",clipRule:"evenodd"})})]}),r&&u.jsxs("div",{className:"border-t border-slate-100 dark:border-slate-800 px-4 py-3 space-y-3",children:[u.jsx("div",{className:"flex flex-wrap gap-1",children:C.map(w=>u.jsxs("span",{className:`inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full font-mono ${w.type==="geoip"?"bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300":"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-300"}`,children:[kn(w.full_name),u.jsx(_l,{text:kn(w.full_name)})]},w.full_name+w.source_slug))}),u.jsxs("div",{className:"flex gap-2 flex-wrap",children:[u.jsxs("select",{value:m,onChange:w=>v(w.target.value),className:`text-xs ${Vt}`,children:[u.jsx("option",{value:"domains,ip4,ip6",children:"Домены + IPv4 + IPv6"}),u.jsx("option",{value:"domains,ip4",children:"Домены + IPv4"}),u.jsx("option",{value:"ip4,ip6",children:"IPv4 + IPv6"}),u.jsx("option",{value:"domains",children:"Только домены"}),u.jsx("option",{value:"ip4",children:"Только IPv4"}),u.jsx("option",{value:"ip6",children:"Только IPv6"})]}),u.jsx("select",{value:c,onChange:w=>h(w.target.value),className:`text-xs ${Vt}`,children:sd.map(w=>u.jsx("option",{value:w.value,children:w.label},w.value))})]}),u.jsx("textarea",{readOnly:!0,value:i?"Загрузка…":s,className:"w-full h-28 rounded-xl px-3 py-2 text-xs border bg-white text-slate-900 border-slate-200 dark:bg-slate-950/60 dark:text-slate-100 dark:border-slate-700 font-mono resize-none"}),u.jsxs("div",{className:"flex gap-2 flex-wrap",children:[u.jsx("button",{onClick:x,className:`px-3 py-1.5 text-xs rounded-xl bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white ${me}`,children:"↓ Скачать"}),u.jsx("button",{onClick:E,className:`px-3 py-1.5 text-xs rounded-xl border border-slate-300 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 ${me}`,children:g?"✓ Скопировано":"Скопировать"}),u.jsx("button",{onClick:()=>{const w=new URLSearchParams;C.forEach(S=>w.append("category",S.full_name)),w.set("type",m),w.set("format",c),n!=="all"&&w.set("source",n),j(`/export?${w}`)},className:`px-3 py-1.5 text-xs rounded-xl border border-slate-300 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 ${me}`,children:"Открыть экспорт →"})]})]})]})}function Qm({sources:e}){const[t,n]=k.useState([]),[r,l]=k.useState(!0),[s,o]=k.useState("all"),[i,a]=k.useState(new Set(["messengers"]));k.useEffect(()=>{fetch("/api/presets").then(h=>h.json()).then(n).finally(()=>l(!1))},[]);const c=h=>{a(m=>{const v=new Set(m);return v.has(h)?v.delete(h):v.add(h),v})};return r?u.jsx("div",{className:"py-12 text-center text-sm text-slate-400",children:"Загрузка…"}):u.jsxs("div",{className:"space-y-2",children:[e.length>0&&u.jsx("div",{className:`${de} p-3 mb-4`,children:u.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[u.jsx("span",{className:"text-xs text-slate-500",children:"Источник:"}),u.jsx("button",{onClick:()=>o("all"),className:`text-xs px-2.5 py-1 rounded-full border transition-colors ${s==="all"?"bg-slate-900 text-white dark:bg-slate-100 dark:text-slate-900 border-transparent":"border-slate-300 dark:border-slate-600 hover:bg-slate-100 dark:hover:bg-slate-800"}`,type:"button",children:"Все"}),e.map(h=>u.jsx("button",{onClick:()=>o(h.slug),className:`text-xs px-2.5 py-1 rounded-full border transition-colors ${s===h.slug?"bg-slate-900 text-white dark:bg-slate-100 dark:text-slate-900 border-transparent":"border-slate-300 dark:border-slate-600 hover:bg-slate-100 dark:hover:bg-slate-800"}`,type:"button",children:h.name},h.slug))]})}),t.map(h=>u.jsxs("div",{className:de,children:[u.jsxs("button",{onClick:()=>c(h.slug),className:`w-full flex items-center justify-between px-4 py-3 ${me}`,type:"button",children:[u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx("span",{className:"text-sm font-semibold text-slate-900 dark:text-slate-100",children:h.group}),u.jsxs("span",{className:"text-xs text-slate-400",children:[h.services.length," сервисов"]})]}),u.jsx("svg",{className:`w-4 h-4 text-slate-400 transition-transform ${i.has(h.slug)?"rotate-180":""}`,viewBox:"0 0 20 20",fill:"currentColor",children:u.jsx("path",{fillRule:"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z",clipRule:"evenodd"})})]}),i.has(h.slug)&&u.jsx("div",{className:"border-t border-slate-100 dark:border-slate-800 p-3 space-y-1.5",children:h.services.map(m=>u.jsx(bm,{svc:m,sources:e,sourceFilter:s},m.name))})]},h.slug))]})}function Km({sources:e,lastUpdate:t,updateRunning:n}){const[r,l]=hi(),[s,o]=k.useState(()=>r.get("q")||""),[i,a]=k.useState(()=>r.get("source")||"all"),[c,h]=k.useState([]),[m,v]=k.useState(!1),g=kr();k.useEffect(()=>{const f=r.get("q");if(f&&f.length>=2){const d=r.get("source")||"all";v(!0);const p=new URLSearchParams({q:f,cat_type:"all",limit:"100"});d!=="all"&&p.set("source",d),fetch(`/api/search?${p}`).then(x=>x.json()).then(h).finally(()=>v(!1))}},[]),k.useEffect(()=>{if(s.trim().length<2){s.trim().length===0&&h([]);return}const f=setTimeout(()=>y(s,i),350);return()=>clearTimeout(f)},[s]);const y=async(f,d)=>{const p=f??s,x=d??i;if(p.trim().length<2)return;v(!0);const E=new URLSearchParams;E.set("q",p),E.set("tab","search"),x!=="all"&&E.set("source",x),l(E,{replace:!0});try{const w=new URLSearchParams({q:p,cat_type:"all",limit:"100"});x!=="all"&&w.set("source",x);const S=await fetch(`/api/search?${w}`);h(await S.json())}finally{v(!1)}},j=f=>{var T;const d=f.full_name,p=f.source_slug,[x,E]=d.split(":",2),w=E.replace(/^geoip_|^geosite_/,""),S=x==="geoip"?"geosite":"geoip",P=((T=c.find($=>$.source_slug===p&&(($==null?void 0:$.full_name)===`${S}:${S}_${w}`||($==null?void 0:$.full_name)===`${S}:${w}`))||c.find($=>($==null?void 0:$.full_name)===`${S}:${S}_${w}`||($==null?void 0:$.full_name)===`${S}:${w}`))==null?void 0:T.full_name)??null,z=new URLSearchParams;z.append("category",d),P&&z.append("category",P),p&&z.set("source",p),g(`/export?${z}`)},C=c.reduce((f,d)=>{const p=d.source_slug;return f[p]||(f[p]=[]),f[p].push(d),f},{});return u.jsxs("div",{children:[u.jsxs("div",{className:`${de} p-4 mb-4`,children:[u.jsx("div",{className:"text-sm mb-3 text-slate-600 dark:text-slate-400",children:"Поиск по категориям (geosite / geoip) из всех источников"}),u.jsxs("div",{className:"relative",children:[u.jsx("input",{value:s,onChange:f=>o(f.target.value),className:`w-full ${wr} pr-10`,placeholder:"Категория (google, ru), домен (whatsapp.com) или слово (whatsapp)…",autoFocus:!0}),m&&u.jsx("div",{className:"absolute right-3 top-1/2 -translate-y-1/2",children:u.jsx("svg",{className:"animate-spin w-4 h-4 text-slate-400",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:u.jsx("path",{d:"M21 12a9 9 0 1 1-6.219-8.56"})})}),!m&&s&&u.jsx("button",{onClick:()=>{o(""),h([]),l({tab:"search"},{replace:!0})},className:"absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 hover:text-slate-600 dark:hover:text-slate-200",type:"button",children:"✕"})]}),e.length>0&&u.jsxs("div",{className:"flex items-center gap-2 mt-3 flex-wrap",children:[u.jsx("span",{className:"text-xs text-slate-500",children:"Источник:"}),u.jsx("button",{onClick:()=>{a("all"),c.length>0&&y(s,"all")},className:`text-xs px-2.5 py-1 rounded-full border transition-colors ${i==="all"?"bg-slate-900 text-white dark:bg-slate-100 dark:text-slate-900 border-transparent":"border-slate-300 dark:border-slate-600 hover:bg-slate-100 dark:hover:bg-slate-800"}`,type:"button",children:"Все"}),e.map(f=>u.jsx("button",{onClick:()=>{a(f.slug),c.length>0&&y(s,f.slug)},className:`text-xs px-2.5 py-1 rounded-full border transition-colors ${i===f.slug?"bg-slate-900 text-white dark:bg-slate-100 dark:text-slate-900 border-transparent":"border-slate-300 dark:border-slate-600 hover:bg-slate-100 dark:hover:bg-slate-800"}`,type:"button",children:f.name},f.slug))]}),u.jsx("div",{className:"flex items-center gap-2 mt-3 pt-3 border-t border-slate-100 dark:border-slate-800",children:n?u.jsxs("div",{className:"flex items-center gap-2 text-xs text-amber-600 dark:text-amber-400",children:[u.jsx("svg",{className:"animate-spin w-3 h-3",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:u.jsx("path",{d:"M21 12a9 9 0 1 1-6.219-8.56"})}),"База обновляется, подождите…"]}):u.jsxs("div",{className:"text-xs text-slate-500",children:["База обновлена: ",u.jsx("span",{className:"text-slate-700 dark:text-slate-300 font-medium",children:t??"нет данных"})]})})]}),Object.keys(C).length>0&&u.jsx("div",{className:"space-y-4",children:Object.entries(C).map(([f,d])=>{const p=e.find(x=>x.slug===f);return u.jsxs("div",{children:[u.jsxs("div",{className:"flex items-center gap-2 mb-2 px-1",children:[u.jsx(Wl,{slug:f,name:(p==null?void 0:p.name)??f}),u.jsx("span",{className:"text-xs text-slate-400",children:p==null?void 0:p.compatible})]}),u.jsx("div",{className:"space-y-1.5",children:d.map(x=>{var E;return u.jsxs("button",{onClick:()=>j(x),className:`w-full text-left ${de} hover:bg-white dark:hover:bg-slate-900/70 px-4 py-3 ${me}`,type:"button",children:[u.jsxs("div",{className:"flex items-center justify-between gap-2",children:[u.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[u.jsx("span",{className:"text-sm font-medium font-mono truncate",children:kn(x.full_name)}),u.jsx(_l,{text:kn(x.full_name)}),x.match_type==="content"&&u.jsx("span",{className:"text-xs px-1.5 py-0.5 rounded bg-orange-100 text-orange-600 dark:bg-orange-900/40 dark:text-orange-400 shrink-0",children:"по доменам"}),x.match_type==="domain"&&u.jsx("span",{className:"text-xs px-1.5 py-0.5 rounded bg-teal-100 text-teal-600 dark:bg-teal-900/40 dark:text-teal-400 shrink-0",children:"домен найден"})]}),u.jsx(Wm,{type:x.type})]}),x.region&&u.jsxs("div",{className:"text-xs text-slate-500 mt-1",children:["Регион: ",x.region]}),((E=x.matched_values)==null?void 0:E.length)>0&&u.jsx("div",{className:"flex flex-wrap gap-1 mt-2",children:x.matched_values.map(w=>u.jsx("span",{className:"text-xs font-mono px-2 py-0.5 rounded bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-400",children:w},w))})]},x.full_name+x.source_slug)})})]},f)})}),c.length===0&&s&&!m&&u.jsx("div",{className:"mt-8 text-center text-sm text-slate-400",children:"Ничего не найдено"})]})}const Gm={runetfreedom:"bg-rose-100 text-rose-700 dark:bg-rose-900/40 dark:text-rose-300",loyalsoldier:"bg-violet-100 text-violet-700 dark:bg-violet-900/40 dark:text-violet-300",daniellavrushin:"bg-amber-100 text-amber-700 dark:bg-amber-900/40 dark:text-amber-300",v2fly:"bg-sky-100 text-sky-700 dark:bg-sky-900/40 dark:text-sky-300"};function xs({matches:e}){if(!e||e.length===0)return u.jsx("span",{className:"text-xs text-slate-400",children:"—"});const t=e.filter((n,r,l)=>l.findIndex(s=>s.full_name===n.full_name&&s.source_slug===n.source_slug)===r);return u.jsxs("div",{className:"flex flex-wrap gap-1",children:[t.slice(0,3).map(n=>u.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded-full font-mono ${Gm[n.source_slug]??"bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-400"}`,children:n.full_name.replace(/^geoip_|^geosite_/,"").split(":").map(r=>r.replace(/^geoip_|^geosite_/,"")).join(":")},n.full_name+n.source_slug)),t.length>3&&u.jsxs("span",{className:"text-xs text-slate-400",children:["+",t.length-3]})]})}function On({item:e,checked:t,onChange:n}){return u.jsxs("label",{className:`flex items-start gap-3 px-3 py-3 sm:py-2.5 rounded-xl border cursor-pointer transition-colors ${t?"bg-slate-50 border-slate-300 dark:bg-slate-800/60 dark:border-slate-600":"border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/30"}`,children:[u.jsx("input",{type:"checkbox",checked:t,onChange:r=>n(e.id,r.target.checked),className:"mt-0.5 shrink-0 accent-slate-900 dark:accent-slate-100 w-4 h-4"}),u.jsxs("div",{className:"min-w-0",children:[u.jsx("div",{className:"text-sm font-medium text-slate-900 dark:text-slate-100",children:e.label}),u.jsx("div",{className:"text-xs text-slate-500 dark:text-slate-400 mt-0.5",children:e.description}),u.jsx("code",{className:"text-xs font-mono text-slate-400 dark:text-slate-500",children:e.value})]})]})}function ys({title:e,description:t,children:n}){return u.jsxs("div",{className:`${de} overflow-hidden`,children:[u.jsxs("div",{className:"px-4 py-3 border-b border-slate-100 dark:border-slate-800",children:[u.jsx("div",{className:"font-semibold text-slate-900 dark:text-slate-100",children:e}),u.jsx("div",{className:"text-xs text-slate-500 dark:text-slate-400 mt-0.5",children:t})]}),u.jsx("div",{className:"p-3 space-y-1.5",children:n})]})}function In({onAdd:e}){const[t,n]=k.useState(""),[r,l]=k.useState([]),[s,o]=k.useState(!1),[i,a]=k.useState(!1),c=Ne.useRef(null),h=Ne.useRef(null),m=g=>{if(g.trim().length<2){l([]),o(!1);return}clearTimeout(c.current),c.current=setTimeout(async()=>{a(!0);try{const y=new URLSearchParams({q:g.trim(),cat_type:"all",limit:"20"}),f=(await(await fetch(`/api/search?${y}`)).json()).map(d=>d.full_name);l(f),o(f.length>0)}finally{a(!1)}},350)},v=g=>{g.trim()&&(e(g.trim()),n(""),l([]),o(!1))};return k.useEffect(()=>{const g=y=>{h.current&&!h.current.contains(y.target)&&o(!1)};return document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[]),u.jsxs("div",{ref:h,className:"relative mt-1.5",children:[u.jsxs("div",{className:"flex gap-2",children:[u.jsxs("div",{className:"relative flex-1",children:[u.jsx("input",{value:t,onChange:g=>{n(g.target.value),m(g.target.value)},onKeyDown:g=>{g.key==="Enter"&&v(t),g.key==="Escape"&&o(!1)},onFocus:g=>{r.length>0&&o(!0),setTimeout(()=>g.target.scrollIntoView({behavior:"smooth",block:"center"}),100)},placeholder:"Своя категория (напр. geosite:google)",className:`${wr} w-full text-xs pr-7`}),i&&u.jsx("span",{className:"absolute right-2.5 top-1/2 -translate-y-1/2 text-slate-400 text-xs",children:"…"})]}),u.jsx("button",{onClick:()=>v(t),className:"px-3 py-1.5 text-xs rounded-xl border border-slate-300 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 text-slate-600 dark:text-slate-300 shrink-0",children:"+ Добавить"})]}),s&&r.length>0&&u.jsx("div",{className:"absolute z-50 left-0 right-12 mt-1 rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-lg overflow-hidden max-h-52 overflow-y-auto",children:r.map(g=>u.jsx("button",{onMouseDown:y=>{y.preventDefault(),v(g)},className:"w-full text-left px-3 py-2 text-xs font-mono hover:bg-slate-50 dark:hover:bg-slate-800 text-slate-700 dark:text-slate-300 border-b border-slate-100 dark:border-slate-800 last:border-0",children:g},g))})]})}function Xm(){const[e,t]=k.useState(null),[n,r]=k.useState(!0),[l,s]=k.useState(!1),[o,i]=k.useState(null),[a,c]=k.useState(!1),[h,m]=k.useState("GeoExport"),[v,g]=k.useState("loyalsoldier"),[y,j]=k.useState("block-direct-proxy"),[C,f]=k.useState(!1),[d,p]=k.useState({}),[x,E]=k.useState({direct_sites:[],direct_ips:[],proxy_sites:[],proxy_ips:[],block_sites:[],block_ips:[]}),[w,S]=k.useState({direct_sites:{},direct_ips:{},proxy_sites:{},proxy_ips:{},block_sites:{},block_ips:{}});k.useEffect(()=>{fetch("/api/routing/presets").then(N=>N.json()).then(N=>{t(N);const U={};for(const F of Object.values(N.presets))for(const V of F)U[V.id]=V.checked;p(U)}).finally(()=>r(!1))},[]);const P=(N,U)=>p(F=>({...F,[N]:U})),z=(N,U)=>{E(F=>({...F,[N]:[...F[N]||[],U]})),S(F=>({...F,[N]:{...F[N]||{},[U]:!0}}))},T=(N,U,F)=>{S(V=>({...V,[N]:{...V[N]||{},[U]:F}}))},$=N=>{if(!e)return[];const U=e.presets[N].filter(V=>d[V.id]).map(V=>V.value),F=(x[N]||[]).filter(V=>{var L;return(L=w[N])==null?void 0:L[V]});return[...U,...F]},Et=async()=>{s(!0),i(null);try{const U=await(await fetch("/api/routing/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:h,geo_source:v,global_proxy:C,route_order:y,direct_sites:$("direct_sites"),direct_ips:$("direct_ips"),proxy_sites:$("proxy_sites"),proxy_ips:$("proxy_ips"),block_sites:$("block_sites"),block_ips:$("block_ips")})})).json();i(U)}finally{s(!1)}},Ct=N=>{navigator.clipboard.writeText(N),c(!0),setTimeout(()=>c(!1),1500)};return n?u.jsx("div",{className:"py-12 text-center text-sm text-slate-400",children:"Загрузка…"}):e?u.jsxs("div",{className:"space-y-4",children:[u.jsxs("div",{className:`${de} p-4`,children:[u.jsx("h2",{className:"text-base font-semibold mb-0.5",children:"Маршрутизация для приложений"}),u.jsxs("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:["Настройте правила и получите deeplink для ",u.jsx("strong",{children:"Happ"})," (iOS / Android / macOS / Windows). Приложение автоматически применит выбранные правила."]})]}),u.jsxs("div",{className:`${de} p-4`,children:[u.jsx("div",{className:"text-xs font-semibold text-slate-500 uppercase tracking-wide mb-3",children:"Настройки профиля"}),u.jsxs("div",{className:"grid grid-cols-1 gap-3",children:[u.jsxs("div",{children:[u.jsx("label",{className:"text-xs text-slate-500 mb-1 block",children:"Название профиля"}),u.jsx("input",{value:h,onChange:N=>m(N.target.value),className:wr,placeholder:"GeoExport"})]}),u.jsxs("div",{children:[u.jsx("label",{className:"text-xs text-slate-500 mb-1 block",children:"База geoip/geosite"}),u.jsx("select",{value:v,onChange:N=>g(N.target.value),className:Vt,children:Object.entries(e.geo_sources).map(([N,U])=>u.jsx("option",{value:N,children:U.label},N))})]}),u.jsxs("div",{children:[u.jsx("label",{className:"text-xs text-slate-500 mb-1 block",children:"Порядок правил"}),u.jsx("select",{value:y,onChange:N=>j(N.target.value),className:Vt,children:e.route_orders.map(N=>u.jsx("option",{value:N.value,children:N.label},N.value))})]}),u.jsxs("div",{className:"flex items-center gap-3 pt-5",children:[u.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[u.jsx("input",{type:"checkbox",checked:C,onChange:N=>f(N.target.checked),className:"accent-slate-900 dark:accent-slate-100"}),u.jsx("span",{className:"text-sm text-slate-700 dark:text-slate-300",children:"Глобальный прокси"})]}),u.jsx("span",{className:"text-xs text-slate-400",children:"Весь трафик через VPN"})]})]})]}),u.jsxs(ys,{title:"Блокировать",description:"Домены и IP блокируются полностью — ни через VPN, ни напрямую. Для блокировки рекламы и трекеров.",children:[e.presets.block_sites.map(N=>u.jsx(On,{item:N,checked:!!d[N.id],onChange:P},N.id)),(x.block_sites||[]).map(N=>{var U,F;return u.jsxs("label",{className:`flex items-start gap-3 px-3 py-2.5 rounded-xl border cursor-pointer transition-colors ${(U=w.block_sites)!=null&&U[N]?"bg-slate-50 border-slate-300 dark:bg-slate-800/60 dark:border-slate-600":"border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/30"}`,children:[u.jsx("input",{type:"checkbox",checked:!!((F=w.block_sites)!=null&&F[N]),onChange:V=>T("block_sites",N,V.target.checked),className:"mt-0.5 shrink-0 accent-slate-900 dark:accent-slate-100 w-4 h-4"}),u.jsxs("div",{className:"min-w-0",children:[u.jsx("div",{className:"text-sm font-medium text-slate-900 dark:text-slate-100",children:"Своя категория"}),u.jsx("code",{className:"text-xs font-mono text-slate-400 dark:text-slate-500",children:N})]})]},N)}),u.jsx(In,{onAdd:N=>z("block_sites",N)})]}),u.jsxs(ys,{title:"Прямой трафик (без VPN)",description:"Сайты и IP открываются напрямую, минуя VPN. Добавьте российские сервисы — это ускорит соединение и снизит нагрузку на сервер.",children:[u.jsx("div",{className:"text-xs font-medium text-slate-500 mb-1",children:"Домены"}),e.presets.direct_sites.map(N=>u.jsx(On,{item:N,checked:!!d[N.id],onChange:P},N.id)),(x.direct_sites||[]).map(N=>{var U,F;return u.jsxs("label",{className:`flex items-start gap-3 px-3 py-2.5 rounded-xl border cursor-pointer transition-colors ${(U=w.direct_sites)!=null&&U[N]?"bg-slate-50 border-slate-300 dark:bg-slate-800/60 dark:border-slate-600":"border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/30"}`,children:[u.jsx("input",{type:"checkbox",checked:!!((F=w.direct_sites)!=null&&F[N]),onChange:V=>T("direct_sites",N,V.target.checked),className:"mt-0.5 shrink-0 accent-slate-900 dark:accent-slate-100 w-4 h-4"}),u.jsxs("div",{className:"min-w-0",children:[u.jsx("div",{className:"text-sm font-medium text-slate-900 dark:text-slate-100",children:"Своя категория"}),u.jsx("code",{className:"text-xs font-mono text-slate-400 dark:text-slate-500",children:N})]})]},N)}),u.jsx(In,{onAdd:N=>z("direct_sites",N)}),u.jsx("div",{className:"text-xs font-medium text-slate-500 mt-3 mb-1",children:"IP-адреса"}),e.presets.direct_ips.map(N=>u.jsx(On,{item:N,checked:!!d[N.id],onChange:P},N.id)),(x.direct_ips||[]).map(N=>{var U,F;return u.jsxs("label",{className:`flex items-start gap-3 px-3 py-2.5 rounded-xl border cursor-pointer transition-colors ${(U=w.direct_ips)!=null&&U[N]?"bg-slate-50 border-slate-300 dark:bg-slate-800/60 dark:border-slate-600":"border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/30"}`,children:[u.jsx("input",{type:"checkbox",checked:!!((F=w.direct_ips)!=null&&F[N]),onChange:V=>T("direct_ips",N,V.target.checked),className:"mt-0.5 shrink-0 accent-slate-900 dark:accent-slate-100 w-4 h-4"}),u.jsxs("div",{className:"min-w-0",children:[u.jsx("div",{className:"text-sm font-medium text-slate-900 dark:text-slate-100",children:"Своя категория"}),u.jsx("code",{className:"text-xs font-mono text-slate-400 dark:text-slate-500",children:N})]})]},N)}),u.jsx(In,{onAdd:N=>z("direct_ips",N)})]}),u.jsxs(ys,{title:"Через VPN",description:"Сайты и IP направляются через VPN-сервер. Добавьте заблокированные в РФ сервисы.",children:[u.jsx("div",{className:"text-xs font-medium text-slate-500 mb-1",children:"Домены"}),e.presets.proxy_sites.map(N=>u.jsx(On,{item:N,checked:!!d[N.id],onChange:P},N.id)),(x.proxy_sites||[]).map(N=>{var U,F;return u.jsxs("label",{className:`flex items-start gap-3 px-3 py-2.5 rounded-xl border cursor-pointer transition-colors ${(U=w.proxy_sites)!=null&&U[N]?"bg-slate-50 border-slate-300 dark:bg-slate-800/60 dark:border-slate-600":"border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/30"}`,children:[u.jsx("input",{type:"checkbox",checked:!!((F=w.proxy_sites)!=null&&F[N]),onChange:V=>T("proxy_sites",N,V.target.checked),className:"mt-0.5 shrink-0 accent-slate-900 dark:accent-slate-100 w-4 h-4"}),u.jsxs("div",{className:"min-w-0",children:[u.jsx("div",{className:"text-sm font-medium text-slate-900 dark:text-slate-100",children:"Своя категория"}),u.jsx("code",{className:"text-xs font-mono text-slate-400 dark:text-slate-500",children:N})]})]},N)}),u.jsx(In,{onAdd:N=>z("proxy_sites",N)}),u.jsx("div",{className:"text-xs font-medium text-slate-500 mt-3 mb-1",children:"IP-адреса"}),e.presets.proxy_ips.map(N=>u.jsx(On,{item:N,checked:!!d[N.id],onChange:P},N.id)),(x.proxy_ips||[]).map(N=>{var U,F;return u.jsxs("label",{className:`flex items-start gap-3 px-3 py-2.5 rounded-xl border cursor-pointer transition-colors ${(U=w.proxy_ips)!=null&&U[N]?"bg-slate-50 border-slate-300 dark:bg-slate-800/60 dark:border-slate-600":"border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/30"}`,children:[u.jsx("input",{type:"checkbox",checked:!!((F=w.proxy_ips)!=null&&F[N]),onChange:V=>T("proxy_ips",N,V.target.checked),className:"mt-0.5 shrink-0 accent-slate-900 dark:accent-slate-100 w-4 h-4"}),u.jsxs("div",{className:"min-w-0",children:[u.jsx("div",{className:"text-sm font-medium text-slate-900 dark:text-slate-100",children:"Своя категория"}),u.jsx("code",{className:"text-xs font-mono text-slate-400 dark:text-slate-500",children:N})]})]},N)}),u.jsx(In,{onAdd:N=>z("proxy_ips",N)})]}),u.jsx("div",{className:"flex justify-center px-0",children:u.jsx("button",{onClick:Et,disabled:l,className:`w-full sm:w-auto px-8 py-3 text-sm font-medium rounded-xl bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white disabled:opacity-50 ${me}`,children:l?"Генерация…":"Сгенерировать и получить ссылку"})}),o&&u.jsxs("div",{className:`${de} p-4 pb-5`,style:{borderColor:"rgb(167 243 208)",borderWidth:"2px"},children:[u.jsx("div",{className:"text-sm font-semibold text-emerald-700 dark:text-emerald-300 mb-3",children:"Профиль сгенерирован"}),Object.entries(o.instructions).map(([N,U])=>u.jsxs("div",{className:"space-y-2",children:[u.jsxs("div",{className:"text-xs text-slate-500",children:[U.name," (",U.platforms.join(", "),")"]}),u.jsxs("div",{className:"text-xs text-slate-500",children:[u.jsx("span",{className:"font-medium",children:"Инструкция:"})," ",U.steps.join(" → ")]}),u.jsx("div",{className:"mt-3 pt-2 border-t border-slate-100 dark:border-slate-800",children:u.jsxs("div",{className:"text-xs font-mono text-slate-400 break-all mb-3",children:[o.deeplink.slice(0,100),"…"]})}),u.jsxs("div",{className:"flex flex-col sm:flex-row items-stretch sm:items-center gap-2",children:[u.jsxs("a",{href:o.deeplink,className:`w-full sm:w-auto text-center px-4 py-3 sm:py-2 text-sm rounded-xl bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white ${me}`,children:["Открыть в ",U.name]}),u.jsx("button",{onClick:()=>Ct(o.deeplink),className:`w-full sm:w-auto text-center px-3 py-3 sm:py-2 text-xs rounded-xl border border-slate-300 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 ${me}`,children:a?"✓ Скопировано":"Скопировать ссылку"})]})]},N))]})]}):null}function Ym(){const[e,t]=k.useState(""),[n,r]=k.useState(!1),[l,s]=k.useState(null),[o,i]=k.useState(null),[a,c]=k.useState("plain-lines");kr();const h=async()=>{const g=e.trim();if(g){r(!0),i(null),s(null);try{const y=await fetch(`/api/lookup?domain=${encodeURIComponent(g)}`);if(!y.ok){const j=await y.json().catch(()=>({}));i(j.detail??"Ошибка запроса");return}s(await y.json())}catch(y){i(y.message??"Ошибка сети")}finally{r(!1)}}},m=()=>{if(!l)return;const g=l.all_ips_v4;let y="";a==="plain-lines"?y=g.join(` -`):a==="keenetic-ip"?y=g.map(d=>{const p=d.split("/"),x=p[0],E=parseInt(p[1]??"32"),w=E===32?"255.255.255.255":Array.from({length:4},(S,P)=>65280>>Math.min(8,Math.max(0,E-P*8))&255).join(".");return`route ADD ${x} MASK ${w} 0.0.0.0 & rem ${l.domain}`}).join(` -`):y=g.join(",");const j=new Blob([y],{type:"text/plain;charset=utf-8"}),C=URL.createObjectURL(j),f=document.createElement("a");f.href=C,f.download=`${l.domain}_ips.txt`,f.click(),URL.revokeObjectURL(C)},v=g=>!g||g.length!==2?"":String.fromCodePoint(...[...g.toUpperCase()].map(y=>127391+y.charCodeAt(0)));return u.jsxs("div",{children:[u.jsxs("div",{className:`${de} p-4 mb-4`,children:[u.jsx("div",{className:"text-sm mb-3 text-slate-600 dark:text-slate-400",children:"Введите домен для получения IP адресов и субдоменов. Результаты проверяются в базах geoip/geosite"}),u.jsxs("div",{className:"flex gap-2",children:[u.jsx("input",{value:e,onChange:g=>t(g.target.value),onKeyDown:g=>g.key==="Enter"&&h(),className:`flex-1 ${wr}`,placeholder:"например: example.com, anydesk.com…",autoFocus:!0}),u.jsx("button",{onClick:h,disabled:n,className:`px-4 py-2 text-sm rounded-xl bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white disabled:opacity-50 ${me}`,type:"button",children:n?u.jsxs("span",{className:"flex items-center gap-2",children:[u.jsx("svg",{className:"animate-spin w-4 h-4",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:u.jsx("path",{d:"M21 12a9 9 0 1 1-6.219-8.56"})}),"Поиск…"]}):"Найти"})]}),o&&u.jsxs("div",{className:"mt-2 text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 rounded-lg px-3 py-2",children:["Ошибка: ",o]})]}),l&&u.jsxs("div",{className:"space-y-3",children:[u.jsxs("div",{className:`${de} p-4`,children:[u.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2 mb-3",children:[u.jsxs("div",{children:[u.jsx("span",{className:"text-base font-semibold font-mono",children:l.domain}),u.jsxs("span",{className:"ml-2 text-xs text-slate-500",children:[l.subdomains_total," субдоменов · ",l.all_ips.length," уникальных IP"]})]}),u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsxs("select",{value:a,onChange:g=>c(g.target.value),className:`text-xs ${Vt}`,children:[u.jsx("option",{value:"plain-lines",children:"Построчно"}),u.jsx("option",{value:"single-line",children:"Одной строкой"}),u.jsx("option",{value:"keenetic-ip",children:"Keenetic .bat"})]}),u.jsxs("button",{onClick:m,className:`px-3 py-1.5 text-xs rounded-xl bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 ${me}`,children:["↓ Скачать IPv4 (",l.all_ips_v4.length,")"]})]})]}),u.jsxs("div",{className:"mb-3 pb-3 border-b border-slate-100 dark:border-slate-800",children:[u.jsx("div",{className:"text-xs font-medium text-slate-500 mb-2",children:"Основной домен"}),u.jsx("div",{className:"flex items-start gap-3 flex-wrap",children:u.jsxs("div",{children:[u.jsxs("div",{className:"flex flex-wrap gap-1 mb-1",children:[l.main_dns.ipv4.map(g=>u.jsx("span",{className:"text-xs font-mono px-2 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300",children:g},g)),l.main_dns.ipv6.map(g=>u.jsx("span",{className:"text-xs font-mono px-2 py-0.5 rounded bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-400",children:g},g)),l.main_dns.cname&&u.jsxs("span",{className:"text-xs font-mono px-2 py-0.5 rounded bg-amber-50 dark:bg-amber-900/20 text-amber-700 dark:text-amber-300",children:["CNAME: ",l.main_dns.cname]})]}),u.jsx(xs,{matches:l.main_dns.in_db})]})})]}),l.all_ips.length>0&&u.jsxs("div",{children:[u.jsx("div",{className:"text-xs font-medium text-slate-500 mb-2",children:"Все IP адреса"}),u.jsx("div",{className:"space-y-1 max-h-64 overflow-y-auto",children:l.all_ips.map(g=>u.jsxs("div",{className:"flex items-center gap-2 text-xs py-1 border-b border-slate-50 dark:border-slate-900 last:border-0",children:[u.jsx("span",{className:"font-mono text-slate-700 dark:text-slate-300 w-36 shrink-0",children:g.ip}),g.country_code&&u.jsx("span",{className:"shrink-0",children:v(g.country_code)}),u.jsx("span",{className:"text-slate-500 truncate flex-1",children:g.org||g.asn}),u.jsx(xs,{matches:g.in_db})]},g.ip))})]})]}),l.subdomains.length>0&&u.jsxs("div",{className:`${de} p-4`,children:[u.jsxs("div",{className:"text-xs font-medium text-slate-500 mb-3",children:["Субдомены (",l.subdomains.length," из ",l.subdomains_total,")"]}),u.jsx("div",{className:"space-y-1.5 max-h-96 overflow-y-auto",children:l.subdomains.map(g=>u.jsxs("div",{className:"flex items-start gap-2 text-xs py-1.5 border-b border-slate-50 dark:border-slate-900 last:border-0",children:[u.jsx("span",{className:"font-mono text-slate-700 dark:text-slate-300 w-56 shrink-0 truncate",children:g.domain}),u.jsxs("div",{className:"flex flex-wrap gap-1 flex-1 min-w-0",children:[g.ipv4.slice(0,3).map(y=>u.jsx("span",{className:"font-mono px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300",children:y},y)),g.ipv4.length>3&&u.jsxs("span",{className:"text-slate-400",children:["+",g.ipv4.length-3]}),g.cname&&u.jsxs("span",{className:"font-mono px-1.5 py-0.5 rounded bg-amber-50 dark:bg-amber-900/20 text-amber-700 dark:text-amber-300 truncate max-w-xs",children:["→ ",g.cname]})]}),u.jsx(xs,{matches:g.in_db})]},g.domain))})]})]})]})}function Jm(){const[e,t]=hi(),[n,r]=k.useState(()=>e.get("tab")||"popular"),[l,s]=k.useState([]),[o,i]=k.useState(null),[a,c]=k.useState(!1);k.useEffect(()=>{fetch("/api/last-update").then(m=>m.json()).then(m=>i(m.last_update)),fetch("/api/update/status").then(m=>m.json()).then(m=>c(m.running)).catch(()=>{}),fetch("/api/sources").then(m=>m.json()).then(s).catch(()=>{})},[]),k.useEffect(()=>{if(!a)return;const m=setInterval(async()=>{const v=await fetch("/api/update/status").then(g=>g.json()).catch(()=>({running:!1}));if(c(v.running),!v.running){const g=await fetch("/api/last-update").then(y=>y.json());i(g.last_update)}},3e3);return()=>clearInterval(m)},[a]);const h=m=>{r(m),t({tab:m},{replace:!0})};return u.jsx("div",{className:"min-h-screen bg-slate-100 text-slate-900 dark:bg-slate-950 dark:text-slate-100 px-3 py-4 sm:px-4 sm:py-8",children:u.jsxs("div",{className:"max-w-3xl mx-auto w-full",children:[u.jsx(vi,{tab:n,setTab:h}),n==="popular"&&u.jsx(Qm,{sources:l}),n==="search"&&u.jsx(Km,{sources:l,lastUpdate:o,updateRunning:a}),n==="lookup"&&u.jsx(Ym,{}),n==="routing"&&u.jsx(Xm,{})]})})}function Zm(){const[e,t]=k.useState([]),[n,r]=k.useState(null);return k.useEffect(()=>{fetch("/api/sources").then(l=>l.json()).then(t).catch(()=>{}),fetch("/api/last-update").then(l=>l.json()).then(r).catch(()=>{})},[]),u.jsx("div",{className:"min-h-screen bg-slate-100 text-slate-900 dark:bg-slate-950 dark:text-slate-100 px-3 py-4 sm:px-4 sm:py-8",children:u.jsxs("div",{className:"max-w-3xl mx-auto w-full",children:[u.jsx(vi,{back:{to:"/",label:"Назад"}}),u.jsx("h1",{className:"text-lg font-semibold mb-4",children:"Источники баз данных"}),u.jsx("div",{className:"space-y-3",children:e.map(l=>{var o;const s=(o=n==null?void 0:n.sources)==null?void 0:o.find(i=>i.source_slug===l.slug);return u.jsx("div",{className:`${de} p-4`,children:u.jsx("div",{className:"flex items-start justify-between gap-3 flex-wrap",children:u.jsxs("div",{className:"flex-1 min-w-0",children:[u.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[u.jsx(Wl,{slug:l.slug,name:l.name}),u.jsx("span",{className:"text-xs text-slate-500",children:s!=null&&s.last_update?`обновлено: ${s.last_update}`:"нет данных"})]}),u.jsx("div",{className:"text-sm text-slate-700 dark:text-slate-300 mb-2",children:l.description}),u.jsxs("div",{className:"text-xs text-slate-500",children:["Совместимо с: ",u.jsx("span",{className:"font-medium text-slate-700 dark:text-slate-300",children:l.compatible})]}),u.jsxs("div",{className:"mt-2 space-y-1",children:[l.geoip_url&&u.jsxs("div",{className:"text-xs",children:[u.jsx("span",{className:"text-slate-400 mr-1",children:"geoip.dat:"}),u.jsx("a",{href:l.geoip_url,target:"_blank",rel:"noreferrer",className:"font-mono text-blue-600 dark:text-blue-400 hover:underline break-all",children:l.geoip_url})]}),l.geosite_url&&u.jsxs("div",{className:"text-xs",children:[u.jsx("span",{className:"text-slate-400 mr-1",children:"geosite.dat:"}),u.jsx("a",{href:l.geosite_url,target:"_blank",rel:"noreferrer",className:"font-mono text-blue-600 dark:text-blue-400 hover:underline break-all",children:l.geosite_url})]}),!l.geosite_url&&u.jsx("div",{className:"text-xs text-slate-400 italic",children:"geosite.dat — нет в этом источнике"})]})]})})},l.slug)})}),u.jsxs("div",{className:`${de} p-4 mt-4 text-sm text-slate-600 dark:text-slate-400`,children:[u.jsx("p",{className:"font-medium text-slate-800 dark:text-slate-200 mb-1",children:"Как использовать с 3x-ui / Xray"}),u.jsxs("p",{className:"text-xs",children:["Скопируйте имя категории (например ",u.jsx("code",{className:"font-mono bg-slate-100 dark:bg-slate-800 px-1 rounded",children:"geoip:akamai"}),") и вставьте в поле маршрутизации 3x-ui. Используйте только категории из источников ",u.jsx("strong",{children:"RuNet Freedom"}),", ",u.jsx("strong",{children:"Loyalsoldier"})," или ",u.jsx("strong",{children:"DanielLavrushin"})," — они совместимы с Xray."]})]})]})})}function qm(){const[e]=hi(),t=e.getAll("category"),n=e.get("source"),[r,l]=k.useState("domains,ip4,ip6"),[s,o]=k.useState("plain-lines"),[i,a]=k.useState(""),[c,h]=k.useState(0),[m,v]=k.useState(null),[g,y]=k.useState(!1),[j,C]=k.useState(null),[f,d]=k.useState(null);k.useEffect(()=>{fetch("/api/last-update").then(S=>S.json()).then(S=>v(S.last_update)),n&&fetch("/api/sources").then(S=>S.json()).then(S=>{d(S.find(P=>P.slug===n)??null)}).catch(()=>{})},[n]),k.useEffect(()=>{s==="keenetic-ip"&&!r.includes("ip4")&&!r.includes("ip6")&&o("plain-lines")},[r]);const p=k.useCallback(async()=>{if(t.length){y(!0),C(null);try{const S=new URLSearchParams;t.forEach(T=>S.append("category",T)),S.set("type",r),S.set("format",s==="single-line"?"plain-lines":s),n&&S.set("source",n);const P=await fetch(`/api/export?${S}`);if(!P.ok){const T=await P.json().catch(()=>({}));C(T.detail??P.statusText),a(""),h(0);return}let z=await P.text();s==="single-line"&&(z=z.trim().split(/\r?\n/).join(",")),a(z),h(z.trim()?z.trim().split(/[,\r?\n]/).filter(Boolean).length:0)}finally{y(!1)}}},[t.join(","),r,s,n]);k.useEffect(()=>{p()},[p]);const x=()=>navigator.clipboard.writeText(i),E=()=>{const S=new Blob([i],{type:"text/plain;charset=utf-8"}),P=URL.createObjectURL(S),z=document.createElement("a");z.href=P,z.download=`export_${(t[0]??"data").replace(":","_")}.txt`,z.click(),URL.revokeObjectURL(P)},w=`${window.location.origin}/api/export?`+t.map(S=>`category=${encodeURIComponent(S)}`).join("&")+`&type=${encodeURIComponent(r)}&format=${encodeURIComponent(s)}`+(n?`&source=${encodeURIComponent(n)}`:"");return u.jsx("div",{className:"min-h-screen bg-slate-100 text-slate-900 dark:bg-slate-950 dark:text-slate-100 px-3 py-4 sm:px-4 sm:py-8",children:u.jsxs("div",{className:"max-w-3xl mx-auto w-full",children:[u.jsx(vi,{back:{to:"/",label:"Назад"}}),u.jsxs("div",{className:`${de} p-4 mb-4`,children:[u.jsxs("div",{className:"flex items-start justify-between gap-2 flex-wrap mb-4",children:[u.jsxs("div",{className:"flex-1 min-w-0",children:[u.jsx("div",{className:"text-xs text-slate-500 mb-1",children:"Категории:"}),u.jsx("div",{className:"flex flex-wrap gap-1 mb-2",children:t.map(S=>u.jsxs("span",{className:`inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full font-mono ${S.startsWith("geoip:")?"bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300":"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-300"}`,children:[kn(S),u.jsx(_l,{text:kn(S)})]},S))}),f&&u.jsxs("div",{className:"flex items-center gap-2 text-xs text-slate-500",children:[u.jsx("span",{children:"Источник:"}),u.jsx(Wl,{slug:f.slug,name:f.name}),u.jsxs("span",{className:"text-slate-400",children:["· ",f.compatible]})]})]}),u.jsx("div",{className:"text-sm font-medium tabular-nums text-slate-600 dark:text-slate-400",children:g?"…":`${c.toLocaleString()} строк`})]}),u.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:[u.jsxs("select",{value:r,onChange:S=>l(S.target.value),className:Vt,children:[u.jsx("option",{value:"domains,ip4,ip6",children:"Домены + IPv4 + IPv6"}),u.jsx("option",{value:"domains,ip4",children:"Домены + IPv4"}),u.jsx("option",{value:"ip4,ip6",children:"IPv4 + IPv6"}),u.jsx("option",{value:"domains",children:"Только домены"}),u.jsx("option",{value:"ip4",children:"Только IPv4"}),u.jsx("option",{value:"ip6",children:"Только IPv6"})]}),u.jsx("select",{value:s,onChange:S=>o(S.target.value),className:Vt,children:sd.map(S=>u.jsx("option",{value:S.value,children:S.label},S.value))})]}),s==="keenetic-ip"&&u.jsxs("div",{className:"mt-2 text-xs text-slate-500 bg-slate-50 dark:bg-slate-900 rounded-lg px-3 py-2",children:["Формат: ",u.jsx("code",{className:"font-mono",children:"route ADD MASK <маска> 0.0.0.0 & rem <категория>"})]}),j&&u.jsxs("div",{className:"mt-2 text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 rounded-lg px-3 py-2",children:["Ошибка: ",j]}),u.jsxs("div",{className:"flex gap-2 mt-4",children:[u.jsx("button",{onClick:E,className:`px-4 py-2 text-sm rounded-xl bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white ${me}`,children:"↓ Скачать"}),u.jsx("button",{onClick:x,className:`px-4 py-2 text-sm rounded-xl border border-slate-300 dark:border-slate-700 hover:bg-slate-50 dark:hover:bg-slate-800 ${me}`,children:"Скопировать"})]}),u.jsxs("div",{className:"mt-4 pt-3 border-t border-slate-100 dark:border-slate-800",children:[u.jsx("div",{className:"text-xs text-slate-500 mb-1",children:"Прямая ссылка на API:"}),u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx("div",{className:"flex-1 text-xs break-all font-mono bg-slate-50 dark:bg-slate-900 rounded-lg px-3 py-2 text-slate-700 dark:text-slate-300 select-all cursor-text",children:w}),u.jsx(_l,{text:w})]})]}),u.jsxs("div",{className:"text-xs text-slate-500 mt-2",children:["Обновлено: ",u.jsx("span",{className:"text-slate-700 dark:text-slate-300",children:m??"—"})]})]}),u.jsx("div",{className:`${de} p-4`,children:u.jsx("textarea",{value:g?"Загрузка…":j?"":i,readOnly:!0,className:"w-full h-80 rounded-xl px-3 py-2 text-xs border bg-white text-slate-900 border-slate-200 dark:bg-slate-950/60 dark:text-slate-100 dark:border-slate-700 font-mono resize-none"})})]})})}function e0(){return u.jsxs(Cm,{children:[u.jsx(qr,{path:"/",element:u.jsx(Jm,{})}),u.jsx(qr,{path:"/sources",element:u.jsx(Zm,{})}),u.jsx(qr,{path:"/export",element:u.jsx(qm,{})})]})}ks.createRoot(document.getElementById("root")).render(u.jsx(Ne.StrictMode,{children:u.jsx(Um,{children:u.jsx(e0,{})})})); diff --git a/site/assets/index-uS40y9LP.css b/site/assets/index-uS40y9LP.css deleted file mode 100644 index 0fa7f57..0000000 --- a/site/assets/index-uS40y9LP.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.absolute{position:absolute}.relative{position:relative}.left-0{left:0}.right-12{right:3rem}.right-2\.5{right:.625rem}.right-3{right:.75rem}.top-1\/2{top:50%}.z-50{z-index:50}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.h-28{height:7rem}.h-3{height:.75rem}.h-4{height:1rem}.h-7{height:1.75rem}.h-80{height:20rem}.max-h-52{max-height:13rem}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.min-h-screen{min-height:100vh}.w-3{width:.75rem}.w-36{width:9rem}.w-4{width:1rem}.w-56{width:14rem}.w-7{width:1.75rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-3xl{max-width:48rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-slate-50{--tw-border-opacity: 1;border-color:rgb(248 250 252 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-teal-100{--tw-bg-opacity: 1;background-color:rgb(204 251 241 / var(--tw-bg-opacity, 1))}.bg-violet-100{--tw-bg-opacity: 1;background-color:rgb(237 233 254 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/80{background-color:#fffc}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0\.5{padding:.125rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-1{padding-bottom:.25rem}.pb-3{padding-bottom:.75rem}.pb-5{padding-bottom:1.25rem}.pr-10{padding-right:2.5rem}.pr-7{padding-right:1.75rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-teal-600{--tw-text-opacity: 1;color:rgb(13 148 136 / var(--tw-text-opacity, 1))}.text-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.accent-slate-900{accent-color:#0f172a}.opacity-40{opacity:.4}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}@media (max-width: 640px){input[type=checkbox]{width:18px;height:18px;min-width:18px}select,input[type=text],input[type=search]{min-height:44px}}.placeholder\:text-slate-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.placeholder\:text-slate-400::placeholder{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.last\:border-0:last-child{border-width:0px}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-200:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-800:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:text-slate-600:hover{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.hover\:text-slate-900:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-slate-300:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(203 213 225 / var(--tw-ring-opacity, 1))}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-slate-400\/60:focus-visible{--tw-ring-color: rgb(148 163 184 / .6)}.active\:scale-\[0\.99\]:active{--tw-scale-x: .99;--tw-scale-y: .99;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:brightness-95:active{--tw-brightness: brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.disabled\:opacity-50:disabled{opacity:.5}.dark\:border-slate-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity, 1))}.dark\:border-slate-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.dark\:border-slate-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.dark\:border-slate-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(15 23 42 / var(--tw-border-opacity, 1))}.dark\:bg-amber-900\/20:is(.dark *){background-color:#78350f33}.dark\:bg-amber-900\/40:is(.dark *){background-color:#78350f66}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1e3a8a33}.dark\:bg-blue-900\/40:is(.dark *){background-color:#1e3a8a66}.dark\:bg-emerald-900\/40:is(.dark *){background-color:#064e3b66}.dark\:bg-orange-900\/40:is(.dark *){background-color:#7c2d1266}.dark\:bg-red-900\/20:is(.dark *){background-color:#7f1d1d33}.dark\:bg-rose-900\/40:is(.dark *){background-color:#88133766}.dark\:bg-sky-900\/40:is(.dark *){background-color:#0c4a6e66}.dark\:bg-slate-100:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-800\/60:is(.dark *){background-color:#1e293b99}.dark\:bg-slate-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-900\/40:is(.dark *){background-color:#0f172a66}.dark\:bg-slate-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-950\/60:is(.dark *){background-color:#02061799}.dark\:bg-teal-900\/40:is(.dark *){background-color:#134e4a66}.dark\:bg-violet-900\/40:is(.dark *){background-color:#4c1d9566}.dark\:text-amber-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-blue-300:is(.dark *){--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-emerald-300:is(.dark *){--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.dark\:text-orange-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-rose-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.dark\:text-sky-300:is(.dark *){--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.dark\:text-slate-100:is(.dark *){--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.dark\:text-slate-200:is(.dark *){--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.dark\:text-slate-300:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.dark\:text-slate-400:is(.dark *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.dark\:text-slate-500:is(.dark *){--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.dark\:text-slate-900:is(.dark *){--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.dark\:text-teal-400:is(.dark *){--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.dark\:text-violet-300:is(.dark *){--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.dark\:accent-slate-100:is(.dark *){accent-color:#f1f5f9}.dark\:placeholder\:text-slate-500:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-slate-500:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.dark\:hover\:bg-slate-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-slate-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-slate-800\/30:hover:is(.dark *){background-color:#1e293b4d}.dark\:hover\:bg-slate-900\/70:hover:is(.dark *){background-color:#0f172ab3}.dark\:hover\:bg-white:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:hover\:text-slate-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:focus\:ring-slate-700:focus:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity, 1))}.dark\:focus-visible\:ring-slate-500\/50:focus-visible:is(.dark *){--tw-ring-color: rgb(100 116 139 / .5)}@media (min-width: 640px){.sm\:w-auto{width:auto}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:py-2{padding-top:.5rem;padding-bottom:.5rem}.sm\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}} diff --git a/site/assets/telegram-bot.js b/site/assets/telegram-bot.js deleted file mode 100644 index 30881ac..0000000 --- a/site/assets/telegram-bot.js +++ /dev/null @@ -1,28 +0,0 @@ -(function () { - const CARD = - '
' + - '
Telegram-бот для поиска доменов
' + - '

' + - "Если удобнее с телефона или нужен быстрый поиск без браузера — попробуйте " + - '@domain_searchPro_bot. ' + - "Тот же смысл: найти домен, посмотреть IP и выгрузить списки, только в Telegram." + - "

" + - '' + - "Открыть бота →
"; - - function inject() { - if (document.querySelector("[data-telegram-bot-card]")) return; - const host = document.querySelector(".max-w-3xl.mx-auto"); - if (!host) return; - const wrap = document.createElement("div"); - wrap.setAttribute("data-telegram-bot-card", ""); - wrap.className = "mt-4 mb-2"; - wrap.innerHTML = CARD; - host.appendChild(wrap); - } - - const obs = new MutationObserver(() => inject()); - obs.observe(document.body, { childList: true, subtree: true }); - inject(); -})(); diff --git a/site/data/last-update.json b/site/data/last-update.json deleted file mode 100644 index 957fb8b..0000000 --- a/site/data/last-update.json +++ /dev/null @@ -1 +0,0 @@ -{"last_update":"2026-05-24","updating":false,"sources":[{"source_slug":"runetfreedom","source_name":"RuNet Freedom","last_update":"2026-05-24","compatible":"Xray, 3x-ui, V2Ray"},{"source_slug":"loyalsoldier","source_name":"Loyalsoldier","last_update":"2026-05-24","compatible":"Xray, 3x-ui, V2Ray, Mihomo"},{"source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)","last_update":"2026-05-24","compatible":"Xray, 3x-ui"},{"source_slug":"v2fly","source_name":"v2fly (официальный)","last_update":"2026-05-24","compatible":"Xray, 3x-ui, V2Ray, Sing-box"}]} \ No newline at end of file diff --git a/site/data/presets.json b/site/data/presets.json deleted file mode 100644 index b967cdf..0000000 --- a/site/data/presets.json +++ /dev/null @@ -1 +0,0 @@ -[{"group":"Мессенджеры","icon":"💬","slug":"messengers","services":[{"name":"Telegram","domain":"telegram.org","keywords":["telegram"],"categories":[{"full_name":"geoip:telegram","name":"telegram","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:telegram","name":"telegram","type":"geoip","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geoip:telegram","name":"telegram","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:telegram","name":"telegram","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:telegram","name":"telegram","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:telegram","name":"telegram","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"WhatsApp","domain":"whatsapp.com","keywords":["whatsapp"],"categories":[{"full_name":"geosite:whatsapp","name":"whatsapp","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:whatsapp","name":"whatsapp","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:whatsapp","name":"whatsapp","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Viber","domain":"viber.com","keywords":["viber"],"categories":[{"full_name":"geosite:viber","name":"viber","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:viber","name":"viber","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:viber","name":"viber","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Signal","domain":"signal.org","keywords":["signal"],"categories":[{"full_name":"geosite:signal","name":"signal","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:signal","name":"signal","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:signal","name":"signal","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Discord","domain":"discord.com","keywords":["discord"],"categories":[{"full_name":"geosite:discord","name":"discord","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:discord","name":"discord","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:discord","name":"discord","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Skype","domain":"skype.com","keywords":["skype"],"categories":[{"full_name":"geosite:skyperfect","name":"skyperfect","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:skyperfect","name":"skyperfect","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:skyperfect","name":"skyperfect","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]}]},{"group":"Видео","icon":"🎬","slug":"video","services":[{"name":"YouTube","domain":"youtube.com","keywords":["youtube","googlevideo","ytimg"],"categories":[{"full_name":"geosite:youtube","name":"youtube","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:youtube","name":"youtube","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:youtube","name":"youtube","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Netflix","domain":"netflix.com","keywords":["netflix"],"categories":[{"full_name":"geoip:netflix","name":"netflix","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:netflix","name":"netflix","type":"geoip","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geoip:netflix","name":"netflix","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:netflix","name":"netflix","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:netflix","name":"netflix","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:netflix","name":"netflix","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Twitch","domain":"twitch.tv","keywords":["twitch"],"categories":[{"full_name":"geosite:twitch","name":"twitch","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:twitch","name":"twitch","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:twitch","name":"twitch","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"TikTok","domain":"tiktok.com","keywords":["tiktok"],"categories":[{"full_name":"geosite:tiktok","name":"tiktok","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:tiktok","name":"tiktok","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:tiktok","name":"tiktok","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Vimeo","domain":"vimeo.com","keywords":["vimeo"],"categories":[{"full_name":"geosite:vimeo","name":"vimeo","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:vimeo","name":"vimeo","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:vimeo","name":"vimeo","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Rutube","domain":"rutube.ru","keywords":["rutube"],"categories":[{"full_name":"geosite:rutube","name":"rutube","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:rutube","name":"rutube","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:rutube","name":"rutube","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]}]},{"group":"Социальные сети","icon":"🌐","slug":"social","services":[{"name":"Facebook","domain":"facebook.com","keywords":["facebook","meta"],"categories":[{"full_name":"geoip:facebook","name":"facebook","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:facebook","name":"facebook","type":"geoip","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geoip:facebook","name":"facebook","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:facebook","name":"facebook","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:facebook","name":"facebook","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:facebook","name":"facebook","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:facebook-dev","name":"facebook-dev","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:facebook-dev","name":"facebook-dev","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:facebook-dev","name":"facebook-dev","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geoip:meta","name":"meta","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:meta","name":"meta","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:meta","name":"meta","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:meta","name":"meta","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:metabrainz","name":"metabrainz","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:metabrainz","name":"metabrainz","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:metabrainz","name":"metabrainz","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:metacritic","name":"metacritic","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:metacritic","name":"metacritic","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:metacritic","name":"metacritic","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Instagram","domain":"instagram.com","keywords":["instagram"],"categories":[{"full_name":"geosite:instagram","name":"instagram","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:instagram","name":"instagram","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:instagram","name":"instagram","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Twitter/X","domain":"x.com","keywords":["twitter"],"categories":[{"full_name":"geoip:twitter","name":"twitter","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:twitter","name":"twitter","type":"geoip","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geoip:twitter","name":"twitter","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:twitter","name":"twitter","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:twitter","name":"twitter","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:twitter","name":"twitter","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"LinkedIn","domain":"linkedin.com","keywords":["linkedin"],"categories":[{"full_name":"geosite:linkedin","name":"linkedin","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:linkedin","name":"linkedin","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:linkedin","name":"linkedin","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Pinterest","domain":"pinterest.com","keywords":["pinterest"],"categories":[{"full_name":"geosite:pinterest","name":"pinterest","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:pinterest","name":"pinterest","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:pinterest","name":"pinterest","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Reddit","domain":"reddit.com","keywords":["reddit"],"categories":[{"full_name":"geosite:reddit","name":"reddit","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:reddit","name":"reddit","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:reddit","name":"reddit","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Tumblr","domain":"tumblr.com","keywords":["tumblr"],"categories":[{"full_name":"geosite:tumblr","name":"tumblr","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:tumblr","name":"tumblr","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:tumblr","name":"tumblr","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]}]},{"group":"Музыка","icon":"🎵","slug":"music","services":[{"name":"Spotify","domain":"spotify.com","keywords":["spotify"],"categories":[{"full_name":"geosite:spotify","name":"spotify","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:spotify","name":"spotify","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:spotify","name":"spotify","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Apple Music","domain":"apple.com","keywords":["apple","itunes"],"categories":[{"full_name":"geoip:apple","name":"apple","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:apple","name":"apple","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:apple","name":"apple","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:apple","name":"apple","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:apple-cn","name":"apple-cn","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:apple-dev","name":"apple-dev","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:apple-dev","name":"apple-dev","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:apple-dev","name":"apple-dev","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:apple-intelligence","name":"apple-intelligence","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:apple-intelligence","name":"apple-intelligence","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:itunes","name":"itunes","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:itunes","name":"itunes","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:itunes","name":"itunes","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"SoundCloud","domain":"soundcloud.com","keywords":["soundcloud"],"categories":[{"full_name":"geosite:soundcloud","name":"soundcloud","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:soundcloud","name":"soundcloud","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:soundcloud","name":"soundcloud","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Deezer","domain":"deezer.com","keywords":["deezer"],"categories":[{"full_name":"geosite:deezer","name":"deezer","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:deezer","name":"deezer","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:deezer","name":"deezer","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Last.fm","domain":"last.fm","keywords":["lastfm"],"categories":[{"full_name":"geosite:lastfm","name":"lastfm","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:lastfm","name":"lastfm","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:lastfm","name":"lastfm","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]}]},{"group":"Искусственный интеллект","icon":"🤖","slug":"ai","services":[{"name":"ChatGPT","domain":"openai.com","keywords":["openai","chatgpt"],"categories":[{"full_name":"geosite:openai","name":"openai","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:openai","name":"openai","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:openai","name":"openai","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Claude","domain":"anthropic.com","keywords":["claude","anthropic"],"categories":[{"full_name":"geoip:anthropic","name":"anthropic","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:anthropic","name":"anthropic","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:anthropic","name":"anthropic","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:anthropic","name":"anthropic","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Gemini","domain":"gemini.google.com","keywords":["gemini","bard"],"categories":[{"full_name":"geosite:google-gemini","name":"google-gemini","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:google-gemini","name":"google-gemini","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:google-gemini","name":"google-gemini","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Midjourney","domain":"midjourney.com","keywords":["midjourney"],"categories":[]},{"name":"Hugging Face","domain":"huggingface.co","keywords":["huggingface"],"categories":[{"full_name":"geosite:huggingface","name":"huggingface","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:huggingface","name":"huggingface","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:huggingface","name":"huggingface","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Perplexity","domain":"perplexity.ai","keywords":["perplexity"],"categories":[{"full_name":"geosite:perplexity","name":"perplexity","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:perplexity","name":"perplexity","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:perplexity","name":"perplexity","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Stability AI","domain":"stability.ai","keywords":["stability"],"categories":[]}]},{"group":"Игры","icon":"🎮","slug":"games","services":[{"name":"Steam","domain":"store.steampowered.com","keywords":["steam","steamcontent"],"categories":[{"full_name":"geosite:steam","name":"steam","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:steam","name":"steam","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:steam","name":"steam","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:steaminventoryhelper","name":"steaminventoryhelper","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:steaminventoryhelper","name":"steaminventoryhelper","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:steaminventoryhelper","name":"steaminventoryhelper","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:steamunlocked","name":"steamunlocked","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:steamunlocked","name":"steamunlocked","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:steamunlocked","name":"steamunlocked","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Epic Games","domain":"epicgames.com","keywords":["epicgames","epic"],"categories":[{"full_name":"geoip:epicgames","name":"epicgames","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:epicgames","name":"epicgames","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:epicgames","name":"epicgames","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:epicgames","name":"epicgames","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:epicbrowser","name":"epicbrowser","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:epicbrowser","name":"epicbrowser","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:epicbrowser","name":"epicbrowser","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"PlayStation","domain":"playstation.com","keywords":["playstation","psn"],"categories":[{"full_name":"geosite:playstation","name":"playstation","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:playstation","name":"playstation","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:playstation","name":"playstation","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Xbox","domain":"xbox.com","keywords":["xbox","xboxlive"],"categories":[{"full_name":"geosite:xbox","name":"xbox","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:xbox","name":"xbox","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:xbox","name":"xbox","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"EA / Origin","domain":"ea.com","keywords":["ea.com","origin","easports"],"categories":[{"full_name":"geosite:origin","name":"origin","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:origin","name":"origin","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:origin","name":"origin","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Blizzard","domain":"blizzard.com","keywords":["blizzard","battle.net"],"categories":[{"full_name":"geoip:blizzard","name":"blizzard","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:blizzard","name":"blizzard","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:blizzard","name":"blizzard","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:blizzard","name":"blizzard","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Riot Games","domain":"riotgames.com","keywords":["riotgames","valorant"],"categories":[]},{"name":"Roblox","domain":"roblox.com","keywords":["roblox"],"categories":[{"full_name":"geoip:roblox","name":"roblox","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:roblox","name":"roblox","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:roblox","name":"roblox","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:roblox","name":"roblox","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Minecraft","domain":"minecraft.net","keywords":["minecraft","mojang"],"categories":[{"full_name":"geosite:mojang","name":"mojang","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:mojang","name":"mojang","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:mojang","name":"mojang","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"GOG","domain":"gog.com","keywords":["gog"],"categories":[{"full_name":"geosite:gog","name":"gog","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:gog","name":"gog","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:gog","name":"gog","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]}]},{"group":"Работа и инструменты","icon":"💼","slug":"work","services":[{"name":"Google","domain":"google.com","keywords":["google","googleapis"],"categories":[{"full_name":"geoip:google","name":"google","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:google","name":"google","type":"geoip","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geoip:google","name":"google","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:google","name":"google","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:google","name":"google","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:google","name":"google","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:google-cn","name":"google-cn","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:google-deepmind","name":"google-deepmind","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:google-deepmind","name":"google-deepmind","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:google-deepmind","name":"google-deepmind","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Microsoft","domain":"microsoft.com","keywords":["microsoft","office365"],"categories":[{"full_name":"geosite:microsoft","name":"microsoft","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:microsoft","name":"microsoft","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:microsoft","name":"microsoft","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:microsoft-dev","name":"microsoft-dev","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:microsoft-dev","name":"microsoft-dev","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:microsoft-dev","name":"microsoft-dev","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:microsoft-pki","name":"microsoft-pki","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:microsoft-pki","name":"microsoft-pki","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:microsoft-pki","name":"microsoft-pki","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Zoom","domain":"zoom.us","keywords":["zoom"],"categories":[{"full_name":"geosite:zoom","name":"zoom","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:zoom","name":"zoom","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:zoom","name":"zoom","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Slack","domain":"slack.com","keywords":["slack"],"categories":[{"full_name":"geosite:slack","name":"slack","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:slack","name":"slack","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:slack","name":"slack","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Notion","domain":"notion.so","keywords":["notion"],"categories":[{"full_name":"geosite:notion","name":"notion","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:notion","name":"notion","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:notion","name":"notion","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Figma","domain":"figma.com","keywords":["figma"],"categories":[{"full_name":"geosite:figma","name":"figma","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:figma","name":"figma","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:figma","name":"figma","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"GitHub","domain":"github.com","keywords":["github","githubusercontent"],"categories":[{"full_name":"geoip:github","name":"github","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:github","name":"github","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:github","name":"github","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:github","name":"github","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:github-copilot","name":"github-copilot","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:github-copilot","name":"github-copilot","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:github-copilot","name":"github-copilot","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:github1s","name":"github1s","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:github1s","name":"github1s","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:github1s","name":"github1s","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"AnyDesk","domain":"anydesk.com","keywords":["anydesk"],"categories":[]},{"name":"TeamViewer","domain":"teamviewer.com","keywords":["teamviewer"],"categories":[{"full_name":"geosite:teamviewer","name":"teamviewer","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:teamviewer","name":"teamviewer","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:teamviewer","name":"teamviewer","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Atlassian","domain":"atlassian.com","keywords":["atlassian","jira"],"categories":[{"full_name":"geosite:atlassian","name":"atlassian","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:atlassian","name":"atlassian","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:atlassian","name":"atlassian","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]}]},{"group":"CDN и инфраструктура","icon":"☁️","slug":"cdn","services":[{"name":"Cloudflare","domain":"cloudflare.com","keywords":["cloudflare"],"categories":[{"full_name":"geoip:cloudflare","name":"cloudflare","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:cloudflare","name":"cloudflare","type":"geoip","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geoip:cloudflare","name":"cloudflare","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:cloudflare","name":"cloudflare","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:cloudflare","name":"cloudflare","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:cloudflare","name":"cloudflare","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:cloudflare-cn","name":"cloudflare-cn","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:cloudflare-cn","name":"cloudflare-cn","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:cloudflare-cn","name":"cloudflare-cn","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:cloudflare-ipfs","name":"cloudflare-ipfs","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"}]},{"name":"Akamai","domain":"akamai.com","keywords":["akamai"],"categories":[{"full_name":"geoip:akamai","name":"akamai","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:akamai","name":"akamai","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:akamai","name":"akamai","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:akamai","name":"akamai","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Fastly","domain":"fastly.com","keywords":["fastly"],"categories":[{"full_name":"geoip:fastly","name":"fastly","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:fastly","name":"fastly","type":"geoip","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geoip:fastly","name":"fastly","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:fastly","name":"fastly","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:fastly","name":"fastly","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:fastly","name":"fastly","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Amazon AWS","domain":"aws.amazon.com","keywords":["amazon","amazonaws"],"categories":[{"full_name":"geoip:amazon","name":"amazon","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geosite:amazon","name":"amazon","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:amazon","name":"amazon","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:amazon","name":"amazon","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:amazontrust","name":"amazontrust","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:amazontrust","name":"amazontrust","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:amazontrust","name":"amazontrust","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"}]},{"name":"Google Cloud","domain":"cloud.google.com","keywords":["googleusercontent","gstatic"],"categories":[]}]},{"group":"Заблокировано в РФ","icon":"🛡️","slug":"blocked_ru","services":[{"name":"Список РКН","domain":"rkn.gov.ru","keywords":["ru-blocked","rkn","russia-blocked"],"categories":[{"full_name":"geoip:ru-blocked","name":"ru-blocked","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:ru-blocked","name":"ru-blocked","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geoip:ru-blocked-community","name":"ru-blocked-community","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:ru-blocked-community","name":"ru-blocked-community","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:category-media-ru-blocked","name":"category-media-ru-blocked","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:category-media-ru-blocked","name":"category-media-ru-blocked","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:category-media-ru-blocked","name":"category-media-ru-blocked","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:ru-blocked","name":"ru-blocked","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:ru-blocked-all","name":"ru-blocked-all","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"}]},{"name":"Антифильтр","domain":"antifilter.download","keywords":["antifilter"],"categories":[{"full_name":"geosite:antifilter-download","name":"antifilter-download","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:antifilter-download-community","name":"antifilter-download-community","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"}]},{"name":"Заблокировано","domain":"geoexport.org","keywords":["blocked"],"categories":[{"full_name":"geoip:ru-blocked","name":"ru-blocked","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:ru-blocked","name":"ru-blocked","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geoip:ru-blocked-community","name":"ru-blocked-community","type":"geoip","source_slug":"daniellavrushin","source_name":"DanielLavrushin (b4geoip)"},{"full_name":"geoip:ru-blocked-community","name":"ru-blocked-community","type":"geoip","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:category-media-ru-blocked","name":"category-media-ru-blocked","type":"geosite","source_slug":"loyalsoldier","source_name":"Loyalsoldier"},{"full_name":"geosite:category-media-ru-blocked","name":"category-media-ru-blocked","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:category-media-ru-blocked","name":"category-media-ru-blocked","type":"geosite","source_slug":"v2fly","source_name":"v2fly (официальный)"},{"full_name":"geosite:ru-blocked","name":"ru-blocked","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"},{"full_name":"geosite:ru-blocked-all","name":"ru-blocked-all","type":"geosite","source_slug":"runetfreedom","source_name":"RuNet Freedom"}]}]}] \ No newline at end of file diff --git a/site/data/routing-presets.json b/site/data/routing-presets.json deleted file mode 100644 index c83bde0..0000000 --- a/site/data/routing-presets.json +++ /dev/null @@ -1 +0,0 @@ -{"presets":{"direct_sites":[{"id":"ru_sites","label":"Российские сайты","description":"Домены .ru, .рф и российские сервисы — идут напрямую без VPN","value":"geosite:category-ru","checked":true},{"id":"ru_whitelist","label":"Белый список РФ","description":"Дополнительный список российских сервисов и госсайтов","value":"geosite:whitelist","checked":true},{"id":"private","label":"Локальная сеть","description":"192.168.x.x, 10.x.x.x и другие приватные адреса — всегда напрямую","value":"geosite:private","checked":true},{"id":"apple","label":"Apple","description":"iCloud, App Store, Apple Maps — для корректной работы устройства","value":"geosite:apple","checked":true},{"id":"microsoft","label":"Microsoft","description":"Windows Update, Office, Teams — экономия трафика VPN","value":"geosite:microsoft","checked":false},{"id":"steam","label":"Steam","description":"Игры и обновления Steam — напрямую для скорости","value":"geosite:steam","checked":false},{"id":"google_cn","label":"Google (доступные сервисы)","description":"Сервисы Google доступные в РФ без VPN","value":"geosite:google@cn","checked":false}],"direct_ips":[{"id":"geoip_ru","label":"IP-адреса России","description":"Все российские IP-диапазоны — напрямую","value":"geoip:ru","checked":true},{"id":"geoip_private","label":"Приватные IP","description":"10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16","value":"geoip:private","checked":true}],"proxy_sites":[{"id":"youtube","label":"YouTube","description":"YouTube заблокирован в РФ — направляем через VPN","value":"geosite:youtube","checked":true},{"id":"telegram","label":"Telegram","description":"Серверы Telegram — через VPN для надёжности","value":"geosite:telegram","checked":true},{"id":"meta","label":"Meta (Instagram, Facebook)","description":"Instagram и Facebook заблокированы в РФ","value":"geosite:facebook","checked":true},{"id":"twitter","label":"Twitter / X","description":"Twitter заблокирован в РФ","value":"geosite:twitter","checked":true},{"id":"netflix","label":"Netflix","description":"Netflix недоступен в РФ","value":"geosite:netflix","checked":false},{"id":"spotify","label":"Spotify","description":"Spotify недоступен в РФ","value":"geosite:spotify","checked":false},{"id":"github","label":"GitHub","description":"GitHub периодически блокируется в РФ","value":"geosite:github","checked":false},{"id":"geolocation_notcn","label":"Все заблокированные (универсальный)","description":"Весь иностранный трафик не из РФ/CN — через VPN. Осторожно: большой список","value":"geosite:geolocation-!cn","checked":false}],"proxy_ips":[{"id":"geoip_telegram","label":"IP Telegram","description":"IP-диапазоны серверов Telegram","value":"geoip:telegram","checked":true}],"block_sites":[{"id":"ads","label":"Реклама","description":"Рекламные домены — блокируем полностью","value":"geosite:category-ads-all","checked":true}],"block_ips":[]},"geo_sources":{"loyalsoldier":{"label":"Loyalsoldier (рекомендуется)","geoip":"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat","geosite":"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"},"runetfreedom":{"label":"RuNet Freedom (РКН + Россия)","geoip":"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geoip.dat","geosite":"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geosite.dat"},"daniellavrushin":{"label":"DanielLavrushin (расширенная)","geoip":"https://github.com/DanielLavrushin/b4geoip/releases/latest/download/geoip.dat","geosite":"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"},"v2fly":{"label":"v2fly (оригинальная)","geoip":"https://github.com/v2fly/geoip/releases/latest/download/geoip.dat","geosite":"https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat"}},"route_orders":[{"value":"block-direct-proxy","label":"Блок → Прямой → VPN (рекомендуется)"},{"value":"block-proxy-direct","label":"Блок → VPN → Прямой"},{"value":"proxy-direct-block","label":"VPN → Прямой → Блок"}],"dns_types":[{"value":"DoH","label":"DoH (DNS over HTTPS, рекомендуется)"},{"value":"DoU","label":"DoU (DNS over UDP, быстрее)"}]} \ No newline at end of file diff --git a/site/data/sources.json b/site/data/sources.json deleted file mode 100644 index a1e7667..0000000 --- a/site/data/sources.json +++ /dev/null @@ -1 +0,0 @@ -[{"slug":"runetfreedom","name":"RuNet Freedom","description":"Российские правила блокировок, оптимизировано для обхода РКН","compatible":"Xray, 3x-ui, V2Ray","geoip_url":"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geoip.dat","geosite_url":"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geosite.dat"},{"slug":"loyalsoldier","name":"Loyalsoldier","description":"Популярный набор правил, стандарт для большинства клиентов","compatible":"Xray, 3x-ui, V2Ray, Mihomo","geoip_url":"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat","geosite_url":"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"},{"slug":"daniellavrushin","name":"DanielLavrushin (b4geoip)","description":"Расширенная база с дополнительными категориями (Akamai, CDN и др.)","compatible":"Xray, 3x-ui","geoip_url":"https://github.com/DanielLavrushin/b4geoip/releases/latest/download/geoip.dat","geosite_url":null},{"slug":"v2fly","name":"v2fly (официальный)","description":"Официальные базы проекта v2fly/domain-list-community","compatible":"Xray, 3x-ui, V2Ray, Sing-box","geoip_url":"https://github.com/v2fly/geoip/releases/latest/download/geoip.dat","geosite_url":"https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat"}] \ No newline at end of file diff --git a/site/index.html b/site/index.html deleted file mode 100644 index a26fe7b..0000000 --- a/site/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - GeoExport - - - - -
- - - diff --git a/site/package.json b/site/package.json deleted file mode 100644 index 8e5ce0b..0000000 --- a/site/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "geoexport-clone", - "private": true, - "version": "1.0.0", - "description": "Local mirror of https://geoexport.org/", - "scripts": { - "start": "node server.mjs", - "dev": "node server.mjs", - "patch": "node patch-bundle.mjs", - "prestart": "node patch-bundle.mjs" - }, - "engines": { - "node": ">=18" - } -} diff --git a/site/patch-bundle.mjs b/site/patch-bundle.mjs deleted file mode 100644 index b4c3c8b..0000000 --- a/site/patch-bundle.mjs +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env node -/** - * Patches GeoExport SPA bundle: export preview/download fixes + shared fetch helper. - */ -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const bundlePath = path.join(__dirname, "assets", "index-VQj200iM.js"); - -const HELPER = `async function _gxf(cats,type,fmt,source,label){const w=new URLSearchParams;cats.forEach(z=>w.append("category",z)),w.set("type",type);const af=fmt==="single-line"||fmt==="keenetic-ip"?"plain-lines":fmt;w.set("format",af),source&&w.set("source",source);const r=await fetch(\`/api/export?\${w}\`);if(!r.ok){const e=await r.json().catch(()=>({}));throw new Error(e.detail||r.statusText||"Ошибка экспорта")}let t=await r.text();if(!t.trim())return"Нет данных для выбранных категорий, типа или источника. Попробуйте «Все» в фильтре источников или тип «Домены» / «IPv4».";if(fmt==="single-line")t=t.trim().split(/\\r?\\n/).join(",");if(fmt==="keenetic-ip"){const lines=t.trim().split(/\\r?\\n/).filter(x=>/^\\d/.test(x)&&x.includes("/")&&!x.includes(":"));t=lines.length?lines.map(line=>{const[ip,bits]=line.split("/"),n=parseInt(bits??"32",10),mask=n===32?"255.255.255.255":Array.from({length:4},(_,i)=>(65280>>Math.min(8,Math.max(0,n-i*8)))&255).join(".");return\`route ADD \${ip} MASK \${mask} 0.0.0.0 & rem \${label||cats[0]||"export"}\`}).join("\\n"):"Нет IPv4-подсетей для Keenetic. Выберите тип «IPv4» или «Домены + IPv4»."}return t}`; - -const REPLACEMENTS = [ - { - from: "function bm({svc:e,sources:t,sourceFilter:n})", - to: `${HELPER}function bm({svc:e,sources:t,sourceFilter:n})`, - }, - { - from: 'p=async()=>{if(f){a(!0);try{const w=new URLSearchParams;C.forEach(z=>w.append("category",z.full_name)),w.set("type",m),w.set("format",c==="single-line"?"plain-lines":c),n!=="all"&&w.set("source",n);let P=await(await fetch(`/api/export?${w}`)).text();c==="single-line"&&(P=P.trim().split(/\\r?\\n/).join(",")),o(P)}finally{a(!1)}}}', - to: 'p=async()=>{if(f){a(!0);try{o(await _gxf(C.map(z=>z.full_name),m,c,n!=="all"?n:"",e.name))}catch(w){o(w.message||"Ошибка экспорта")}finally{a(!1)}}}', - }, - { - from: 'function qm(){const[e]=hi(),t=e.getAll("category"),n=e.get("source"),[r,l]=k.useState("domains,ip4,ip6"),[s,o]=k.useState("plain-lines"),', - to: 'function qm(){const[e]=hi(),t=e.getAll("category"),n=e.get("source"),[r,l]=k.useState(e.get("type")||"domains,ip4,ip6"),[s,o]=k.useState(e.get("format")||"plain-lines"),', - }, - { - from: 'const p=k.useCallback(async()=>{if(t.length){y(!0),C(null);try{const S=new URLSearchParams;t.forEach(T=>S.append("category",T)),S.set("type",r),S.set("format",s==="single-line"?"plain-lines":s),n&&S.set("source",n);const P=await fetch(`/api/export?${S}`);if(!P.ok){const T=await P.json().catch(()=>({}));C(T.detail??P.statusText),a(""),h(0);return}let z=await P.text();s==="single-line"&&(z=z.trim().split(/\\r?\\n/).join(",")),a(z),h(z.trim()?z.trim().split(/[,\\r?\\n]/).filter(Boolean).length:0)}finally{y(!1)}}},[t.join(","),r,s,n]);', - to: 'const p=k.useCallback(async()=>{if(!t.length){a(""),C(null),h(0);return}y(!0),C(null);try{const z=await _gxf(t,r,s,n||"",t[0]);a(z),h(z.trim()&&!z.startsWith("Нет ")?z.trim().split(/[,\\r?\\n]/).filter(Boolean).length:0)}catch(S){C(S.message||"Ошибка экспорта"),a(""),h(0)}finally{y(!1)}},[t.join(","),r,s,n]);', - }, - { - from: 'value:g?"Загрузка…":j?"":i,readOnly:!0,className:"w-full h-80', - to: 'value:g?"Загрузка…":j||i||(!t.length?"Выберите категории на главной и нажмите «Открыть экспорт →», либо добавьте ?category=geoip:telegram в адрес.":""),readOnly:!0,className:"w-full h-80', - }, -]; - -let src = fs.readFileSync(bundlePath, "utf8"); - -if (src.includes("async function _gxf(")) { - console.log("Already patched:", bundlePath); - process.exit(0); -} - -for (const { from, to } of REPLACEMENTS) { - if (!src.includes(from)) { - console.error("Patch anchor not found:", from.slice(0, 80)); - process.exit(1); - } - src = src.replace(from, to); -} - -fs.writeFileSync(bundlePath, src); -console.log("Patched", bundlePath); diff --git a/site/server.mjs b/site/server.mjs deleted file mode 100644 index 69679d1..0000000 --- a/site/server.mjs +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/env node -/** - * Local GeoExport mirror: static assets + cached JSON + proxy for dynamic API. - */ -import http from "node:http"; -import https from "node:https"; -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const PORT = Number(process.env.PORT) || 4173; -const UPSTREAM = "geoexport.org"; - -const LOCAL_API = new Set([ - "/api/presets", - "/api/sources", - "/api/last-update", - "/api/routing/presets", -]); - -const DATA_MAP = { - "/api/presets": "presets.json", - "/api/sources": "sources.json", - "/api/last-update": "last-update.json", - "/api/routing/presets": "routing-presets.json", -}; - -const MIME = { - ".html": "text/html; charset=utf-8", - ".js": "text/javascript; charset=utf-8", - ".css": "text/css; charset=utf-8", - ".json": "application/json; charset=utf-8", - ".ico": "image/x-icon", - ".svg": "image/svg+xml", - ".png": "image/png", -}; - -function send(res, status, body, headers = {}) { - res.writeHead(status, headers); - res.end(body); -} - -function serveFile(res, filePath) { - const ext = path.extname(filePath); - const type = MIME[ext] || "application/octet-stream"; - fs.readFile(filePath, (err, data) => { - if (err) { - send(res, 404, "Not found"); - return; - } - send(res, 200, data, { "Content-Type": type }); - }); -} - -function serveLocalApi(res, pathname) { - const file = DATA_MAP[pathname]; - if (!file) { - send(res, 404, JSON.stringify({ error: "unknown local api" }), { - "Content-Type": "application/json", - }); - return; - } - const full = path.join(__dirname, "data", file); - fs.readFile(full, (err, data) => { - if (err) { - send(res, 500, JSON.stringify({ error: err.message }), { - "Content-Type": "application/json", - }); - return; - } - send(res, 200, data, { - "Content-Type": "application/json; charset=utf-8", - "Cache-Control": "no-cache", - }); - }); -} - -function proxyToUpstream(req, res) { - const options = { - hostname: UPSTREAM, - port: 443, - path: req.url, - method: req.method, - headers: { - ...req.headers, - host: UPSTREAM, - }, - }; - - const proxyReq = https.request(options, (proxyRes) => { - const headers = { ...proxyRes.headers }; - delete headers["content-security-policy"]; - res.writeHead(proxyRes.statusCode || 502, headers); - proxyRes.pipe(res); - }); - - proxyReq.on("error", (err) => { - send(res, 502, JSON.stringify({ error: `Upstream error: ${err.message}` }), { - "Content-Type": "application/json", - }); - }); - - req.pipe(proxyReq); -} - -function handler(req, res) { - const url = new URL(req.url, `http://127.0.0.1:${PORT}`); - let pathname = decodeURIComponent(url.pathname); - - if (pathname.startsWith("/api/")) { - if (LOCAL_API.has(pathname)) { - serveLocalApi(res, pathname); - return; - } - proxyToUpstream(req, res); - return; - } - - if (pathname === "/") pathname = "/index.html"; - - const safe = path.normalize(pathname).replace(/^(\.\.[/\\])+/, ""); - const filePath = path.join(__dirname, safe); - - if (!filePath.startsWith(__dirname)) { - send(res, 403, "Forbidden"); - return; - } - - fs.stat(filePath, (err, stat) => { - if (err || !stat.isFile()) { - if (!path.extname(pathname)) { - serveFile(res, path.join(__dirname, "index.html")); - return; - } - send(res, 404, "Not found"); - return; - } - serveFile(res, filePath); - }); -} - -http.createServer(handler).listen(PORT, () => { - console.log(`GeoExport clone: http://127.0.0.1:${PORT}`); - console.log(`Static + local JSON; export/search/lookup proxied to ${UPSTREAM}`); -}); diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx deleted file mode 100644 index 64c3c9d..0000000 --- a/src/app/admin/page.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { auth } from "@/lib/auth"; -import { prisma } from "@/lib/prisma"; -import { redirect } from "next/navigation"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; - -export default async function AdminPage() { - const session = await auth(); - if (!session?.user || session.user.role !== "ADMIN") { - redirect("/login"); - } - - const [users, scans] = await Promise.all([ - prisma.user.count(), - prisma.scan.count(), - ]); - - return ( -
-

Admin

-
- - - Users - - {users} - - - - Scans - - {scans} - -
-
- ); -} diff --git a/src/app/analytics/page.tsx b/src/app/analytics/page.tsx deleted file mode 100644 index 4406f73..0000000 --- a/src/app/analytics/page.tsx +++ /dev/null @@ -1,140 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { - Bar, - BarChart, - CartesianGrid, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from "recharts"; -import { motion } from "framer-motion"; -import { Download, TrendingUp } from "lucide-react"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; - -type Stats = { - total: number; - completed: number; - failed: number; - successRate: number; - daily: { date: string; scans: number; completed: number }[]; - topDomains: { domain: string; count: number }[]; -}; - -export default function AnalyticsPage() { - const [stats, setStats] = useState(null); - - useEffect(() => { - fetch("/api/analytics/stats") - .then((r) => r.json()) - .then(setStats) - .catch(() => setStats(null)); - }, []); - - const exportSummary = () => { - if (!stats) return; - const blob = new Blob([JSON.stringify(stats, null, 2)], { - type: "application/json", - }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = "domain-scanner-analytics.json"; - a.click(); - URL.revokeObjectURL(url); - }; - - return ( -
-
-
-

Analytics

-

- Scan volume, success rate, and top domains — last 7 days. -

-
- -
- -
- {[ - { label: "Total scans", value: stats?.total ?? "—" }, - { label: "Success rate", value: stats ? `${stats.successRate}%` : "—" }, - { label: "Failed", value: stats?.failed ?? "—" }, - ].map((kpi, i) => ( - - - -

{kpi.label}

-

{kpi.value}

-
-
-
- ))} -
- - - - - Scans per day - - - - {stats?.daily.length ? ( - - - - - - - - - - - ) : ( -

- Run scans from the dashboard to populate charts. -

- )} -
-
- - {stats?.topDomains.length ? ( - - - Top domains - - -
    - {stats.topDomains.map((d) => ( -
  • - {d.domain} - {d.count} scans -
  • - ))} -
-
-
- ) : null} -
- ); -} diff --git a/src/app/api-docs/page.tsx b/src/app/api-docs/page.tsx deleted file mode 100644 index d72b054..0000000 --- a/src/app/api-docs/page.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; - -export default function ApiDocsPage() { - return ( -
-

API

-

REST endpoints for domain scans and exports.

- -
- {[ - { - method: "POST", - path: "/api/scan", - body: '{ "domain": "example.com" }', - desc: "Start a scan. Returns scan id.", - }, - { - method: "GET", - path: "/api/scan/:id", - desc: "Poll scan status and result.", - }, - { - method: "GET", - path: "/api/scan/:id/stream", - desc: "SSE stream for live progress.", - }, - { - method: "GET", - path: "/api/export?id=&format=json|csv", - desc: "Download completed scan.", - }, - { - method: "GET", - path: "/api/health", - desc: "Health check.", - }, - ].map((ep) => ( - - - - {ep.method} {ep.path} - - - -

{ep.desc}

- {ep.body && ( -
-                  {ep.body}
-                
- )} -
-
- ))} -
-
- ); -} diff --git a/src/app/api/analytics/stats/route.ts b/src/app/api/analytics/stats/route.ts deleted file mode 100644 index 3976bea..0000000 --- a/src/app/api/analytics/stats/route.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { NextResponse } from "next/server"; -import { prisma } from "@/lib/prisma"; - -export async function GET() { - const [total, completed, failed, last7] = await Promise.all([ - prisma.scan.count(), - prisma.scan.count({ where: { status: "COMPLETED" } }), - prisma.scan.count({ where: { status: "FAILED" } }), - prisma.scan.findMany({ - where: { - createdAt: { gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) }, - }, - select: { createdAt: true, status: true }, - orderBy: { createdAt: "asc" }, - }), - ]); - - const byDay = new Map(); - for (const row of last7) { - const key = row.createdAt.toISOString().slice(0, 10); - const cur = byDay.get(key) ?? { scans: 0, completed: 0 }; - cur.scans += 1; - if (row.status === "COMPLETED") cur.completed += 1; - byDay.set(key, cur); - } - - const daily = [...byDay.entries()].map(([date, v]) => ({ - date, - scans: v.scans, - completed: v.completed, - })); - - const topDomains = await prisma.scan.groupBy({ - by: ["domain"], - _count: { domain: true }, - orderBy: { _count: { domain: "desc" } }, - take: 8, - }); - - return NextResponse.json({ - total, - completed, - failed, - successRate: total ? Math.round((completed / total) * 100) : 0, - daily, - topDomains: topDomains.map((d) => ({ - domain: d.domain, - count: d._count.domain, - })), - }); -} diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts deleted file mode 100644 index c55a45e..0000000 --- a/src/app/api/auth/[...nextauth]/route.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { handlers } from "@/lib/auth"; - -export const { GET, POST } = handlers; diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts deleted file mode 100644 index d6aa3ea..0000000 --- a/src/app/api/auth/register/route.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { z } from "zod"; -import bcrypt from "bcryptjs"; -import { prisma } from "@/lib/prisma"; - -const bodySchema = z.object({ - email: z.string().email().max(255), - password: z.string().min(8).max(128), - name: z.string().max(120).optional(), -}); - -export async function POST(req: NextRequest) { - let body: z.infer; - try { - body = bodySchema.parse(await req.json()); - } catch { - return NextResponse.json({ error: "Invalid request" }, { status: 400 }); - } - - const email = body.email.toLowerCase(); - const existing = await prisma.user.findUnique({ where: { email } }); - if (existing) { - return NextResponse.json({ error: "Email already registered" }, { status: 409 }); - } - - const seedEmail = process.env.SEED_ADMIN_EMAIL?.toLowerCase(); - const role = - seedEmail && email === seedEmail ? ("ADMIN" as const) : ("USER" as const); - - const passwordHash = await bcrypt.hash(body.password, 12); - const user = await prisma.user.create({ - data: { - email, - name: body.name, - passwordHash, - role, - }, - select: { id: true, email: true, role: true }, - }); - - return NextResponse.json({ user }, { status: 201 }); -} diff --git a/src/app/api/export/route.ts b/src/app/api/export/route.ts deleted file mode 100644 index bdc5723..0000000 --- a/src/app/api/export/route.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { prisma } from "@/lib/prisma"; - -export async function GET(req: NextRequest) { - const id = req.nextUrl.searchParams.get("id"); - const format = req.nextUrl.searchParams.get("format") ?? "json"; - - if (!id) { - return NextResponse.json({ error: "Missing scan id" }, { status: 400 }); - } - - const scan = await prisma.scan.findUnique({ where: { id } }); - if (!scan?.result) { - return NextResponse.json({ error: "Scan result not found" }, { status: 404 }); - } - - if (format === "csv") { - const result = scan.result as Record; - const rows = [ - ["field", "value"], - ["domain", scan.domain], - ["scanned_at", String(result.scannedAt ?? "")], - ["ssl_valid", String((result.ssl as { valid?: boolean })?.valid ?? "")], - ["security_score", String((result.security as { score?: number })?.score ?? "")], - ["security_grade", String((result.security as { grade?: string })?.grade ?? "")], - ["uptime_reachable", String((result.uptime as { reachable?: boolean })?.reachable ?? "")], - ]; - const csv = rows.map((r) => r.map((c) => `"${c.replace(/"/g, '""')}"`).join(",")).join("\n"); - return new NextResponse(csv, { - headers: { - "Content-Type": "text/csv", - "Content-Disposition": `attachment; filename="${scan.domain}-scan.csv"`, - }, - }); - } - - return NextResponse.json(scan.result, { - headers: { - "Content-Disposition": `attachment; filename="${scan.domain}-scan.json"`, - }, - }); -} diff --git a/src/app/api/health/route.ts b/src/app/api/health/route.ts deleted file mode 100644 index ca5e3a5..0000000 --- a/src/app/api/health/route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NextResponse } from "next/server"; -import { prisma } from "@/lib/prisma"; - -export async function GET() { - try { - await prisma.$queryRaw`SELECT 1`; - return NextResponse.json({ status: "ok", db: true }); - } catch { - return NextResponse.json({ status: "degraded", db: false }, { status: 503 }); - } -} diff --git a/src/app/api/monitors/route.ts b/src/app/api/monitors/route.ts deleted file mode 100644 index a745b97..0000000 --- a/src/app/api/monitors/route.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { z } from "zod"; -import { auth } from "@/lib/auth"; -import { prisma } from "@/lib/prisma"; -import { normalizeDomain, isValidDomain } from "@/lib/utils"; - -const bodySchema = z.object({ - domain: z.string(), - type: z.enum(["DNS", "SSL", "UPTIME"]), -}); - -export async function GET() { - const session = await auth(); - if (!session?.user?.id) { - return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); - } - const monitors = await prisma.monitor.findMany({ - where: { userId: session.user.id }, - orderBy: { createdAt: "desc" }, - }); - return NextResponse.json({ monitors }); -} - -export async function POST(req: NextRequest) { - const session = await auth(); - if (!session?.user?.id) { - return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); - } - - let body: z.infer; - try { - body = bodySchema.parse(await req.json()); - } catch { - return NextResponse.json({ error: "Invalid body" }, { status: 400 }); - } - - const domain = normalizeDomain(body.domain); - if (!isValidDomain(domain)) { - return NextResponse.json({ error: "Invalid domain" }, { status: 400 }); - } - - const monitor = await prisma.monitor.create({ - data: { - domain, - type: body.type, - userId: session.user.id, - }, - }); - - return NextResponse.json({ monitor }, { status: 201 }); -} diff --git a/src/app/api/scan/[id]/route.ts b/src/app/api/scan/[id]/route.ts deleted file mode 100644 index 58d7d95..0000000 --- a/src/app/api/scan/[id]/route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { prisma } from "@/lib/prisma"; - -export async function GET( - _req: NextRequest, - { params }: { params: Promise<{ id: string }> } -) { - const { id } = await params; - const scan = await prisma.scan.findUnique({ where: { id } }); - if (!scan) { - return NextResponse.json({ error: "Scan not found" }, { status: 404 }); - } - return NextResponse.json(scan); -} diff --git a/src/app/api/scan/[id]/stream/route.ts b/src/app/api/scan/[id]/stream/route.ts deleted file mode 100644 index d9539ff..0000000 --- a/src/app/api/scan/[id]/stream/route.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { NextRequest } from "next/server"; -import { prisma } from "@/lib/prisma"; - -export const dynamic = "force-dynamic"; - -export async function GET( - _req: NextRequest, - { params }: { params: Promise<{ id: string }> } -) { - const { id } = await params; - - const stream = new ReadableStream({ - async start(controller) { - const encoder = new TextEncoder(); - const send = (data: object) => { - controller.enqueue(encoder.encode(`data: ${JSON.stringify(data)}\n\n`)); - }; - - let attempts = 0; - const maxAttempts = 120; - - const poll = async () => { - const scan = await prisma.scan.findUnique({ where: { id } }); - if (!scan) { - send({ error: "not_found" }); - controller.close(); - return; - } - - send({ - id: scan.id, - status: scan.status, - progress: scan.progress, - stage: scan.stage, - domain: scan.domain, - result: scan.status === "COMPLETED" ? scan.result : undefined, - error: scan.error, - }); - - if (scan.status === "COMPLETED" || scan.status === "FAILED") { - controller.close(); - return; - } - - attempts++; - if (attempts >= maxAttempts) { - send({ error: "timeout" }); - controller.close(); - return; - } - - setTimeout(poll, 450); - }; - - await poll(); - }, - }); - - return new Response(stream, { - headers: { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - Connection: "keep-alive", - }, - }); -} diff --git a/src/app/api/scan/route.ts b/src/app/api/scan/route.ts deleted file mode 100644 index 8ed9787..0000000 --- a/src/app/api/scan/route.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { z } from "zod"; -import { prisma } from "@/lib/prisma"; -import { checkRateLimit } from "@/lib/rate-limit"; -import { normalizeDomain, isValidDomain } from "@/lib/utils"; -import { runDomainScan } from "@/lib/scanner"; -import { cacheGet, cacheSet } from "@/lib/redis"; - -const bodySchema = z.object({ - domain: z.string().min(1).max(253), -}); - -export async function POST(req: NextRequest) { - const ip = req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ?? "anonymous"; - const rate = await checkRateLimit(`scan:${ip}`); - if (!rate.ok) { - return NextResponse.json({ error: "Rate limit exceeded" }, { status: 429 }); - } - - let body: z.infer; - try { - body = bodySchema.parse(await req.json()); - } catch { - return NextResponse.json({ error: "Invalid request body" }, { status: 400 }); - } - - const domain = normalizeDomain(body.domain); - if (!isValidDomain(domain)) { - return NextResponse.json({ error: "Invalid domain name" }, { status: 400 }); - } - - const cacheKey = `scan:result:${domain}`; - const cached = await cacheGet(cacheKey); - if (cached) { - const scan = await prisma.scan.create({ - data: { - domain, - status: "COMPLETED", - progress: 100, - result: cached, - ip, - userAgent: req.headers.get("user-agent") ?? undefined, - }, - }); - return NextResponse.json({ id: scan.id, domain, cached: true }); - } - - const scan = await prisma.scan.create({ - data: { - domain, - status: "RUNNING", - progress: 0, - ip, - userAgent: req.headers.get("user-agent") ?? undefined, - }, - }); - - runScanAsync(scan.id, domain, cacheKey); - - return NextResponse.json({ id: scan.id, domain }); -} - -async function runScanAsync(scanId: string, domain: string, cacheKey: string) { - try { - const result = await runDomainScan(domain, async (progress, stage) => { - await prisma.scan.update({ - where: { id: scanId }, - data: { progress, stage }, - }); - }); - await prisma.scan.update({ - where: { id: scanId }, - data: { status: "COMPLETED", progress: 100, result: result as object }, - }); - await cacheSet(cacheKey, result, 3600); - } catch (e) { - await prisma.scan.update({ - where: { id: scanId }, - data: { - status: "FAILED", - error: e instanceof Error ? e.message : "Scan failed", - }, - }); - } -} - -export async function GET(req: NextRequest) { - const limit = Math.min(Number(req.nextUrl.searchParams.get("limit") ?? 20), 50); - const scans = await prisma.scan.findMany({ - orderBy: { createdAt: "desc" }, - take: limit, - select: { - id: true, - domain: true, - status: true, - progress: true, - createdAt: true, - }, - }); - return NextResponse.json({ scans }); -} diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx deleted file mode 100644 index 7e4578f..0000000 --- a/src/app/dashboard/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Suspense } from "react"; -import { ScanPanel } from "@/components/scan/scan-panel"; -import { Skeleton } from "@/components/ui/badge"; - -export const metadata = { - title: "Dashboard", -}; - -export default function DashboardPage() { - return ( -
-

Dashboard

-

Run a domain scan and export results.

- }> - - -
- ); -} diff --git a/src/app/domain/[domain]/not-found.tsx b/src/app/domain/[domain]/not-found.tsx deleted file mode 100644 index 695a67c..0000000 --- a/src/app/domain/[domain]/not-found.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export default function DomainNotFound() { - return ( -
-

No scan found

-

Run a scan from the dashboard first.

- - Go to dashboard - -
- ); -} diff --git a/src/app/domain/[domain]/page.tsx b/src/app/domain/[domain]/page.tsx deleted file mode 100644 index a2e9fc2..0000000 --- a/src/app/domain/[domain]/page.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { prisma } from "@/lib/prisma"; -import { notFound } from "next/navigation"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Badge } from "@/components/ui/badge"; -import type { ScanResult } from "@/lib/types"; - -export async function generateMetadata({ params }: { params: Promise<{ domain: string }> }) { - const { domain } = await params; - return { title: domain }; -} - -export default async function DomainDetailPage({ - params, -}: { - params: Promise<{ domain: string }>; -}) { - const { domain: raw } = await params; - const domain = decodeURIComponent(raw); - - const scan = await prisma.scan.findFirst({ - where: { domain, status: "COMPLETED" }, - orderBy: { createdAt: "desc" }, - }); - - if (!scan?.result) { - notFound(); - } - - const result = scan.result as unknown as ScanResult; - - return ( -
-

{result.domain}

-

Full analysis report

- -
- - - WHOIS - - - {Object.entries(result.whois).slice(0, 30).map(([k, v]) => ( -
- {k}: - {v} -
- ))} -
-
- - - - SSL certificate - - -

- Status:{" "} - - {result.ssl.valid ? "Valid" : "Invalid"} - -

- {result.ssl.issuer &&

Issuer: {result.ssl.issuer}

} - {result.ssl.validTo &&

Expires: {result.ssl.validTo}

} - {result.ssl.daysRemaining !== undefined && ( -

Days remaining: {result.ssl.daysRemaining}

- )} -
-
- - - - HTTP headers - - - {Object.entries(result.http.headers).map(([k, v]) => ( -
- {k}: {v} -
- ))} -
-
-
-
- ); -} diff --git a/src/app/globals.css b/src/app/globals.css deleted file mode 100644 index 7ffe2f4..0000000 --- a/src/app/globals.css +++ /dev/null @@ -1,47 +0,0 @@ -@import "tailwindcss"; - -:root { - --background: #fafafa; - --foreground: #09090b; - --muted: #71717a; - --accent: #7c3aed; - --accent-2: #06b6d4; -} - -.dark { - --background: #030712; - --foreground: #fafafa; - --muted: #a1a1aa; -} - -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); -} - -* { - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; -} - -body { - background: var(--background); - color: var(--foreground); - font-family: var(--font-geist-sans), system-ui, sans-serif; - min-height: 100vh; -} - -.glass { - @apply border border-zinc-200/80 bg-white/70 backdrop-blur-xl dark:border-white/10 dark:bg-white/5; -} - -.gradient-mesh { - background: - radial-gradient(ellipse 80% 50% at 50% -20%, rgba(124, 58, 237, 0.35), transparent), - radial-gradient(ellipse 60% 40% at 100% 0%, rgba(6, 182, 212, 0.15), transparent), - var(--background); -} diff --git a/src/app/layout.tsx b/src/app/layout.tsx deleted file mode 100644 index 5dfee19..0000000 --- a/src/app/layout.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; -import { Providers } from "@/components/providers"; -import { Header } from "@/components/layout/header"; -import { SiteFooter } from "@/components/layout/site-footer"; - -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: { - default: "Domain Scanner — Domain intelligence platform", - template: "%s | Domain Scanner", - }, - description: - "Modern domain intelligence and infrastructure analysis. DNS, WHOIS, SSL, geo, security headers, and monitoring.", - keywords: [ - "domain scanner", - "dns", - "whois", - "ssl", - "cybersecurity", - "infrastructure", - ], - openGraph: { - title: "Domain Scanner", - description: "Advanced domain intelligence with premium UX", - type: "website", - }, -}; - -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - - -
-
-
{children}
- -
-
- - - ); -} diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx deleted file mode 100644 index 3b4368e..0000000 --- a/src/app/login/page.tsx +++ /dev/null @@ -1,114 +0,0 @@ -"use client"; - -import { signIn } from "next-auth/react"; -import { useState } from "react"; -import { motion } from "framer-motion"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { useRouter } from "next/navigation"; -import Link from "next/link"; - -export default function LoginPage() { - const router = useRouter(); - const [mode, setMode] = useState<"login" | "register">("login"); - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [name, setName] = useState(""); - const [error, setError] = useState(""); - const [loading, setLoading] = useState(false); - - const submit = async (e: React.FormEvent) => { - e.preventDefault(); - setError(""); - setLoading(true); - - if (mode === "register") { - const res = await fetch("/api/auth/register", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ email, password, name: name || undefined }), - }); - const data = await res.json(); - if (!res.ok) { - setError(data.error ?? "Registration failed"); - setLoading(false); - return; - } - } - - const res = await signIn("credentials", { email, password, redirect: false }); - setLoading(false); - if (res?.error) { - setError(mode === "login" ? "Invalid credentials" : "Registered but sign-in failed"); - return; - } - router.push("/dashboard"); - }; - - return ( -
- -

- {mode === "login" ? "Sign in" : "Create account"} -

-

- {mode === "login" - ? "Access monitors and admin tools." - : "Register to save monitors and history."} -

- -
- {(["login", "register"] as const).map((m) => ( - - ))} -
- -
- {mode === "register" && ( - setName(e.target.value)} - /> - )} - setEmail(e.target.value)} - required - /> - setPassword(e.target.value)} - required - minLength={8} - /> - {error &&

{error}

} - -
- -

- - Continue without account - -

-
-
- ); -} diff --git a/src/app/monitoring/page.tsx b/src/app/monitoring/page.tsx deleted file mode 100644 index 414f810..0000000 --- a/src/app/monitoring/page.tsx +++ /dev/null @@ -1,179 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { motion } from "framer-motion"; -import { Bell, Plus, RefreshCw, ShieldAlert, CheckCircle2, AlertTriangle } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Badge } from "@/components/ui/badge"; -import { toast } from "sonner"; -import Link from "next/link"; -import type { MonitorLastResult } from "@/lib/monitoring/check"; - -type MonitorRow = { - id: string; - domain: string; - type: string; - enabled: boolean; - lastChecked: string | null; - lastResult: MonitorLastResult | null; -}; - -function statusBadge(result: MonitorLastResult | null) { - if (!result) return Pending; - if (result.status === "alert") return Alert; - if (result.status === "warning") return Warning; - return OK; -} - -export default function MonitoringPage() { - const [domain, setDomain] = useState(""); - const [type, setType] = useState<"DNS" | "SSL" | "UPTIME">("DNS"); - const [monitors, setMonitors] = useState([]); - const [loading, setLoading] = useState(true); - - const load = async () => { - const res = await fetch("/api/monitors"); - if (res.status === 401) { - setMonitors([]); - setLoading(false); - return; - } - if (res.ok) { - const data = await res.json(); - setMonitors(data.monitors ?? []); - } - setLoading(false); - }; - - useEffect(() => { - load(); - }, []); - - const addMonitor = async () => { - const res = await fetch("/api/monitors", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ domain, type }), - }); - if (res.status === 401) { - toast.error("Sign in to add monitors"); - return; - } - if (!res.ok) { - toast.error("Could not create monitor"); - return; - } - const data = await res.json(); - setMonitors((m) => [data.monitor, ...m]); - setDomain(""); - toast.success("Monitor added — worker checks every ~5 min"); - }; - - return ( -
- -

Monitoring

-

- DNS change detection and SSL expiry alerts. Background worker runs on your VPS. -

-
- - - - - Add monitor - - - - setDomain(e.target.value)} - className="flex-1" - /> - - - - - -
-

- {loading ? "Loading…" : `${monitors.length} monitor(s)`} -

- -
- - {!loading && monitors.length === 0 && ( -
-
- -
-

No monitors yet.

-

- - Sign in - {" "} - to track domains. -

-
- )} - -
    - {monitors.map((m, i) => ( - -
    -
    -

    {m.domain}

    -

    {m.type} monitor

    -
    - {statusBadge(m.lastResult)} -
    - {m.lastResult?.alerts?.length ? ( -
      - {m.lastResult.alerts.map((a) => ( -
    • - - {a} -
    • - ))} -
    - ) : m.lastResult ? ( -

    - No issues on last check -

    - ) : ( -

    - Awaiting first worker run -

    - )} - {m.lastChecked && ( -

    - Last checked {new Date(m.lastChecked).toLocaleString()} -

    - )} -
    - ))} -
-
- ); -} diff --git a/src/app/page.tsx b/src/app/page.tsx deleted file mode 100644 index 6d3439b..0000000 --- a/src/app/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Hero } from "@/components/landing/hero"; -import { Features } from "@/components/landing/features"; -export default function HomePage() { - return ( - <> - - - - ); -} diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx deleted file mode 100644 index 0f96689..0000000 --- a/src/app/settings/page.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import Link from "next/link"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; - -const envVars = [ - { - name: "DATABASE_URL", - desc: "PostgreSQL connection string for scans, users, and monitors.", - }, - { - name: "REDIS_URL", - desc: "Redis for scan queue workers (optional on small VPS).", - }, - { - name: "NEXTAUTH_SECRET", - desc: "Session encryption secret — rotate after deploy if leaked.", - }, - { - name: "NEXTAUTH_URL", - desc: "Public app URL (e.g. http://your-server-ip).", - }, - { - name: "IPINFO_TOKEN", - desc: "Optional token for richer geo/IP enrichment.", - }, - { - name: "SCAN_RATE_LIMIT_PER_HOUR", - desc: "Per-IP scan throttle (default from .env.example).", - }, -]; - -export default function SettingsPage() { - return ( -
-

Settings

-

- Server configuration lives in environment variables. Theme toggle is in the header. -

- -
- {envVars.map((v) => ( - - - - {v.name} - .env - - - {v.desc} - - ))} -
- - - - Account & monitoring - - - - - - -
- ); -} diff --git a/src/components/landing/features.tsx b/src/components/landing/features.tsx deleted file mode 100644 index d0daa69..0000000 --- a/src/components/landing/features.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import { motion } from "framer-motion"; -import { Database, Lock, Radio, Server } from "lucide-react"; - -const features = [ - { - icon: Database, - title: "DNS & WHOIS depth", - desc: "A/AAAA, MX, TXT, NS resolution plus registrar metadata in one pass.", - }, - { - icon: Lock, - title: "SSL & security grade", - desc: "Certificate validity, issuer chain, and security header scoring.", - }, - { - icon: Radio, - title: "Live scan stream", - desc: "SSE progress events while workers resolve each infrastructure layer.", - }, - { - icon: Server, - title: "Self-hosted stack", - desc: "PostgreSQL, Redis, Docker — your data stays on your VPS.", - }, -]; - -export function Features() { - return ( -
-

- Built for operators -

-

- Competitive tools scatter checks across tabs. Domain Scanner unifies infrastructure - signals with export-ready reports and monitoring hooks. -

-
- {features.map((f, i) => ( - - -

{f.title}

-

{f.desc}

-
- ))} -
-
- ); -} diff --git a/src/components/landing/hero.tsx b/src/components/landing/hero.tsx deleted file mode 100644 index 6382f2b..0000000 --- a/src/components/landing/hero.tsx +++ /dev/null @@ -1,113 +0,0 @@ -"use client"; - -import { motion } from "framer-motion"; -import { Search, Shield, Radar, Zap } from "lucide-react"; -import Link from "next/link"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { useRouter } from "next/navigation"; -import { useState } from "react"; -import { normalizeDomain } from "@/lib/utils"; - -export function Hero() { - const router = useRouter(); - const [domain, setDomain] = useState(""); - - const submit = (e: React.FormEvent) => { - e.preventDefault(); - const d = normalizeDomain(domain); - if (d) router.push(`/dashboard?domain=${encodeURIComponent(d)}`); - }; - - return ( -
-
-
-
-
- - - Domain intelligence platform - - - - See every layer -
- - of your domain - -
- - - DNS, WHOIS, SSL, headers, geo, CDN detection, and security scoring — one scan, - exportable reports, monitoring hooks for production teams. - - - - setDomain(e.target.value)} - className="flex-1 text-left" - /> - - - - - {[ - { icon: Radar, label: "DNS & WHOIS" }, - { icon: Shield, label: "SSL & headers" }, - { icon: Zap, label: "Live progress" }, - { icon: Search, label: "Export JSON/CSV" }, - ].map(({ icon: Icon, label }) => ( -
- -

{label}

-
- ))} -
- - - - -
- ); -} diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx deleted file mode 100644 index 9e35b09..0000000 --- a/src/components/layout/header.tsx +++ /dev/null @@ -1,88 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { usePathname } from "next/navigation"; -import { motion } from "framer-motion"; -import { Globe2, Menu, X } from "lucide-react"; -import { useState } from "react"; -import { cn } from "@/lib/utils"; -import { Button } from "@/components/ui/button"; -import { ThemeToggle } from "@/components/theme-toggle"; - -const links = [ - { href: "/dashboard", label: "Dashboard" }, - { href: "/monitoring", label: "Monitoring" }, - { href: "/analytics", label: "Analytics" }, - { href: "/api-docs", label: "API" }, - { href: "/settings", label: "Settings" }, -]; - -export function Header() { - const pathname = usePathname(); - const [open, setOpen] = useState(false); - - return ( -
-
- -
- -
- Domain Scanner - - - - -
- - - -
- - -
- - {open && ( - - {links.map((l) => ( - setOpen(false)} - > - {l.label} - - ))} - - - - - )} -
- ); -} diff --git a/src/components/layout/site-footer.tsx b/src/components/layout/site-footer.tsx deleted file mode 100644 index 0d99597..0000000 --- a/src/components/layout/site-footer.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import Link from "next/link"; - -export function SiteFooter() { - return ( -
-
-
-

Domain Scanner

-

Self-hosted domain intelligence

-

- - GitHub - -

-
- -
-

Telegram domain lookup

-

- Quick DNS/IP checks and list exports on the go — same idea as a scan, in chat. -

-

- - @domain_searchPro_bot - -

- - Open in Telegram - -
-
-
- ); -} diff --git a/src/components/providers.tsx b/src/components/providers.tsx deleted file mode 100644 index 211f91d..0000000 --- a/src/components/providers.tsx +++ /dev/null @@ -1,13 +0,0 @@ -"use client"; - -import { ThemeProvider } from "next-themes"; -import { Toaster } from "sonner"; - -export function Providers({ children }: { children: React.ReactNode }) { - return ( - - {children} - - - ); -} diff --git a/src/components/scan/network-export.tsx b/src/components/scan/network-export.tsx deleted file mode 100644 index d4f02b3..0000000 --- a/src/components/scan/network-export.tsx +++ /dev/null @@ -1,161 +0,0 @@ -"use client"; - -import { useMemo, useState } from "react"; -import { Download, ChevronDown, Network } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import type { ScanResult } from "@/lib/types"; - -type ExportKind = "ip-list" | "dns-hosts" | "infra-json"; - -function downloadText(filename: string, content: string, mime = "text/plain") { - const blob = new Blob([content], { type: `${mime};charset=utf-8` }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = filename; - a.click(); - URL.revokeObjectURL(url); -} - -function buildIpList(result: ScanResult): string { - const ips = new Set(); - if (result.geo?.ip) ips.add(result.geo.ip); - for (const r of result.dns.records) { - if (r.type === "A" || r.type === "AAAA") ips.add(r.value); - } - return [...ips].join("\n") + (ips.size ? "\n" : ""); -} - -function buildHostsFile(result: ScanResult): string { - const lines: string[] = [ - `# Infrastructure hosts — ${result.domain}`, - `# Generated ${result.scannedAt}`, - "", - ]; - for (const r of result.dns.records) { - if (r.type === "A" || r.type === "AAAA") { - lines.push(`${r.value}\t${result.domain}`); - } - } - if (result.geo?.ip && !lines.some((l) => l.startsWith(result.geo!.ip))) { - lines.push(`${result.geo.ip}\t${result.domain}`); - } - return lines.join("\n") + "\n"; -} - -function buildInfraBundle(result: ScanResult): string { - return JSON.stringify( - { - domain: result.domain, - scannedAt: result.scannedAt, - network: { - ips: buildIpList(result).trim().split("\n").filter(Boolean), - dns: result.dns.records, - nameservers: result.dns.nameservers, - mx: result.dns.mx, - }, - edge: { - cdnWaf: result.cdnWaf.detected, - tech: result.tech, - httpStatus: result.http.status, - finalUrl: result.http.finalUrl, - }, - geo: result.geo, - }, - null, - 2 - ); -} - -const OPTIONS: { id: ExportKind; label: string; desc: string; ext: string }[] = [ - { - id: "ip-list", - label: "IP address list", - desc: "Plain text — A/AAAA + resolved IP", - ext: "txt", - }, - { - id: "dns-hosts", - label: "Hosts-style DNS map", - desc: "IP ↔ hostname lines for tooling", - ext: "hosts", - }, - { - id: "infra-json", - label: "Infrastructure bundle", - desc: "DNS, edge, geo subset (not geoip presets)", - ext: "json", - }, -]; - -export function NetworkExport({ result }: { result: ScanResult }) { - const [open, setOpen] = useState(false); - const [kind, setKind] = useState("ip-list"); - - const preview = useMemo(() => { - if (kind === "ip-list") return buildIpList(result).slice(0, 400); - if (kind === "dns-hosts") return buildHostsFile(result).slice(0, 400); - return buildInfraBundle(result).slice(0, 400); - }, [kind, result]); - - const exportFile = () => { - const opt = OPTIONS.find((o) => o.id === kind)!; - const base = `${result.domain}-network`; - if (kind === "ip-list") { - downloadText(`${base}-ips.${opt.ext}`, buildIpList(result)); - } else if (kind === "dns-hosts") { - downloadText(`${base}.${opt.ext}`, buildHostsFile(result)); - } else { - downloadText(`${base}.${opt.ext}`, buildInfraBundle(result), "application/json"); - } - }; - - return ( - - setOpen(!open)}> - - - - Network export - - - -

- Export resolved IPs and DNS from this scan — infrastructure report, not routing presets. -

-
- {open && ( - -
- {OPTIONS.map((o) => ( - - ))} -
-
-            {preview}
-            {preview.length >= 400 ? "\n…" : ""}
-          
- -
- )} -
- ); -} diff --git a/src/components/scan/scan-panel.tsx b/src/components/scan/scan-panel.tsx deleted file mode 100644 index de33d50..0000000 --- a/src/components/scan/scan-panel.tsx +++ /dev/null @@ -1,300 +0,0 @@ -"use client"; - -import { useEffect, useState, useCallback } from "react"; -import { useSearchParams, useRouter } from "next/navigation"; -import { motion } from "framer-motion"; -import { Download, Loader2, Search } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Badge, Skeleton } from "@/components/ui/badge"; -import type { ScanResult } from "@/lib/types"; -import Link from "next/link"; -import { NetworkExport } from "@/components/scan/network-export"; - -export function ScanPanel() { - const searchParams = useSearchParams(); - const router = useRouter(); - const [domain, setDomain] = useState(searchParams.get("domain") ?? ""); - const [scanId, setScanId] = useState(null); - const [progress, setProgress] = useState(0); - const [stage, setStage] = useState(null); - const [status, setStatus] = useState("idle"); - const [result, setResult] = useState(null); - const [error, setError] = useState(null); - - const startScan = useCallback(async (d: string) => { - setError(null); - setResult(null); - setProgress(0); - setStage(null); - setStatus("starting"); - - const res = await fetch("/api/scan", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ domain: d }), - }); - const data = await res.json(); - if (!res.ok) { - setError(data.error ?? "Scan failed"); - setStatus("failed"); - return; - } - - setScanId(data.id); - setStatus("running"); - router.replace(`/dashboard?domain=${encodeURIComponent(d)}`); - - if (data.cached) { - const full = await fetch(`/api/scan/${data.id}`); - const scan = await full.json(); - setResult(scan.result as ScanResult); - setProgress(100); - setStatus("completed"); - return; - } - - const es = new EventSource(`/api/scan/${data.id}/stream`); - es.onmessage = (ev) => { - const msg = JSON.parse(ev.data) as { - status: string; - progress: number; - stage?: string; - result?: ScanResult; - error?: string; - }; - setProgress(msg.progress ?? 0); - if (msg.stage) setStage(msg.stage); - if (msg.status === "COMPLETED" && msg.result) { - setResult(msg.result); - setStatus("completed"); - es.close(); - } - if (msg.status === "FAILED") { - setError(msg.error ?? "Scan failed"); - setStatus("failed"); - es.close(); - } - }; - es.onerror = () => es.close(); - }, [router]); - - useEffect(() => { - const d = searchParams.get("domain"); - if (d && status === "idle") { - setDomain(d); - startScan(d); - } - }, [searchParams, status, startScan]); - - const onSubmit = (e: React.FormEvent) => { - e.preventDefault(); - if (domain.trim()) startScan(domain.trim()); - }; - - return ( -
-
- setDomain(e.target.value)} - disabled={status === "running"} - /> - -
- - {error && ( -
- {error} -
- )} - - {status === "running" && !result && ( -
- {stage && ( -

{stage}

- )} -
- -
-
- {[1, 2, 3, 4, 5, 6].map((i) => ( - - ))} -
-
- )} - - {result && ( - - )} -
- ); -} - -function ScanResults({ result, scanId }: { result: ScanResult; scanId: string | null }) { - return ( - -
-
-

{result.domain}

-

Scanned {new Date(result.scannedAt).toLocaleString()}

-
-
- {scanId && ( - <> - - - - )} - -
-
- -
- - = 60} /> - - -
- -
- - - DNS records - - - {result.dns.records.length === 0 ? ( -

No records found

- ) : ( -
    - {result.dns.records.map((r, i) => ( -
  • - {r.type} - {r.value} -
  • - ))} -
- )} -
-
- - - - Security headers - - -

{result.security.score}

-
- {result.security.present.map((h) => ( - - {h} - - ))} - {result.security.missing.slice(0, 4).map((h) => ( - - missing: {h} - - ))} -
-
-
- - - - Geo / IP - - - {result.geo ? ( -
-
-
IP
-
{result.geo.ip}
-
-
-
Location
-
- {[result.geo.city, result.geo.region, result.geo.country].filter(Boolean).join(", ")} -
-
- {result.geo.isp && ( -
-
ISP
-
{result.geo.isp}
-
- )} -
- ) : ( -

Geo lookup unavailable

- )} -
-
- - - - Tech & CDN - - -
- {result.tech.map((t) => ( - {t.name} - ))} - {result.cdnWaf.detected.map((c) => ( - - {c} - - ))} - {result.tech.length === 0 && result.cdnWaf.detected.length === 0 && ( -

No strong signals detected

- )} -
-
-
- -
- -
-
-
- ); -} - -function MetricCard({ title, value, ok }: { title: string; value: string; ok: boolean }) { - return ( - - -

{title}

-

- {value} -

-
-
- ); -} diff --git a/src/components/theme-toggle.tsx b/src/components/theme-toggle.tsx deleted file mode 100644 index cd04be8..0000000 --- a/src/components/theme-toggle.tsx +++ /dev/null @@ -1,20 +0,0 @@ -"use client"; - -import { useTheme } from "next-themes"; -import { Moon, Sun } from "lucide-react"; -import { Button } from "@/components/ui/button"; - -export function ThemeToggle() { - const { theme, setTheme } = useTheme(); - return ( - - ); -} diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx deleted file mode 100644 index b84f6ae..0000000 --- a/src/components/ui/badge.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { cn } from "@/lib/utils"; - -export function Badge({ - className, - variant = "default", - ...props -}: React.HTMLAttributes & { - variant?: "default" | "success" | "warning" | "danger"; -}) { - const variants = { - default: "bg-violet-500/20 text-violet-200 border-violet-500/30", - success: "bg-emerald-500/20 text-emerald-200 border-emerald-500/30", - warning: "bg-amber-500/20 text-amber-200 border-amber-500/30", - danger: "bg-rose-500/20 text-rose-200 border-rose-500/30", - }; - return ( - - ); -} - -export function Skeleton({ className }: { className?: string }) { - return
; -} diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx deleted file mode 100644 index d9b66cd..0000000 --- a/src/components/ui/button.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; -import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils"; - -const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-violet-500/50 disabled:pointer-events-none disabled:opacity-50", - { - variants: { - variant: { - default: "bg-white text-zinc-950 hover:bg-zinc-100 shadow-lg shadow-white/10", - secondary: - "bg-white/10 text-white border border-white/20 hover:bg-white/15 backdrop-blur", - ghost: "hover:bg-white/10 text-zinc-300", - outline: "border border-zinc-700 bg-transparent hover:bg-zinc-800", - }, - size: { - default: "h-11 px-6", - sm: "h-9 px-4 text-xs", - lg: "h-13 px-8 text-base", - icon: "h-10 w-10", - }, - }, - defaultVariants: { variant: "default", size: "default" }, - } -); - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; -} - -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button"; - return ( - - ); - } -); -Button.displayName = "Button"; - -export { Button, buttonVariants }; diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx deleted file mode 100644 index 2229c8a..0000000 --- a/src/components/ui/card.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import * as React from "react"; -import { cn } from "@/lib/utils"; - -const Card = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ) -); -Card.displayName = "Card"; - -const CardHeader = ({ className, ...props }: React.HTMLAttributes) => ( -
-); - -const CardTitle = ({ className, ...props }: React.HTMLAttributes) => ( -

-); - -const CardContent = ({ className, ...props }: React.HTMLAttributes) => ( -
-); - -export { Card, CardHeader, CardTitle, CardContent }; diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx deleted file mode 100644 index 695b355..0000000 --- a/src/components/ui/input.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from "react"; -import { cn } from "@/lib/utils"; - -const Input = React.forwardRef>( - ({ className, type, ...props }, ref) => ( - - ) -); -Input.displayName = "Input"; - -export { Input }; diff --git a/src/lib/auth.ts b/src/lib/auth.ts deleted file mode 100644 index 2967d15..0000000 --- a/src/lib/auth.ts +++ /dev/null @@ -1,42 +0,0 @@ -import NextAuth from "next-auth"; -import Credentials from "next-auth/providers/credentials"; -import bcrypt from "bcryptjs"; -import { prisma } from "./prisma"; - -export const { handlers, auth, signIn, signOut } = NextAuth({ - providers: [ - Credentials({ - credentials: { - email: { label: "Email", type: "email" }, - password: { label: "Password", type: "password" }, - }, - async authorize(credentials) { - if (!credentials?.email || !credentials?.password) return null; - const email = String(credentials.email).toLowerCase(); - const user = await prisma.user.findUnique({ where: { email } }); - if (!user) return null; - const ok = await bcrypt.compare(String(credentials.password), user.passwordHash); - if (!ok) return null; - return { id: user.id, email: user.email, name: user.name, role: user.role }; - }, - }), - ], - session: { strategy: "jwt" }, - pages: { signIn: "/login" }, - callbacks: { - async jwt({ token, user }) { - if (user) { - token.role = (user as { role?: string }).role; - token.id = user.id; - } - return token; - }, - async session({ session, token }) { - if (session.user) { - session.user.id = token.id as string; - session.user.role = token.role as string; - } - return session; - }, - }, -}); diff --git a/src/lib/graphql/schema.ts b/src/lib/graphql/schema.ts deleted file mode 100644 index 1a5f414..0000000 --- a/src/lib/graphql/schema.ts +++ /dev/null @@ -1,20 +0,0 @@ -export const typeDefs = `#graphql - type ScanResult { - domain: String! - scannedAt: String! - } - - type Query { - scan(domain: String!): ScanResult - } -`; - -export const resolvers = { - Query: { - scan: async (_: unknown, { domain }: { domain: string }) => ({ - domain, - scannedAt: new Date().toISOString(), - note: "GraphQL endpoint placeholder — use REST /api/scan for full results", - }), - }, -}; diff --git a/src/lib/monitoring/check.ts b/src/lib/monitoring/check.ts deleted file mode 100644 index 90fc389..0000000 --- a/src/lib/monitoring/check.ts +++ /dev/null @@ -1,167 +0,0 @@ -import dns from "node:dns/promises"; -import tls from "node:tls"; -import { createHash } from "node:crypto"; -import type { Monitor } from "@prisma/client"; - -export type MonitorLastResult = { - status: "ok" | "warning" | "alert"; - alerts: string[]; - snapshot: Record; - checkedAt: string; -}; - -async function dnsFingerprint(domain: string): Promise { - const parts: string[] = []; - try { - const a = await dns.resolve4(domain); - parts.push(`A:${[...a].sort().join(",")}`); - } catch { - parts.push("A:"); - } - try { - const ns = await dns.resolveNs(domain); - parts.push(`NS:${[...ns].sort().join(",")}`); - } catch { - parts.push("NS:"); - } - try { - const mx = await dns.resolveMx(domain); - parts.push(`MX:${mx.map((m) => m.exchange).sort().join(",")}`); - } catch { - parts.push("MX:"); - } - return createHash("sha256").update(parts.join("|")).digest("hex").slice(0, 16); -} - -async function sslDaysRemaining(domain: string): Promise<{ valid: boolean; daysRemaining?: number }> { - return new Promise((resolve) => { - const socket = tls.connect( - { host: domain, port: 443, servername: domain, rejectUnauthorized: false, timeout: 10000 }, - () => { - const cert = socket.getPeerCertificate(); - socket.end(); - if (!cert?.valid_to) { - resolve({ valid: false }); - return; - } - const validTo = new Date(cert.valid_to); - const daysRemaining = Math.floor((validTo.getTime() - Date.now()) / 86400000); - resolve({ valid: daysRemaining > 0, daysRemaining }); - } - ); - socket.on("error", () => resolve({ valid: false })); - socket.on("timeout", () => { - socket.destroy(); - resolve({ valid: false }); - }); - }); -} - -async function checkReachable(domain: string): Promise { - try { - const res = await fetch(`https://${domain}`, { - method: "HEAD", - redirect: "follow", - signal: AbortSignal.timeout(12000), - }); - return res.status < 500; - } catch { - try { - const res = await fetch(`http://${domain}`, { - method: "HEAD", - redirect: "follow", - signal: AbortSignal.timeout(12000), - }); - return res.status < 500; - } catch { - return false; - } - } -} - -function previousSnapshot(monitor: Monitor): Record | undefined { - const lr = monitor.lastResult as MonitorLastResult | null; - return lr?.snapshot; -} - -export async function runMonitorCheck(monitor: Monitor): Promise { - const alerts: string[] = []; - const snapshot: Record = {}; - let status: MonitorLastResult["status"] = "ok"; - const prev = previousSnapshot(monitor); - - if (monitor.type === "DNS" || monitor.type === "UPTIME") { - const dnsHash = await dnsFingerprint(monitor.domain); - snapshot.dnsHash = dnsHash; - if (prev?.dnsHash && prev.dnsHash !== dnsHash) { - alerts.push("DNS records changed"); - status = "alert"; - } - } - - if (monitor.type === "SSL" || monitor.type === "UPTIME") { - const ssl = await sslDaysRemaining(monitor.domain); - snapshot.sslValid = ssl.valid; - snapshot.sslDays = ssl.daysRemaining; - if (!ssl.valid) { - alerts.push("SSL certificate invalid or unreachable"); - status = "alert"; - } else if (ssl.daysRemaining !== undefined && ssl.daysRemaining <= 14) { - alerts.push(`SSL expires in ${ssl.daysRemaining} day(s)`); - status = status === "alert" ? "alert" : "warning"; - } else if ( - prev?.sslDays !== undefined && - ssl.daysRemaining !== undefined && - ssl.daysRemaining < (prev.sslDays as number) - ) { - alerts.push("SSL expiry window shortened"); - if (status === "ok") status = "warning"; - } - } - - if (monitor.type === "UPTIME") { - const reachable = await checkReachable(monitor.domain); - snapshot.reachable = reachable; - if (!reachable) { - alerts.push("Host unreachable over HTTP(S)"); - status = "alert"; - } - } - - return { - status: alerts.length ? status : "ok", - alerts, - snapshot, - checkedAt: new Date().toISOString(), - }; -} - -export async function runAllMonitorChecks(): Promise<{ checked: number; alerts: number }> { - const { prisma } = await import("../prisma"); - const monitors = await prisma.monitor.findMany({ where: { enabled: true } }); - let alerts = 0; - for (const monitor of monitors) { - try { - const result = await runMonitorCheck(monitor); - if (result.alerts.length) alerts += 1; - await prisma.monitor.update({ - where: { id: monitor.id }, - data: { lastChecked: new Date(), lastResult: result as object }, - }); - } catch { - await prisma.monitor.update({ - where: { id: monitor.id }, - data: { - lastChecked: new Date(), - lastResult: { - status: "alert", - alerts: ["Check failed"], - snapshot: {}, - checkedAt: new Date().toISOString(), - }, - }, - }); - } - } - return { checked: monitors.length, alerts }; -} diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts deleted file mode 100644 index 5c25a58..0000000 --- a/src/lib/prisma.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PrismaClient } from "@prisma/client"; - -const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }; - -export const prisma = - globalForPrisma.prisma ?? - new PrismaClient({ - log: process.env.NODE_ENV === "development" ? ["error", "warn"] : ["error"], - }); - -if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma; diff --git a/src/lib/rate-limit.ts b/src/lib/rate-limit.ts deleted file mode 100644 index 5be8c3a..0000000 --- a/src/lib/rate-limit.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { prisma } from "./prisma"; - -const LIMIT = Number(process.env.SCAN_RATE_LIMIT_PER_HOUR ?? 30); -const WINDOW_MS = 60 * 60 * 1000; - -export async function checkRateLimit(key: string): Promise<{ ok: boolean; remaining: number }> { - const now = new Date(); - const windowEnd = new Date(now.getTime() + WINDOW_MS); - - try { - const row = await prisma.apiRateLimit.findUnique({ where: { key } }); - if (!row || row.windowEnd < now) { - await prisma.apiRateLimit.upsert({ - where: { key }, - create: { key, count: 1, windowEnd }, - update: { count: 1, windowEnd }, - }); - return { ok: true, remaining: LIMIT - 1 }; - } - if (row.count >= LIMIT) { - return { ok: false, remaining: 0 }; - } - await prisma.apiRateLimit.update({ - where: { key }, - data: { count: row.count + 1 }, - }); - return { ok: true, remaining: LIMIT - row.count - 1 }; - } catch { - return { ok: true, remaining: LIMIT }; - } -} diff --git a/src/lib/redis.ts b/src/lib/redis.ts deleted file mode 100644 index fc1d375..0000000 --- a/src/lib/redis.ts +++ /dev/null @@ -1,33 +0,0 @@ -import Redis from "ioredis"; - -let redis: Redis | null = null; - -export function getRedis(): Redis | null { - const url = process.env.REDIS_URL; - if (!url) return null; - if (!redis) { - redis = new Redis(url, { maxRetriesPerRequest: 3, lazyConnect: true }); - } - return redis; -} - -export async function cacheGet(key: string): Promise { - const r = getRedis(); - if (!r) return null; - try { - const val = await r.get(key); - return val ? (JSON.parse(val) as T) : null; - } catch { - return null; - } -} - -export async function cacheSet(key: string, value: unknown, ttlSec = 3600) { - const r = getRedis(); - if (!r) return; - try { - await r.setex(key, ttlSec, JSON.stringify(value)); - } catch { - /* ignore */ - } -} diff --git a/src/lib/scanner/index.ts b/src/lib/scanner/index.ts deleted file mode 100644 index 8ee0d2e..0000000 --- a/src/lib/scanner/index.ts +++ /dev/null @@ -1,357 +0,0 @@ -import dns from "node:dns/promises"; -import tls from "node:tls"; -import * as whois from "whois"; -import { promisify } from "node:util"; -import type { ScanResult, DnsRecord, SslInfo, SecurityHeaders, TechHint, GeoInfo } from "../types"; - -const whoisLookup = promisify(whois.lookup.bind(whois)); - -const SECURITY_HEADER_KEYS = [ - "strict-transport-security", - "content-security-policy", - "x-frame-options", - "x-content-type-options", - "referrer-policy", - "permissions-policy", - "cross-origin-opener-policy", - "cross-origin-resource-policy", -]; - -function parseWhois(raw: string): Record { - const out: Record = {}; - for (const line of raw.split("\n")) { - const idx = line.indexOf(":"); - if (idx > 0) { - const k = line.slice(0, idx).trim().toLowerCase(); - const v = line.slice(idx + 1).trim(); - if (k && v && !k.startsWith("%")) out[k] = v; - } - } - return out; -} - -async function lookupDns(domain: string) { - const records: DnsRecord[] = []; - const nameservers: string[] = []; - const mx: string[] = []; - const txt: string[] = []; - - const types: Array<["A" | "AAAA" | "CNAME" | "MX" | "TXT" | "NS", () => Promise]> = [ - ["A", () => dns.resolve4(domain)], - ["AAAA", () => dns.resolve6(domain)], - ["CNAME", () => dns.resolveCname(domain)], - ["MX", () => dns.resolveMx(domain)], - ["TXT", () => dns.resolveTxt(domain)], - ["NS", () => dns.resolveNs(domain)], - ]; - - for (const [type, fn] of types) { - try { - const res = (await fn()) as unknown; - if (type === "MX" && Array.isArray(res)) { - for (const r of res as { exchange: string; priority: number }[]) { - mx.push(`${r.priority} ${r.exchange}`); - records.push({ type: "MX", value: `${r.priority} ${r.exchange}` }); - } - } else if (type === "TXT" && Array.isArray(res)) { - for (const r of res as string[][]) { - const v = r.join(""); - txt.push(v); - records.push({ type: "TXT", value: v }); - } - } else if (type === "NS" && Array.isArray(res)) { - for (const r of res as string[]) { - nameservers.push(r); - records.push({ type: "NS", value: r }); - } - } else if (Array.isArray(res)) { - for (const r of res as string[]) { - records.push({ type, value: r }); - } - } - } catch { - /* record type may not exist */ - } - } - - return { records, nameservers, mx, txt }; -} - -async function checkSsl(domain: string): Promise { - return new Promise((resolve) => { - const socket = tls.connect( - { host: domain, port: 443, servername: domain, rejectUnauthorized: false, timeout: 10000 }, - () => { - const cert = socket.getPeerCertificate(); - socket.end(); - if (!cert || !cert.valid_to) { - resolve({ valid: false, error: "No certificate" }); - return; - } - const validTo = new Date(cert.valid_to); - const validFrom = new Date(cert.valid_from); - const daysRemaining = Math.floor((validTo.getTime() - Date.now()) / 86400000); - const issuer = cert.issuer?.O ?? cert.issuer?.CN; - const subject = cert.subject?.CN; - resolve({ - valid: daysRemaining > 0, - issuer: Array.isArray(issuer) ? issuer[0] : issuer, - subject: Array.isArray(subject) ? subject[0] : subject, - validFrom: validFrom.toISOString(), - validTo: validTo.toISOString(), - daysRemaining, - protocol: socket.getProtocol?.() ?? undefined, - }); - } - ); - socket.on("error", (e) => resolve({ valid: false, error: e.message })); - socket.on("timeout", () => { - socket.destroy(); - resolve({ valid: false, error: "Timeout" }); - }); - }); -} - -async function fetchHttp(domain: string) { - const redirectChain: string[] = []; - let url = `https://${domain}`; - let status: number | undefined; - const headers: Record = {}; - - for (let i = 0; i < 5; i++) { - const start = Date.now(); - try { - const res = await fetch(url, { - redirect: "manual", - signal: AbortSignal.timeout(15000), - headers: { "User-Agent": "DomainScanner/1.0 (+https://github.com/andrey271192/Domain_web)" }, - }); - status = res.status; - res.headers.forEach((v, k) => { - headers[k.toLowerCase()] = v; - }); - if (res.status >= 300 && res.status < 400) { - const loc = res.headers.get("location"); - if (!loc) break; - redirectChain.push(loc); - url = loc.startsWith("http") ? loc : new URL(loc, url).href; - continue; - } - return { - status, - finalUrl: url, - redirectChain, - headers, - server: headers["server"], - poweredBy: headers["x-powered-by"], - latencyMs: Date.now() - start, - }; - } catch { - try { - url = `http://${domain}`; - const res = await fetch(url, { - redirect: "follow", - signal: AbortSignal.timeout(15000), - }); - status = res.status; - res.headers.forEach((v, k) => { - headers[k.toLowerCase()] = v; - }); - return { - status, - finalUrl: res.url, - redirectChain, - headers, - server: headers["server"], - poweredBy: headers["x-powered-by"], - latencyMs: Date.now() - start, - }; - } catch { - return { redirectChain, headers, reachable: false }; - } - } - } - return { status, finalUrl: url, redirectChain, headers }; -} - -function scoreSecurityHeaders(headers: Record): SecurityHeaders { - const present: string[] = []; - const missing: string[] = []; - for (const key of SECURITY_HEADER_KEYS) { - if (headers[key]) present.push(key); - else missing.push(key); - } - const score = Math.round((present.length / SECURITY_HEADER_KEYS.length) * 100); - const grade = - score >= 90 ? "A" : score >= 75 ? "B" : score >= 60 ? "C" : score >= 40 ? "D" : "F"; - return { score, grade, present, missing, headers }; -} - -function detectTech(headers: Record): TechHint[] { - const tech: TechHint[] = []; - const server = headers["server"]?.toLowerCase() ?? ""; - const powered = headers["x-powered-by"]?.toLowerCase() ?? ""; - const via = headers["via"]?.toLowerCase() ?? ""; - const cf = headers["cf-ray"]; - const allKeys = Object.keys(headers).join(" ").toLowerCase(); - - if (cf) tech.push({ name: "Cloudflare", category: "CDN", confidence: "high" }); - if (server.includes("nginx")) tech.push({ name: "nginx", category: "Web Server", confidence: "high" }); - if (server.includes("apache")) tech.push({ name: "Apache", category: "Web Server", confidence: "high" }); - if (server.includes("cloudflare")) tech.push({ name: "Cloudflare", category: "CDN", confidence: "high" }); - if (server.includes("caddy")) tech.push({ name: "Caddy", category: "Web Server", confidence: "high" }); - if (server.includes("openresty")) tech.push({ name: "OpenResty", category: "Web Server", confidence: "medium" }); - if (powered.includes("next")) tech.push({ name: "Next.js", category: "Framework", confidence: "medium" }); - if (powered.includes("express")) tech.push({ name: "Express", category: "Framework", confidence: "medium" }); - if (powered.includes("php")) tech.push({ name: "PHP", category: "Runtime", confidence: "medium" }); - if (via.includes("varnish")) tech.push({ name: "Varnish", category: "Cache", confidence: "medium" }); - if (headers["x-vercel-id"]) tech.push({ name: "Vercel", category: "Hosting", confidence: "high" }); - if (headers["x-amz-cf-id"]) tech.push({ name: "AWS CloudFront", category: "CDN", confidence: "high" }); - if (headers["x-nf-request-id"]) tech.push({ name: "Netlify", category: "Hosting", confidence: "high" }); - if (headers["x-render-origin-server"]) tech.push({ name: "Render", category: "Hosting", confidence: "high" }); - if (headers["fly-request-id"]) tech.push({ name: "Fly.io", category: "Hosting", confidence: "high" }); - if (headers["x-powered-by"]?.includes("WP")) tech.push({ name: "WordPress", category: "CMS", confidence: "medium" }); - if (allKeys.includes("x-drupal")) tech.push({ name: "Drupal", category: "CMS", confidence: "low" }); - - return tech; -} - -function detectCdnWaf(headers: Record): string[] { - const detected = new Set(); - const server = headers["server"]?.toLowerCase() ?? ""; - const via = headers["via"]?.toLowerCase() ?? ""; - - if (headers["cf-ray"] || server.includes("cloudflare")) detected.add("Cloudflare"); - if (headers["x-fastly-request-id"] || via.includes("fastly") || headers["x-served-by"]?.includes("fastly")) - detected.add("Fastly"); - if (headers["x-akamai-transformed"] || server.includes("akamai")) detected.add("Akamai"); - if (headers["x-amz-cf-id"]) detected.add("AWS CloudFront"); - if (headers["x-sucuri-id"]) detected.add("Sucuri WAF"); - if (headers["x-incap-client-ip"] || headers["x-cdn"]?.includes("incapsula")) detected.add("Imperva"); - if (headers["x-azure-ref"]) detected.add("Azure Front Door"); - if (headers["x-goog-cache-control"] || headers["x-gfe-backend"]) detected.add("Google CDN"); - if (headers["x-bunnycdn"]) detected.add("BunnyCDN"); - if (headers["x-cache"]?.includes("netlify")) detected.add("Netlify Edge"); - if (headers["server"]?.includes("ddos-guard")) detected.add("DDoS-Guard"); - if (headers["x-fw-server"] || headers["x-served-by"]?.includes("fly")) detected.add("Fly.io Edge"); - - return [...detected]; -} - -async function geoLookup(domain: string): Promise { - try { - const ips = await dns.resolve4(domain); - const ip = ips[0]; - if (!ip) return null; - - const token = process.env.IPINFO_TOKEN; - const url = token - ? `https://ipinfo.io/${ip}?token=${token}` - : `http://ip-api.com/json/${ip}?fields=status,country,regionName,city,isp,org,timezone,lat,lon,query`; - - const res = await fetch(url, { signal: AbortSignal.timeout(8000) }); - const data = (await res.json()) as Record; - - if (token) { - const loc = String(data.loc ?? "").split(","); - return { - ip, - country: data.country as string, - region: data.region as string, - city: data.city as string, - org: data.org as string, - timezone: data.timezone as string, - lat: loc[0] ? Number(loc[0]) : undefined, - lon: loc[1] ? Number(loc[1]) : undefined, - }; - } - - if (data.status === "success") { - return { - ip: String(data.query ?? ip), - country: data.country as string, - region: data.regionName as string, - city: data.city as string, - isp: data.isp as string, - org: data.org as string, - timezone: data.timezone as string, - lat: data.lat as number, - lon: data.lon as number, - }; - } - return { ip }; - } catch { - return null; - } -} - -export type ScanProgressCallback = (progress: number, stage: string) => void | Promise; - -const STAGE_LABELS: Record = { - dns: "Resolving DNS", - whois: "WHOIS lookup", - ssl: "Checking SSL", - http: "HTTP headers", - geo: "Geo / IP", - done: "Finalizing", -}; - -export async function runDomainScan( - domain: string, - onProgress?: ScanProgressCallback -): Promise { - const report = async (p: number, stage: string) => { - await onProgress?.(p, STAGE_LABELS[stage] ?? stage); - }; - - await report(5, "dns"); - const dnsResult = await lookupDns(domain); - - await report(25, "whois"); - let whoisData: Record = {}; - try { - const raw = await whoisLookup(domain); - whoisData = parseWhois(String(raw)); - } catch (e) { - whoisData = { error: e instanceof Error ? e.message : "WHOIS failed" }; - } - - await report(45, "ssl"); - const ssl = await checkSsl(domain); - - await report(65, "http"); - const httpRaw = await fetchHttp(domain); - const headers = httpRaw.headers ?? {}; - const security = scoreSecurityHeaders(headers); - const tech = detectTech(headers); - const cdnWaf = { detected: detectCdnWaf(headers) }; - - await report(85, "geo"); - const geo = await geoLookup(domain); - - await report(100, "done"); - - return { - domain, - scannedAt: new Date().toISOString(), - dns: dnsResult, - whois: whoisData, - ssl, - http: { - status: httpRaw.status, - finalUrl: httpRaw.finalUrl, - redirectChain: httpRaw.redirectChain ?? [], - headers, - server: httpRaw.server, - poweredBy: httpRaw.poweredBy, - }, - geo, - security, - tech, - uptime: { - reachable: typeof httpRaw.status === "number" && httpRaw.status < 500, - latencyMs: "latencyMs" in httpRaw ? httpRaw.latencyMs : undefined, - }, - cdnWaf, - }; -} diff --git a/src/lib/types.ts b/src/lib/types.ts deleted file mode 100644 index f4c93d8..0000000 --- a/src/lib/types.ts +++ /dev/null @@ -1,73 +0,0 @@ -export interface DnsRecord { - type: string; - value: string; - ttl?: number; -} - -export interface SslInfo { - valid: boolean; - issuer?: string; - subject?: string; - validFrom?: string; - validTo?: string; - daysRemaining?: number; - protocol?: string; - error?: string; -} - -export interface SecurityHeaders { - score: number; - grade: string; - present: string[]; - missing: string[]; - headers: Record; -} - -export interface GeoInfo { - ip: string; - country?: string; - region?: string; - city?: string; - isp?: string; - org?: string; - timezone?: string; - lat?: number; - lon?: number; -} - -export interface TechHint { - name: string; - category: string; - confidence: "low" | "medium" | "high"; -} - -export interface ScanResult { - domain: string; - scannedAt: string; - dns: { - records: DnsRecord[]; - nameservers: string[]; - mx: string[]; - txt: string[]; - }; - whois: Record; - ssl: SslInfo; - http: { - status?: number; - finalUrl?: string; - redirectChain: string[]; - headers: Record; - server?: string; - poweredBy?: string; - }; - geo: GeoInfo | null; - security: SecurityHeaders; - tech: TechHint[]; - uptime: { - reachable: boolean; - latencyMs?: number; - }; - cdnWaf: { - detected: string[]; - }; -} diff --git a/src/lib/utils.ts b/src/lib/utils.ts deleted file mode 100644 index cf28176..0000000 --- a/src/lib/utils.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { clsx, type ClassValue } from "clsx"; -import { twMerge } from "tailwind-merge"; - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); -} - -export function normalizeDomain(input: string): string { - let d = input.trim().toLowerCase(); - d = d.replace(/^https?:\/\//, ""); - d = d.replace(/\/.*$/, ""); - d = d.replace(/^www\./, ""); - return d; -} - -export function isValidDomain(domain: string): boolean { - return /^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i.test(domain); -} diff --git a/src/types/next-auth.d.ts b/src/types/next-auth.d.ts deleted file mode 100644 index 1fc18c8..0000000 --- a/src/types/next-auth.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import "next-auth"; -import "next-auth/jwt"; - -declare module "next-auth" { - interface Session { - user: { - id: string; - email: string; - name?: string | null; - role?: string; - }; - } -} - -declare module "next-auth/jwt" { - interface JWT { - id?: string; - role?: string; - } -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index fba2bf3..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [{ "name": "next" }], - "paths": { "@/*": ["./src/*"] } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/uninstall.sh b/uninstall.sh index 984841c..242c46b 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -1,66 +1,31 @@ #!/usr/bin/env bash -# Domain Scanner — one-command uninstall +# Remove Domain Web nginx site (does not remove Amnezia/Docker) set -euo pipefail -INSTALL_DIR="${DOMAIN_SCANNER_INSTALL_DIR:-/opt/domain-scanner}" -SERVICE_NAME="domain-scanner" -NGINX_SITE="domain-scanner" -LEGACY_SERVICE="geoexport-site" -LEGACY_NGINX="geoexport-site" +WEB_ROOT="${DOMAIN_WEB_ROOT:-/var/www/domain-web}" +INSTALL_SRC="${DOMAIN_WEB_INSTALL_SRC:-/opt/domain-web-src}" +NGINX_SITE="domain-web" -log() { echo "[domain-scanner-uninstall] $*"; } -need_root() { - if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then - echo "Run as root: sudo bash uninstall.sh" >&2 - exit 1 +log() { echo "[domain-web-uninstall] $*"; } + +if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then + echo "Run as root: sudo bash uninstall.sh" >&2 + exit 1 +fi + +log "Removing nginx site..." +rm -f "/etc/nginx/sites-enabled/${NGINX_SITE}" +rm -f "/etc/nginx/sites-available/${NGINX_SITE}" + +if [[ ! -f /etc/nginx/sites-enabled/default ]]; then + if [[ -f /etc/nginx/sites-available/default ]]; then + ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default 2>/dev/null || true fi -} +fi -stop_docker() { - log "Stopping Docker stack..." - if [[ -f "${INSTALL_DIR}/docker-compose.yml" ]]; then - if docker compose version >/dev/null 2>&1; then - docker compose -f "${INSTALL_DIR}/docker-compose.yml" down -v 2>/dev/null || true - else - docker-compose -f "${INSTALL_DIR}/docker-compose.yml" down -v 2>/dev/null || true - fi - fi -} +nginx -t && systemctl reload nginx -stop_app() { - systemctl stop "${SERVICE_NAME}.service" 2>/dev/null || true - systemctl disable "${SERVICE_NAME}.service" 2>/dev/null || true - rm -f "/etc/systemd/system/${SERVICE_NAME}.service" - systemctl daemon-reload -} +log "Removing web files (optional paths)..." +rm -rf "${WEB_ROOT}" "${INSTALL_SRC}" -stop_legacy() { - systemctl stop "${LEGACY_SERVICE}.service" 2>/dev/null || true - systemctl disable "${LEGACY_SERVICE}.service" 2>/dev/null || true - rm -f "/etc/systemd/system/${LEGACY_SERVICE}.service" - systemctl daemon-reload -} - -remove_nginx() { - log "Removing nginx site..." - for site in "${NGINX_SITE}" "${LEGACY_NGINX}"; do - rm -f "/etc/nginx/sites-enabled/${site}" - rm -f "/etc/nginx/sites-available/${site}" - done - if command -v nginx >/dev/null 2>&1; then - nginx -t 2>/dev/null && systemctl reload nginx 2>/dev/null || true - fi -} - -remove_files() { - log "Removing ${INSTALL_DIR}..." - rm -rf "${INSTALL_DIR}" -} - -need_root -stop_app -stop_docker -stop_legacy -remove_nginx -remove_files -log "Domain Scanner removed." +log "Uninstall complete." diff --git a/web/connect-app.jsx b/web/connect-app.jsx new file mode 100644 index 0000000..fec4554 --- /dev/null +++ b/web/connect-app.jsx @@ -0,0 +1,461 @@ +// VPN connection guide — Apple-light style + +const { useState: useStateC, useEffect: useEffectC } = React; + +// SiteNav from nav.jsx + +// ───────── Hero ───────── +function Hero(){ + return ( +
+
+ + ЧАСТНЫЙ СЕРВЕР +
+

+ Подключение к VPN +

+

+ Используйте приложение AmneziaVPN. Конфигурацию выдаёт администратор — + импортируйте файл или ключ, который вам передали, и включите туннель. Ниже — пошаговые + инструкции для WireGuard и Amnezia VPN. +

+
+ ); +} + +// ───────── Server info card ───────── +function ServerCard(){ + const [copied,setCopied] = useStateC(false); + function copy(){ + navigator.clipboard?.writeText("SERVER_IP"); + setCopied(true); + setTimeout(()=>setCopied(false), 1600); + } + return ( + +
Сервер
+
Адрес
+
+
+ SERVER_IP +
+ +
+
+ Сервисы на машине: + XRay (TCP) + AmneziaWG (UDP) +
+

+ Номера портов и тип протокола уже зашиты в конфиг Amnezia — вручную их обычно не вводят. +

+
+ ); +} + +// ───────── Big segmented control ───────── +function BigSegment({ value, options, onChange }){ + return ( +
+ {options.map(o=>{ + const on = value===o.id; + return ( + + ); + })} +
+ ); +} + +// ───────── OS tabs (smaller, pill) ───────── +function OSTabs({ value, onChange }){ + const os = [ + {id:"ios", label:"iOS"}, {id:"android", label:"Android"}, + {id:"windows", label:"Windows"}, {id:"macos", label:"macOS"} + ]; + return ( +
+ {os.map(o=>{ + const on = value===o.id; + return ( + + ); + })} +
+ ); +} + +// ───────── Numbered step ───────── +function Step({ n, children }){ + return ( +
+
{n}
+
+ {children} +
+
+ ); +} +function SuccessStep({ children }){ + return ( +
+
+ +
+
{children}
+
+ ); +} + +// ───────── Steps card ───────── +function StepsCard({ protocol, os }){ + // Headlines per protocol / OS + const titles = { + wg:{ + ios:{name:"WireGuard на iOS", sub:"iPhone и iPad · iOS 15 и новее", color:"linear-gradient(160deg,#5ac8fa,#0a84ff)", icon:"lock"}, + android:{name:"WireGuard на Android", sub:"Android 8 и новее", color:"linear-gradient(160deg,#7ce0a2,#2cb67d)", icon:"lock"}, + windows:{name:"WireGuard на Windows", sub:"Windows 10 / 11", color:"linear-gradient(160deg,#7ec2ff,#0a84ff)", icon:"lock"}, + macos:{name:"WireGuard на macOS", sub:"macOS 12 и новее", color:"linear-gradient(160deg,#bdbdc0,#6e6e73)", icon:"lock"}, + }, + awg:{ + ios:{name:"Amnezia VPN на iOS", sub:"AmneziaWG · обход DPI", color:"linear-gradient(160deg,#a385ff,#6a44f5)", icon:"shield"}, + android:{name:"Amnezia VPN на Android", sub:"AmneziaWG · обход DPI", color:"linear-gradient(160deg,#9b82ff,#6a44f5)", icon:"shield"}, + windows:{name:"Amnezia VPN на Windows", sub:"AmneziaWG · обход DPI", color:"linear-gradient(160deg,#a385ff,#6a44f5)", icon:"shield"}, + macos:{name:"Amnezia VPN на macOS", sub:"AmneziaWG · обход DPI", color:"linear-gradient(160deg,#9b82ff,#6a44f5)", icon:"shield"}, + }, + }; + const t = titles[protocol][os]; + + // Steps — protocol/os specific + let steps; + if (protocol==="wg"){ + if (os==="ios") steps = [ + <>Откройте App Store, найдите WireGuard и нажмите «Установить», + <>Откройте приложение, нажмите + в правом верхнем углу, + <> + Выберите «Сканировать QR-код» и наведите камеру на QR — конфиг добавится автоматически + Или «Создать из файла» → выберите файл .conf + , + <>Придумайте имя туннелю и нажмите «Сохранить», + <>Нажмите тумблер → появится запрос, нажмите «Разрешить», + ]; + else if (os==="android") steps = [ + <>Установите WireGuard из Google Play или скачайте .apk с wireguard.com, + <>Откройте приложение, тапните по «+» внизу справа, + <> + Выберите «Сканировать из QR-кода» и наведите камеру на QR + Или «Импорт из файла» → найдите .conf в загрузках + , + <>Дайте имя туннелю и подтвердите создание, + <>Переключите тумблер вправо — разрешите создание VPN-подключения, + ]; + else if (os==="windows") steps = [ + <>Скачайте WireGuard for Windows с wireguard.com/install, + <>Установите и откройте приложение, + <>Нажмите «Импорт туннеля из файла» и выберите .conf, + <>Подтвердите создание туннеля, + <>Нажмите «Подключить» — индикатор станет зелёным, + ]; + else steps = [ + <>Установите WireGuard из Mac App Store, + <>Откройте приложение в строке меню, + <>Выберите «Импорт туннеля из файла».conf, + <>Подтвердите добавление профиля в Системные настройки, + <>Включите тумблер и подтвердите системный запрос, + ]; + } else { + // Amnezia VPN (same flow across OS — slight wording variations) + steps = [ + <>Скачайте приложение AmneziaVPN с amnezia.org или из стора своей платформы, + <>Запустите приложение и согласитесь с условиями использования, + <> + Нажмите «Добавить конфигурацию»«Сканировать QR-код» + Или импорт ключа: вставьте строку вида vpn://… + , + <>При запросе системы — разрешите создание VPN-профиля, + <>Нажмите большую кнопку «Подключиться» — индикатор станет зелёным, + ]; + } + + return ( + +
+ +
+

{t.name}

+
{t.sub}
+
+
+ {steps.map((s,i)=>{s})} + + Тумблер зелёный — вы подключены. Значок VPN в строке статуса. + +
+ ); +} + +function FineNote({ children }){ + return ( +
+ {children} +
+ ); +} + +// ───────── Region change steps ───────── +function RegionCard({ os }){ + const cfg = { + ios:{name:"Смена региона App Store на iPhone", sub:"iOS · Apple ID", color:"linear-gradient(160deg,#ffd166,#ff9500)"}, + android:{name:"Смена региона Google Play", sub:"Android · Google аккаунт", color:"linear-gradient(160deg,#7ce0a2,#2cb67d)"}, + windows:{name:"Смена региона Microsoft Store", sub:"Windows 10 / 11", color:"linear-gradient(160deg,#7ec2ff,#0a84ff)"}, + macos:{name:"Смена региона Mac App Store", sub:"macOS", color:"linear-gradient(160deg,#bdbdc0,#6e6e73)"}, + }; + const t = cfg[os] || cfg.ios; + let steps; + if (os==="ios" || os==="macos") steps = [ + <>Подключите VPN к серверу нужной страны, + <>Откройте «Настройки» → ваше имя → «Медиаматериалы и покупки», + <>Нажмите «Просмотреть учётную запись» → подтвердите вход, + <>Тапните «Страна или регион»«Изменить страну или регион», + <>Выберите страну, примите условия, заполните адрес и способ оплаты «Нет», + ]; + else if (os==="android") steps = [ + <>Подключите VPN к серверу нужной страны, + <>Очистите кеш и данные Google Play Store в настройках устройства, + <>Откройте Play Store → меню → «Настройки» → «Общие» → «Настройки аккаунта», + <>Выберите «Страна и профили», подтвердите смену, + <>Дождитесь до 24 часов и проверьте — регион обновится, + ]; + else steps = [ + <>Подключите VPN к серверу нужной страны, + <>Откройте «Параметры» → «Время и язык» → «Язык и регион», + <>В разделе «Страна или регион» выберите нужную страну, + <>Перезапустите Microsoft Store, + <>Войдите заново под нужным аккаунтом, + ]; + return ( + +
+ +
+

{t.name}

+
{t.sub}
+
+
+ {steps.map((s,i)=>{s})} + + Регион изменён — теперь доступны приложения этой страны. + +
+ ); +} + +// ───────── Verify section ───────── +function VerifySection(){ + return ( +
+

+ Как проверить, что VPN работает? +

+
+ {[ + {n:1, text:<>Откройте 2ip.ru или whatismyip.com}, + {n:2, text:<>Страна должна измениться на страну вашего сервера}, + {n:3, text:<>Попробуйте открыть нужный сайт — загрузится}, + ].map(c=>( + +
+
{c.n}
+
{c.text}
+
+
+ ))} +
+
+ ); +} +function cstyle(){ + return { background:"var(--bg-tint)", border:"1px solid var(--line)", + padding:"2px 8px", borderRadius:8, fontSize:12.5, color:"var(--ink-2)" }; +} + +// ───────── Troubleshooting ───────── +function Troubleshooting(){ + const items = [ + { title:"VPN не подключается", icon:"refresh", color:"linear-gradient(160deg,#ff8a8a,#ff3b30)", points:[ + "Перезапустите приложение", + "Выключите/включите Wi-Fi или мобильный интернет", + "Удалите туннель и добавьте конфиг заново", + "Попробуйте другую сеть", + ]}, + { title:"VPN включён, нет интернета", icon:"globe", color:"linear-gradient(160deg,#ffd166,#ff9500)", points:[ + "Отключитесь и подключитесь снова", + "Убедитесь, что конфиг актуальный", + "Перезагрузите устройство", + "Напишите в поддержку", + ]}, + { title:"Сайты не открываются", icon:"search", color:"linear-gradient(160deg,#7ec2ff,#0a84ff)", points:[ + "Очистите кеш браузера", + "Смените DNS на 1.1.1.1", + "Откройте в режиме инкогнито", + "Попробуйте другой браузер", + ]}, + { title:"Медленная скорость", icon:"gauge", color:"linear-gradient(160deg,#a385ff,#6a44f5)", points:[ + "Проверьте скорость без VPN", + "Переподключитесь", + "Закройте лишние приложения", + "Переключитесь Wi-Fi ↔ 4G", + ]}, + ]; + return ( +
+

+ Что делать, если что-то пошло не так +

+
+ {items.map(it=>( + +
+ +
{it.title}
+
+
    + {it.points.map((p,i)=>( +
  • + + {p} +
  • + ))} +
+
+ ))} +
+
+ ); +} + +// ───────── Footer ───────── +function Footer(){ + return ( + + ); +} + +// ───────── Main App ───────── +function ConnectApp(){ + const initialMode = (typeof URLSearchParams !== "undefined" && new URLSearchParams(location.search).get("mode") === "region") + ? "region" : "connect"; + const [mode, setMode] = useStateC(initialMode); // connect | region + const [protocol, setProtocol] = useStateC("wg"); // wg | awg + const [os, setOs] = useStateC("ios"); + + useEffectC(() => { + const params = new URLSearchParams(location.search); + if (params.get("mode") === "region") setMode("region"); + }, []); + + return ( +
+ + + +
+ + + {/* Mode big segment */} +
+ +
+ + {/* Protocol (only for connect mode) */} + {mode==="connect" && ( +
+ +
+ )} + + {/* OS */} +
+ +
+ + {/* Steps */} + {mode==="connect" + ? + : } +
+ + + +
+
+ ); +} + +ReactDOM.createRoot(document.getElementById("root")).render(); diff --git a/web/connect.html b/web/connect.html new file mode 100644 index 0000000..f4f58ed --- /dev/null +++ b/web/connect.html @@ -0,0 +1,71 @@ + + + + + +Подключение к VPN — Amnezia + + + + + + + + + + +
+ + + + + + diff --git a/web/data/blocked-domains.json b/web/data/blocked-domains.json new file mode 100644 index 0000000..e6258a0 --- /dev/null +++ b/web/data/blocked-domains.json @@ -0,0 +1,130 @@ +{ + "updated": "2026-05-28", + "groups": [ + { + "id": "media", + "title": "Медиа", + "icon": "🎬", + "description": "Стриминг, видео и музыкальные сервисы", + "domains": [ + "netflix.com", + "youtube.com", + "youtu.be", + "googlevideo.com", + "ytimg.com", + "twitch.tv", + "spotify.com", + "hulu.com", + "disneyplus.com", + "hbomax.com", + "soundcloud.com", + "vimeo.com" + ], + "ips": [ + "23.246.0.0/18", + "208.65.153.0/24", + "142.250.0.0/15" + ], + "v2fly_tags": ["geosite:netflix", "geosite:youtube", "geosite:twitch", "geosite:spotify"] + }, + { + "id": "social", + "title": "Социальные сети", + "icon": "🌐", + "description": "Соцсети и платформы Meta, X и др.", + "domains": [ + "facebook.com", + "instagram.com", + "cdninstagram.com", + "x.com", + "twitter.com", + "twimg.com", + "linkedin.com", + "pinterest.com", + "reddit.com", + "tumblr.com", + "threads.net" + ], + "ips": [ + "31.13.64.0/18", + "104.244.42.0/24" + ], + "v2fly_tags": ["geosite:facebook", "geosite:instagram", "geosite:twitter"] + }, + { + "id": "ai", + "title": "Искусственный интеллект", + "icon": "🤖", + "description": "Чат-боты, LLM и AI-платформы", + "domains": [ + "openai.com", + "chatgpt.com", + "chat.openai.com", + "anthropic.com", + "claude.ai", + "gemini.google.com", + "bard.google.com", + "perplexity.ai", + "midjourney.com", + "huggingface.co", + "copilot.microsoft.com", + "poe.com" + ], + "ips": [ + "104.18.0.0/16", + "185.199.108.0/22" + ], + "v2fly_tags": ["geosite:openai", "geosite:anthropic", "geosite:google-gemini"] + }, + { + "id": "messengers", + "title": "Мессенджеры", + "icon": "💬", + "description": "Мессенджеры и голосовые чаты", + "domains": [ + "telegram.org", + "t.me", + "telegram.me", + "whatsapp.com", + "web.whatsapp.com", + "signal.org", + "discord.com", + "discordapp.com", + "viber.com", + "skype.com", + "zoom.us" + ], + "ips": [ + "91.108.4.0/22", + "149.154.160.0/20" + ], + "v2fly_tags": ["geosite:telegram", "geosite:whatsapp", "geosite:discord"] + }, + { + "id": "other", + "title": "Другое / VPN / Dev", + "icon": "🛠️", + "description": "Игры, разработка, облака и инструменты", + "domains": [ + "github.com", + "githubusercontent.com", + "gitlab.com", + "docker.com", + "cloudflare.com", + "notion.so", + "figma.com", + "slack.com", + "store.steampowered.com", + "steampowered.com", + "epicgames.com", + "playstation.com", + "xbox.com" + ], + "ips": [ + "140.82.112.0/20", + "104.16.0.0/13" + ], + "v2fly_tags": ["geosite:github", "geosite:steam", "geosite:cloudflare"] + } + ] +} diff --git a/web/domains-app.jsx b/web/domains-app.jsx new file mode 100644 index 0000000..19bfb8e --- /dev/null +++ b/web/domains-app.jsx @@ -0,0 +1,214 @@ +// Curated blocked domains — static lists (no search) + +const { useState, useEffect, useMemo } = React; + +function cidrToMask(bits) { + const n = parseInt(bits || "32", 10); + if (n === 32) return "255.255.255.255"; + return Array.from({ length: 4 }, (_, i) => (65280 >> Math.min(8, Math.max(0, n - i * 8))) & 255).join("."); +} + +function buildKeeneticBat(group, allGroups) { + const lines = ["@echo off", "rem Keenetic static routes — " + (group ? group.title : "все группы"), ""]; + const src = group ? [group] : allGroups; + const seen = new Set(); + src.forEach((g) => { + (g.ips || []).forEach((cidr) => { + const [ip, bits] = cidr.split("/"); + if (!ip || seen.has(cidr)) return; + seen.add(cidr); + const mask = cidrToMask(bits); + lines.push(`route ADD ${ip} MASK ${mask} 0.0.0.0 & rem ${g.title}`); + }); + }); + if (lines.length <= 3) { + lines.push("rem IP-префиксы не заданы — используйте список доменов вручную в VPN"); + } + return lines.join("\r\n") + "\r\n"; +} + +function downloadText(filename, text) { + const blob = new Blob([text], { type: "text/plain;charset=utf-8" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + a.click(); + URL.revokeObjectURL(url); +} + +async function copyText(text) { + try { + await navigator.clipboard.writeText(text); + return true; + } catch { + const ta = document.createElement("textarea"); + ta.value = text; + document.body.appendChild(ta); + ta.select(); + document.execCommand("copy"); + document.body.removeChild(ta); + return true; + } +} + +function DomainGroupCard({ group, onCopyDomains, onCopyIps, onDownloadBat }) { + const [open, setOpen] = useState(true); + const [copied, setCopied] = useState(null); + const domainText = group.domains.join("\n"); + const ipText = (group.ips || []).join("\n"); + + async function handleCopy(kind) { + const text = kind === "domains" ? domainText : ipText; + if (!text) return; + await copyText(text); + setCopied(kind); + onCopyDomains?.(kind); + setTimeout(() => setCopied(null), 1800); + } + + return ( + + + + {open && ( +
+ {group.v2fly_tags?.length > 0 && ( +
+ {group.v2fly_tags.map((t) => ( + {t} + ))} +
+ )} +
+ {group.domains.map((d) => ( +
{d}
+ ))} +
+ {(group.ips || []).length > 0 && ( +
+
IP / CIDR (префиксы)
+
+ {group.ips.map((ip) => ( + {ip} + ))} +
+
+ )} +
+ + {(group.ips || []).length > 0 && ( + + )} + +
+
+ )} +
+ ); +} + +function DomainsApp() { + const [groups, setGroups] = useState([]); + const [loading, setLoading] = useState(true); + const [filter, setFilter] = useState(""); + + useEffect(() => { + fetch("data/blocked-domains.json") + .then((r) => r.json()) + .then((data) => { setGroups(data.groups || []); setLoading(false); }) + .catch(() => setLoading(false)); + }, []); + + const filtered = useMemo(() => { + const q = filter.trim().toLowerCase(); + if (!q) return groups; + return groups.map((g) => ({ + ...g, + domains: g.domains.filter((d) => d.includes(q) || g.title.toLowerCase().includes(q)), + })).filter((g) => g.domains.length > 0); + }, [groups, filter]); + + const allDomains = groups.flatMap((g) => g.domains).join("\n"); + + return ( +
+ +
+ Статические списки · без поиска +

+ Популярные заблокированные домены +

+

+ Кураторские списки для настройки VPN и маршрутизации на роутере Keenetic. + Поиск по crt.sh на сайте отключён — только готовые пресеты по категориям. +

+
+ setFilter(e.target.value)} placeholder="Фильтр по домену…" + style={{ + flex: "1 1 220px", height: 42, padding: "0 16px", borderRadius: 12, + border: "1px solid var(--line)", fontSize: 14, + }} /> + + +
+ + {loading &&

Загрузка списков…

} + {!loading && filtered.length === 0 && ( +

Ничего не найдено по фильтру.

+ )} +
+ {filtered.map((g) => ( + downloadText(`keenetic-${grp.id}.bat`, buildKeeneticBat(grp, groups))} /> + ))} +
+
+ +
+ ); +} + +ReactDOM.createRoot(document.getElementById("root")).render(); diff --git a/web/domains.html b/web/domains.html new file mode 100644 index 0000000..548591d --- /dev/null +++ b/web/domains.html @@ -0,0 +1,39 @@ + + + + + +Группы доменов — PCA Lab + + + + + + + + + +
+ + + + + diff --git a/web/home-app.jsx b/web/home-app.jsx new file mode 100644 index 0000000..400fcef --- /dev/null +++ b/web/home-app.jsx @@ -0,0 +1,468 @@ +// PCA Lab — cover site: AI + cybersecurity research/education + +const { useState: useH, useEffect: useEH } = React; + +// Nav from nav.jsx (SiteNav) + +// ───────── Hero ───────── +function Hero(){ + return ( +
+
+
+
+ + ОТКРЫТЫЕ ИССЛЕДОВАНИЯ · 2026 +
+

+ На стыке  + искусственного интеллекта +  и кибербезопасности +

+

+ PCA Lab — независимая исследовательская группа. Курсы, лонгриды и open-source инструменты + по приватности, машинному обучению и защите сетей. Без рекламы, без слежки, без шума. +

+
+ + +
+ 4 200+ слушателей +
+
+
+ + {/* Hero composition — research card stack */} +
+ +
+ CRYPTOGRAPHY + 2026·05 +
+

Post-quantum handshake протоколы — практический разбор

+

+ Сравниваем Kyber, Dilithium и SPHINCS+ в условиях ограниченного канала. +

+ +
+ + +
+ + LIVE COURSE +
+

Adversarial ML — атаки на модели

+

Старт 1 июня · 6 недель

+
+ {["#7c5cff","#ff9f0a","#34c759","#ff3b8a"].map((c,i)=>( +
{["A","B","M","P"][i]}
+ ))} + + 218 студентов +
+
+ + +
NETWORK SECURITY
+

DPI-устойчивые туннели: обзор архитектур

+
+ + К. Линеев · 12 мин +
+
+
+
+
+ ); +} + +// ChartBars decoration +function ChartBars(){ + const bars = [42, 68, 55, 84, 71, 90, 76, 88, 95]; + return ( +
+ {bars.map((v,i)=>( +
+ ))} +
+ ); +} + +// ───────── Topic grid ───────── +function Topics(){ + const items = [ + { tag:"AI SAFETY", title:"Безопасность языковых моделей", desc:"Prompt injection, jailbreaks, защитные слои и oversight-механизмы.", + color:"linear-gradient(160deg,#9b82ff,#6a44f5)", icon:"sparkles", articles:14}, + { tag:"NETWORK", title:"Современные сетевые протоколы", desc:"WireGuard, QUIC, HTTP/3, TLS 1.3 — как они устроены и где ломаются.", + color:"linear-gradient(160deg,#7ec2ff,#0a84ff)", icon:"globe", articles:22}, + { tag:"CRYPTOGRAPHY", title:"Прикладная криптография", desc:"От симметричных шифров до post-quantum, с практическими лабами.", + color:"linear-gradient(160deg,#1d1d1f,#3a3a3c)", icon:"lock", articles:31}, + { tag:"PRIVACY", title:"Приватность по умолчанию", desc:"Threat modeling, цифровая гигиена, OPSEC для исследователей.", + color:"linear-gradient(160deg,#34c759,#1f8a5b)", icon:"shield", articles:18}, + { tag:"MACHINE LEARNING", title:"Машинное обучение с нуля", desc:"Линейная алгебра, оптимизация и трансформеры — для практиков.", + color:"linear-gradient(160deg,#ff9f0a,#ff6b00)", icon:"brain", articles:27}, + { tag:"OFFENSIVE", title:"Red-team & пентест", desc:"Этичный взлом: methodology, инструменты, отчёты.", + color:"linear-gradient(160deg,#ff3b8a,#9b51e0)", icon:"bolt", articles:12}, + ]; + return ( +
+ Все направления}/> +
+ {items.map((t,i)=>( + +
+ + {t.articles} материалов +
+
+ {t.tag} +
+

{t.title}

+

{t.desc}

+ Изучить трек +
+ ))} +
+
+ ); +} + +// ───────── Featured Article + Sidebar list ───────── +function Articles(){ + return ( +
+ Архив}/> + +
+ {/* Featured */} + +
+
+ +
+ FEATURED · LONGREAD +
+
+
15 МАЯ 2026 · 22 МИН ЧТЕНИЯ
+

+ Почему DPI всё чаще ошибается: разбор шести популярных эвристик +

+
+
+
+

+ Современные системы глубокой инспекции пакетов проигрывают не из-за слабого железа, + а из-за переусложнённой эвристики. Разбираем причины и считаем false-positive rate на открытых датасетах. +

+
+ +
+
Константин Линеев
+
Senior researcher, Network team
+
+
+
+ + + {/* List of small articles */} +
+ {[ + {tag:"AI SAFETY", date:"12 мая", read:"9 мин", title:"Constitutional AI: как обучают модели по тексту правил", color:"linear-gradient(160deg,#9b82ff,#6a44f5)", author:"А. Морозова"}, + {tag:"PRIVACY", date:"08 мая", read:"6 мин", title:"Threat modeling для журналистов и активистов", color:"linear-gradient(160deg,#34c759,#1f8a5b)", author:"М. Петренко"}, + {tag:"CRYPTO", date:"03 мая", read:"14 мин", title:"Подписи Ed25519 — что в них особенного", color:"linear-gradient(160deg,#1d1d1f,#3a3a3c)", author:"Д. Богданов"}, + {tag:"OFFENSIVE", date:"29 апр", read:"11 мин", title:"Lateral movement в облачных средах: AWS edition", color:"linear-gradient(160deg,#ff3b8a,#9b51e0)", author:"Е. Лазарев"}, + ].map((a,i)=>( + +
+
+
+
+
+
+ {a.tag} + · + {a.date} + · + {a.read} +
+

{a.title}

+
{a.author}
+
+
+ + ))} +
+
+
+ ); +} + +function CodeRain(){ + // Static "code lines" decoration + const lines = [ + "$ openssl genpkey -algorithm Ed25519", + "→ key.pem · 64 bytes", + "$ sha256sum key.pem", + "8a3f…d2c1 key.pem", + "$ ./detect --input pcap/sample.pcap", + "matched: 0 · false-positive: 12%", + ]; + return ( +
+ {lines.map((l,i)=>
{l}
)} +
+ ); +} + +// ───────── Courses CTA ───────── +function Courses(){ + return ( +
+ +
+ {[ + {weeks:8, name:"Введение в нейросети", lvl:"beginner", lvlT:"green", n:1240, color:"linear-gradient(160deg,#9b82ff,#6a44f5)", icon:"brain"}, + {weeks:6, name:"Cybersec для разработчиков", lvl:"intermediate", lvlT:"blue", n:864, color:"linear-gradient(160deg,#7ec2ff,#0a84ff)", icon:"shield"}, + {weeks:12, name:"Криптография в продакшене", lvl:"advanced", lvlT:"purple", n:412, color:"linear-gradient(160deg,#1d1d1f,#3a3a3c)", icon:"lock"}, + {weeks:4, name:"OPSEC и приватность", lvl:"beginner", lvlT:"green", n:1820, color:"linear-gradient(160deg,#34c759,#1f8a5b)", icon:"shield"}, + ].map((c,i)=>( + + +

{c.name}

+
+ {c.weeks} недель + · + {c.n} +
+ +
+ ))} +
+
+ ); +} + +// ───────── Newsletter / CTA ───────── +function Newsletter(){ + return ( +
+
+
+
+
+
+ · NEWSLETTER · ПО ЧЕТВЕРГАМ · +
+

+ Раз в неделю — лучшие материалы и одна короткая мысль +

+

+ Без рекламы и продаж курсов. Только то, что мы сами читаем и используем в работе. +

+
+
e.preventDefault()}> + + +
+
+
+
+ ); +} + +// ───────── Footer ───────── +function Footer(){ + return ( +
+
+
+
+
+ + + + +
+
PCA Lab
+
+

+ Независимая исследовательская группа. Курсы, открытые статьи и инструменты + по приватности и AI с 2022 года. +

+
+ {[ + {icon:"github", l:"GitHub"}, + {icon:"plane", l:"Telegram"}, + {icon:"doc", l:"RSS"}, + ].map(s=>( + + ))} +
+
+ + + + + +
+ +
+
© 2022–2026 PCA Lab · Все материалы — под лицензией CC BY-SA 4.0
+ +
+
+ ); +} +function FootCol({ title, links }){ + return ( +
+
{title}
+ +
+ ); +} + +// ───────── Stats strip ───────── +function StatsStrip(){ + return ( +
+
+ {[ + {v:"124", l:"открытых статей"}, + {v:"12", l:"живых курсов"}, + {v:"4 200+", l:"слушателей"}, + {v:"32", l:"open-source проекта"}, + ].map((s,i)=>( +
+
{s.v}
+
{s.l}
+
+ ))} +
+
+ ); +} + +// ───────── App ───────── +function HomeApp(){ + return ( +
+ + + + + + + +
+
+ ); +} + +ReactDOM.createRoot(document.getElementById("root")).render(); diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..41cf443 --- /dev/null +++ b/web/index.html @@ -0,0 +1,67 @@ + + + + + +PCA Lab — Исследования в области AI и кибербезопасности + + + + + + + + + + +
+ + + + + + diff --git a/web/nav.jsx b/web/nav.jsx new file mode 100644 index 0000000..84f15b9 --- /dev/null +++ b/web/nav.jsx @@ -0,0 +1,57 @@ +// Shared site navigation + +const SITE_NAV = [ + { href: "index.html", label: "Главная", match: (p) => /index\.html$|^\/$/.test(p) }, + { href: "connect.html", label: "Кабинет студента", match: (p) => /connect\.html$/.test(p) && !/mode=region/.test(location.search) }, + { href: "connect.html?mode=region", label: "VPN по региону", match: (p) => /connect\.html/.test(p) && /mode=region/.test(location.search) }, + { href: "domains.html", label: "Группы доменов", match: (p) => /domains\.html$/.test(p) }, +]; + +function SiteNav({ brand = "PCA Lab", brandSub = "RESEARCH · EDUCATION" }) { + const path = typeof location !== "undefined" ? (location.pathname + (location.search || "")) : ""; + return ( +
+
+ +
+ + + + +
+
+
{brand}
+
{brandSub}
+
+
+ + +
+
+ ); +} diff --git a/web/ui.jsx b/web/ui.jsx new file mode 100644 index 0000000..528c6a7 --- /dev/null +++ b/web/ui.jsx @@ -0,0 +1,281 @@ +// Shared UI primitives — Apple-inspired light system + +const { useState, useEffect, useRef, useMemo } = React; + +// ───────── Icons (line, 1.6 stroke, rounded) ───────── +function Icon({ name, size = 18, stroke = 1.6, color = "currentColor" }) { + const props = { width: size, height: size, viewBox: "0 0 24 24", fill: "none", + stroke: color, strokeWidth: stroke, strokeLinecap: "round", strokeLinejoin: "round" }; + switch (name) { + case "server": return (); + case "users": return (); + case "settings": return (); + case "link": return (); + case "lock": return (); + case "tools": return (); + case "gauge": return (); + case "check": return (); + case "plus": return (); + case "chevron-down": return (); + case "chevron-right": return (); + case "back": return (); + case "trash": return (); + case "config": return (); + case "stop": return (); + case "play": return (); + case "qr": return (); + case "calendar": return (); + case "clock": return (); + case "download": return (); + case "upload": return (); + case "cpu": return (); + case "ram": return (); + case "disk": return (); + case "globe": return (); + case "refresh": return (); + case "logout": return (); + case "sun": return (); + case "moon": return (); + case "key": return (); + case "sparkles": return (); + case "satellite":return (); + case "bolt": return (); + case "plane": return (); + case "shield": return (); + case "wand": return (); + case "brain": return (); + case "star": return (); + case "github": return (); + case "doc": return (); + case "edit": return (); + case "more": return (); + case "search": return (); + case "heart": return (); + case "qr-scan": return (); + case "clipboard":return (); + default: return null; + } +} + +// ───────── Buttons ───────── +function Button({ children, variant = "primary", size = "md", icon, iconRight, onClick, type, disabled, style, full }) { + const sizes = { + sm: { h: 30, px: 12, fs: 13, gap: 6, r: 10 }, + md: { h: 38, px: 16, fs: 14, gap: 8, r: 12 }, + lg: { h: 46, px: 22, fs: 15, gap: 10, r: 14 }, + }[size]; + const variants = { + primary: { bg: "var(--accent)", color: "#fff", border: "transparent", + shadow:"0 1px 0 rgba(255,255,255,.18) inset, 0 6px 16px rgba(124,92,255,.35)" }, + primaryGrad: { bg: "linear-gradient(180deg, #8a6cff, #6a44f5)", color:"#fff", border:"transparent", + shadow:"0 1px 0 rgba(255,255,255,.22) inset, 0 8px 22px rgba(106,68,245,.35)" }, + secondary: { bg: "#fff", color:"var(--ink)", border: "var(--line)", + shadow:"0 1px 0 rgba(255,255,255,.6) inset, 0 1px 1px rgba(16,24,40,.04), 0 3px 8px rgba(16,24,40,.05)" }, + ghost: { bg: "transparent", color:"var(--ink-2)", border:"transparent", shadow:"none" }, + danger: { bg: "#fff", color:"var(--red)", border:"rgba(255,59,48,.22)", + shadow:"0 1px 1px rgba(16,24,40,.03)" }, + dangerSolid:{ bg:"var(--red)", color:"#fff", border:"transparent", + shadow:"0 1px 0 rgba(255,255,255,.18) inset, 0 6px 14px rgba(255,59,48,.3)" }, + success: { bg:"#fff", color:"var(--green)", border:"rgba(52,199,89,.25)" , shadow:"0 1px 1px rgba(16,24,40,.03)"}, + }; + const v = variants[variant] || variants.primary; + return ( + + ); +} + +// ───────── Card ───────── +function Card({ children, padding = 22, radius, hover, style, onClick }) { + const [h, setH] = useState(false); + return ( +
setH(true)} onMouseLeave={()=>setH(false)} + style={{ + background:"var(--bg-elev)", borderRadius: radius || "var(--radius-card)", + border:"1px solid var(--line)", boxShadow:"var(--shadow-card)", + padding, transition:"transform .2s ease, box-shadow .25s ease", + transform: hover && h ? "translateY(-2px)" : "translateY(0)", + boxShadow: hover && h ? "var(--shadow-pop)" : "var(--shadow-card)", + cursor: onClick ? "pointer" : "default", + ...style, + }}> + {children} +
+ ); +} + +// ───────── Badge ───────── +function Badge({ children, tone = "neutral", dot, size="md", style }) { + const tones = { + neutral:{ bg:"#f1f2f6", color:"#3a3a3c", dot:"#8e8e93"}, + green: { bg:"var(--green-soft)", color:"#1f7a3a", dot:"var(--green)" }, + blue: { bg:"var(--blue-soft)", color:"#0a4ea3", dot:"var(--blue)" }, + purple: { bg:"var(--accent-soft)", color:"#4a2fcc", dot:"var(--accent)" }, + orange: { bg:"var(--orange-soft)", color:"#a05a00", dot:"var(--orange)" }, + red: { bg:"var(--red-soft)", color:"#a8261d", dot:"var(--red)" }, + }; + const t = tones[tone] || tones.neutral; + const sizes = { sm:{h:20, fs:10.5, px:7}, md:{h:24, fs:11.5, px:9}, lg:{h:28, fs:12.5, px:11}}; + const s = sizes[size] || sizes.md; + return ( + + {dot && } + {children} + + ); +} + +// ───────── Glyph tile (app-icon style with gradient) ───────── +function GlyphTile({ icon, size = 44, gradient, radius = 12, glyph }) { + return ( +
+ {glyph ? {glyph} : } +
+ ); +} + +// ───────── Stat chip (used in server header) ───────── +function Stat({ icon, label, value, tone="neutral" }) { + const tones = { + neutral:{c:"#3a3a3c", bg:"#f4f5f7"}, + green:{c:"#1f7a3a", bg:"var(--green-soft)"}, + orange:{c:"#a05a00", bg:"var(--orange-soft)"}, + blue:{c:"#0a4ea3", bg:"var(--blue-soft)"}, + }; + const t = tones[tone] || tones.neutral; + return ( +
+ +
+ {label} + {value} +
+
+ ); +} + +// ───────── Avatar (initial) ───────── +function Avatar({ name, color = "var(--accent)", size = 36 }) { + const letter = (name || "?").trim().charAt(0).toUpperCase(); + return ( +
{letter}
+ ); +} + +// ───────── Toggle ───────── +function Toggle({ on, onChange }) { + return ( + + ); +} + +// ───────── Input ───────── +function Input({ label, value, onChange, placeholder, mono, type="text", suffix, hint }) { + return ( + + ); +} + +// ───────── Checkbox ───────── +function Checkbox({ checked, onChange, label }) { + return ( + + ); +} + +// ───────── Section header ───────── +function SectionHeader({ title, subtitle, right }) { + return ( +
+
+

{title}

+ {subtitle &&

{subtitle}

} +
+ {right} +
+ ); +} + +// expose globally +Object.assign(window, { + Icon, Button, Card, Badge, GlyphTile, Stat, Avatar, Toggle, Input, Checkbox, SectionHeader, +}); diff --git a/web/uploads/pasted-1779726646439-0.png b/web/uploads/pasted-1779726646439-0.png new file mode 100644 index 0000000..05706c6 Binary files /dev/null and b/web/uploads/pasted-1779726646439-0.png differ diff --git a/web/uploads/pasted-1779726706299-0.png b/web/uploads/pasted-1779726706299-0.png new file mode 100644 index 0000000..e245202 Binary files /dev/null and b/web/uploads/pasted-1779726706299-0.png differ diff --git a/web/uploads/pasted-1779726828382-0.png b/web/uploads/pasted-1779726828382-0.png new file mode 100644 index 0000000..3f2bf63 Binary files /dev/null and b/web/uploads/pasted-1779726828382-0.png differ diff --git a/web/uploads/pasted-1779726864755-0.png b/web/uploads/pasted-1779726864755-0.png new file mode 100644 index 0000000..8921dd6 Binary files /dev/null and b/web/uploads/pasted-1779726864755-0.png differ diff --git a/web/uploads/pasted-1779727187856-0.png b/web/uploads/pasted-1779727187856-0.png new file mode 100644 index 0000000..a47b83b Binary files /dev/null and b/web/uploads/pasted-1779727187856-0.png differ diff --git a/web/uploads/pasted-1779729711186-0.png b/web/uploads/pasted-1779729711186-0.png new file mode 100644 index 0000000..fdd5d91 Binary files /dev/null and b/web/uploads/pasted-1779729711186-0.png differ