From 8006fd67f3ee0599af8043c66a3950aa8ce8740a Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 7 Aug 2026 22:13:25 -0500 Subject: [PATCH] Initial commit --- .env.example | 6 + README.md | 25 + app/app.vue | 46 + app/composables/useAuth.ts | 26 + app/middleware/auth.global.ts | 13 + app/pages/auth/index.vue | 41 + app/pages/index.vue | 309 + app/pages/room/[id].vue | 410 + app/types/file-system-access.d.ts | 6 + app/utils/crypto.ts | 297 + app/utils/download.ts | 30 + aube-lock.yaml | 7658 +++++++++++++++++ nuxt.config.ts | 27 + package.json | 28 + public/favicon.ico | Bin 0 -> 4286 bytes ...nstrumentSans-VariableFont_wdth,wght.woff2 | Bin 0 -> 88476 bytes public/robots.txt | 3 + server/api/auth/login.post.ts | 35 + server/api/auth/logout.post.ts | 7 + server/api/auth/session.get.ts | 5 + server/api/drops/[id].get.ts | 25 + server/api/drops/[id]/chunks/[index].get.ts | 72 + server/api/drops/[id]/chunks/[index].put.ts | 30 + server/api/drops/[id]/complete.post.ts | 32 + server/api/drops/[id]/finalize.post.ts | 37 + server/api/drops/[id]/leases.post.ts | 39 + server/api/drops/index.post.ts | 26 + server/plugins/drop-cleanup.ts | 16 + server/utils/auth.ts | 104 + server/utils/drop-store.ts | 580 ++ server/utils/http.ts | 55 + shared/types/drop.ts | 79 + shared/utils/drop-contract.ts | 121 + tests/drop-contract.test.mjs | 35 + tests/drop-crypto.test.mjs | 126 + tests/drop-store.test.mjs | 153 + tests/http-smoke.test.mjs | 207 + tests/test-helpers.mjs | 16 + tsconfig.json | 18 + uno.config.ts | 274 + 40 files changed, 11017 insertions(+) create mode 100644 .env.example create mode 100644 README.md create mode 100644 app/app.vue create mode 100644 app/composables/useAuth.ts create mode 100644 app/middleware/auth.global.ts create mode 100644 app/pages/auth/index.vue create mode 100644 app/pages/index.vue create mode 100644 app/pages/room/[id].vue create mode 100644 app/types/file-system-access.d.ts create mode 100644 app/utils/crypto.ts create mode 100644 app/utils/download.ts create mode 100644 aube-lock.yaml create mode 100644 nuxt.config.ts create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/fonts/InstrumentSans-VariableFont_wdth,wght.woff2 create mode 100644 public/robots.txt create mode 100644 server/api/auth/login.post.ts create mode 100644 server/api/auth/logout.post.ts create mode 100644 server/api/auth/session.get.ts create mode 100644 server/api/drops/[id].get.ts create mode 100644 server/api/drops/[id]/chunks/[index].get.ts create mode 100644 server/api/drops/[id]/chunks/[index].put.ts create mode 100644 server/api/drops/[id]/complete.post.ts create mode 100644 server/api/drops/[id]/finalize.post.ts create mode 100644 server/api/drops/[id]/leases.post.ts create mode 100644 server/api/drops/index.post.ts create mode 100644 server/plugins/drop-cleanup.ts create mode 100644 server/utils/auth.ts create mode 100644 server/utils/drop-store.ts create mode 100644 server/utils/http.ts create mode 100644 shared/types/drop.ts create mode 100644 shared/utils/drop-contract.ts create mode 100644 tests/drop-contract.test.mjs create mode 100644 tests/drop-crypto.test.mjs create mode 100644 tests/drop-store.test.mjs create mode 100644 tests/http-smoke.test.mjs create mode 100644 tests/test-helpers.mjs create mode 100644 tsconfig.json create mode 100644 uno.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3962d68 --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +# Required shared-passcode authentication +AUTH_PASSCODE=replace-with-a-long-random-passcode +AUTH_SECRET=replace-with-at-least-32-random-bytes +AUTH_TOKEN_TTL_DAYS=7 +# Persistent local filesystem (one Node/Nitro process only) +QUICKDROP_STORAGE_DIR=.data/quickdrop diff --git a/README.md b/README.md new file mode 100644 index 0000000..da603fe --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Quickdrop + +**AI-generated content discolsure** + +This project is largely AI generated, but based off of my work on [Noctis]{https://gitea.wildcardproject.com/zoeissleeping/noctis}. +Its largely unsloppified currently, but that unsloppiness isnt _too_ horrific like some other projects I've been working on and will need to heavily manually deslop. + +My Slop Score: 5/10. It's not bad, but it's not great. + +Quickdrop is secure self hosted file drop service. The goal is to take a file +on your PC, upload it via Quickdrop, scane the QR code on your phone or share +the link, and download the file with no additional software or setup and a +zero-trust policy. + +## Deployment + +Run one Node/Nitro process behind HTTPS and a Cloudflare proxy. Storage is local (`QUICKDROP_STORAGE_DIR`, default `.data/quickdrop`) and locks are in-process, so multiple workers, containers, or replicas are unsupported. Configure `AUTH_PASSCODE`, `AUTH_SECRET` (a long random secret), and optionally `AUTH_TOKEN_TTL_DAYS`; see `.env.example`. Use backups, disk monitoring, and Cloudflare/IP rate limits. Cloudflare request sizing is safe because upload and download requests are one encrypted chunk (about 8 MiB), not whole files. + +The uploader and reservation APIs require the shared passcode. Room descriptors, lease claims, encrypted chunk reads, and completion are public capability APIs. A descriptor lookup does not consume a read. Explicit download claims one read; interrupted downloads reuse their active `sessionStorage` lease. Expiry starts only when finalize succeeds. Choices are 1h/2h/6h/12h/24h/7d and 1/5/10/20/50/100/unlimited reads. + +## Browser behavior + +The File System Access API path writes and decrypts one chunk at a time and supports very large files without whole-file browser materialization. Browsers without it use a deliberately bounded Blob fallback: a warning appears above 100 MiB and files above 256 MiB require a supported desktop browser. Keep the upload tab open and do not share a link until finalize completes. + +This service has no application total-file-size quota, but disk capacity and operational rate limits remain important. Existing legacy whole-body room drops are not compatible with protocol v2. diff --git a/app/app.vue b/app/app.vue new file mode 100644 index 0000000..c641ccb --- /dev/null +++ b/app/app.vue @@ -0,0 +1,46 @@ + + + diff --git a/app/composables/useAuth.ts b/app/composables/useAuth.ts new file mode 100644 index 0000000..20d75e6 --- /dev/null +++ b/app/composables/useAuth.ts @@ -0,0 +1,26 @@ +export function useAuth() { + const authenticated = useState("quickdrop-authenticated", () => false); + const session = useFetch<{ authenticated: boolean }>("/api/auth/session", { + key: "quickdrop-auth-session", + immediate: false, + }); + + async function refresh() { + try { + await session.execute(); + authenticated.value = + !session.error.value && session.data.value?.authenticated === true; + } catch { + authenticated.value = false; + } + } + async function login(passcode: string) { + await $fetch("/api/auth/login", { method: "POST", body: { passcode } }); + await refresh(); + } + async function logout() { + await $fetch("/api/auth/logout", { method: "POST" }); + authenticated.value = false; + } + return { authenticated, refresh, login, logout }; +} diff --git a/app/middleware/auth.global.ts b/app/middleware/auth.global.ts new file mode 100644 index 0000000..59efe7b --- /dev/null +++ b/app/middleware/auth.global.ts @@ -0,0 +1,13 @@ +export default defineNuxtRouteMiddleware(async (to) => { + if (to.path.startsWith("/room/")) return; + + const auth = useAuth(); + await auth.refresh(); + + if (to.path === "/auth") { + if (auth.authenticated.value) return navigateTo("/"); + return; + } + + if (!auth.authenticated.value) return navigateTo("/auth"); +}); diff --git a/app/pages/auth/index.vue b/app/pages/auth/index.vue new file mode 100644 index 0000000..27c7dc1 --- /dev/null +++ b/app/pages/auth/index.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/pages/index.vue b/app/pages/index.vue new file mode 100644 index 0000000..e51122f --- /dev/null +++ b/app/pages/index.vue @@ -0,0 +1,309 @@ + + diff --git a/app/pages/room/[id].vue b/app/pages/room/[id].vue new file mode 100644 index 0000000..33964a0 --- /dev/null +++ b/app/pages/room/[id].vue @@ -0,0 +1,410 @@ + + diff --git a/app/types/file-system-access.d.ts b/app/types/file-system-access.d.ts new file mode 100644 index 0000000..85af0ce --- /dev/null +++ b/app/types/file-system-access.d.ts @@ -0,0 +1,6 @@ +interface Window { + showSaveFilePicker?: (options?: { + suggestedName?: string; + }) => Promise; +} +export {}; diff --git a/app/utils/crypto.ts b/app/utils/crypto.ts new file mode 100644 index 0000000..4091392 --- /dev/null +++ b/app/utils/crypto.ts @@ -0,0 +1,297 @@ +import { + CHUNK_SIZE, + GCM_TAG_BYTES, + MAX_MANIFEST_PLAINTEXT, + PROTOCOL_VERSION, +} from "~/../shared/types/drop"; +import { + decodeBase64Url, + validateRoomId, +} from "~/../shared/utils/drop-contract"; +import type { EncryptedManifest } from "~/../shared/types/drop"; + +const textEncoder = new TextEncoder(); +const textDecoder = new TextDecoder(); +const MANIFEST_COUNTER = 0xffffffff; + +export function safeFilename(value: string): string { + const cleaned = value + .normalize("NFC") + .replace(/[\\/\u0000-\u001F\u007F\u202A-\u202E\u2066-\u2069]/gu, "_") + .trim(); + return [...cleaned].slice(0, 240).join("") || "download"; +} +export function toBase64Url(bytes: Uint8Array): string { + let binary = ""; + for (const byte of bytes) binary += String.fromCharCode(byte); + return btoa(binary) + .replaceAll("+", "-") + .replaceAll("/", "_") + .replace(/=+$/u, ""); +} +export function fromBase64Url(value: string): Uint8Array { + return decodeBase64Url(value); +} +export function keyFromHash(hash: string): string | null { + return new URLSearchParams(hash.replace(/^#/u, "")).get("key"); +} +export function accessFromHash(hash: string): string | null { + return new URLSearchParams(hash.replace(/^#/u, "")).get("access"); +} +export function generateKey(): string { + return toBase64Url(crypto.getRandomValues(new Uint8Array(32))); +} +export function generateNoncePrefix(): string { + return toBase64Url(crypto.getRandomValues(new Uint8Array(8))); +} + +async function importKey(encoded: string, usage: KeyUsage): Promise { + const raw = fromBase64Url(encoded); + if (raw.byteLength !== 32) + throw new Error("The private link contains an invalid key."); + return crypto.subtle.importKey( + "raw", + asBuffer(raw), + { name: "AES-GCM" }, + false, + [usage], + ); +} +function iv(prefix: string, counter: number): Uint8Array { + const bytes = fromBase64Url(prefix); + if (bytes.byteLength !== 8) throw new Error("Invalid nonce prefix"); + const result = new Uint8Array(12); + result.set(bytes); + new DataView(result.buffer).setUint32(8, counter >>> 0, false); + return result; +} +function aad( + id: string, + kind: 0 | 1, + index: number, + chunkSize: number, + chunkCount: number, + plainLength: number, +): Uint8Array { + validateRoomId(id); + const idBytes = textEncoder.encode(id); + if (idBytes.byteLength !== 32) throw new Error("Invalid drop id"); + const result = new Uint8Array(4 + 32 + 1 + 16); + result.set([0x51, 0x44, 0x32, 0], 0); + result.set(idBytes, 4); + result[36] = kind; + const view = new DataView(result.buffer); + view.setUint32(37, index >>> 0, false); + view.setUint32(41, chunkSize >>> 0, false); + view.setUint32(45, chunkCount >>> 0, false); + view.setUint32(49, plainLength >>> 0, false); + return result; +} +function asBuffer(data: Uint8Array): ArrayBuffer { + return data.buffer.slice( + data.byteOffset, + data.byteOffset + data.byteLength, + ) as ArrayBuffer; +} +async function seal( + data: Uint8Array, + encodedKey: string, + id: string, + prefix: string, + kind: 0 | 1, + index: number, + chunkSize: number, + count: number, +): Promise { + const key = await importKey(encodedKey, "encrypt"); + const encrypted = await crypto.subtle.encrypt( + { + name: "AES-GCM", + iv: asBuffer(iv(prefix, index)), + additionalData: asBuffer( + aad(id, kind, index, chunkSize, count, data.byteLength), + ), + tagLength: 128, + }, + key, + asBuffer(data), + ); + return new Uint8Array(encrypted); +} +async function open( + data: Uint8Array, + encodedKey: string, + id: string, + prefix: string, + kind: 0 | 1, + index: number, + chunkSize: number, + count: number, + plainLength: number, +): Promise { + if (data.byteLength < GCM_TAG_BYTES) + throw new Error("Encrypted data is truncated."); + const key = await importKey(encodedKey, "decrypt"); + let decrypted: ArrayBuffer; + try { + decrypted = await crypto.subtle.decrypt( + { + name: "AES-GCM", + iv: asBuffer(iv(prefix, index)), + additionalData: asBuffer( + aad(id, kind, index, chunkSize, count, plainLength), + ), + tagLength: 128, + }, + key, + asBuffer(data), + ); + } catch { + throw new Error("Encrypted data failed integrity verification."); + } + const result = new Uint8Array(decrypted); + if (result.byteLength !== plainLength) + throw new Error("Decrypted length does not match the manifest."); + return result; +} +export async function encryptChunk( + plain: Uint8Array | ArrayBuffer, + key: string, + id: string, + noncePrefix: string, + index: number, + chunkSize = CHUNK_SIZE, + chunkCount = 1, +): Promise { + const data = plain instanceof Uint8Array ? plain : new Uint8Array(plain); + return seal(data, key, id, noncePrefix, 1, index, chunkSize, chunkCount); +} +export async function decryptChunk( + cipher: Uint8Array | ArrayBuffer, + key: string, + id: string, + noncePrefix: string, + index: number, + plainLength: number, + chunkSize = CHUNK_SIZE, + chunkCount = 1, +): Promise { + const data = cipher instanceof Uint8Array ? cipher : new Uint8Array(cipher); + return open( + data, + key, + id, + noncePrefix, + 1, + index, + chunkSize, + chunkCount, + plainLength, + ); +} +export async function encryptManifest( + manifest: EncryptedManifest, + key: string, + id: string, + noncePrefix: string, +): Promise { + const bytes = textEncoder.encode(JSON.stringify(manifest)); + if (bytes.byteLength > MAX_MANIFEST_PLAINTEXT) + throw new Error("Manifest is too large."); + return seal( + bytes, + key, + id, + noncePrefix, + 0, + MANIFEST_COUNTER, + manifest.chunkSize, + manifest.chunkCount, + ); +} +export async function decryptManifest( + cipher: Uint8Array | ArrayBuffer, + key: string, + id: string, + noncePrefix: string, + chunkSize: number, + chunkCount: number, +): Promise { + const data = cipher instanceof Uint8Array ? cipher : new Uint8Array(cipher); + if (data.byteLength <= GCM_TAG_BYTES) + throw new Error("The encrypted manifest is empty."); + const bytes = await open( + data, + key, + id, + noncePrefix, + 0, + MANIFEST_COUNTER, + chunkSize, + chunkCount, + data.byteLength - GCM_TAG_BYTES, + ); + let parsed: unknown; + try { + parsed = JSON.parse(textDecoder.decode(bytes)); + } catch { + throw new Error("The encrypted manifest is invalid."); + } + if (!parsed || typeof parsed !== "object") + throw new Error("The encrypted manifest is invalid."); + const value = parsed as Record; + const fields = [ + "version", + "name", + "type", + "size", + "lastModified", + "chunkSize", + "chunkCount", + ]; + if ( + Object.keys(value).some((field) => !fields.includes(field)) || + Object.keys(value).length !== fields.length || + value.version !== PROTOCOL_VERSION || + typeof value.name !== "string" || + typeof value.type !== "string" || + !Number.isSafeInteger(value.size) || + (value.size as number) < 0 || + !Number.isSafeInteger(value.lastModified) || + (value.lastModified as number) < 0 || + value.chunkSize !== chunkSize || + value.chunkCount !== chunkCount + ) + throw new Error("The encrypted manifest is invalid."); + if (value.name.length > 1024 || value.type.length > 255) + throw new Error("The encrypted manifest is invalid."); + return { + version: 2, + name: safeFilename(value.name), + type: value.type || "application/octet-stream", + size: value.size as number, + lastModified: value.lastModified as number, + chunkSize, + chunkCount, + }; +} +export interface DropMetadata { + name: string; + type: string; + size: number; + lastModified: number; +} +export interface DecryptedDrop { + blob: Blob; + metadata: DropMetadata; +} +export function formatBytes(bytes: number): string { + if (bytes === 0) return "0 B"; + const units = ["B", "KB", "MB", "GB"]; + const unit = Math.min( + Math.floor(Math.log(bytes) / Math.log(1024)), + units.length - 1, + ); + const value = bytes / 1024 ** unit; + return `${value >= 10 || unit === 0 ? value.toFixed(0) : value.toFixed(1)} ${units[unit]}`; +} diff --git a/app/utils/download.ts b/app/utils/download.ts new file mode 100644 index 0000000..7ed92e8 --- /dev/null +++ b/app/utils/download.ts @@ -0,0 +1,30 @@ +export const TRANSIENT_DOWNLOAD_STATUSES = [ + 408, 425, 429, 500, 502, 503, 504, +] as const; +export function leaseStorageKey(id: string): string { + return `quickdrop-lease:${id}`; +} +export async function retryTransient( + operation: () => Promise, + attempts = 5, +): Promise { + for (let attempt = 0; ; attempt++) { + try { + const response = await operation(); + if ( + response.ok || + !TRANSIENT_DOWNLOAD_STATUSES.includes(response.status as never) || + attempt >= attempts - 1 + ) + return response; + } catch (error) { + if (attempt >= attempts - 1) throw error; + } + await new Promise((resolve) => + setTimeout( + resolve, + Math.round(500 * 2 ** attempt * (0.8 + Math.random() * 0.4)), + ), + ); + } +} diff --git a/aube-lock.yaml b/aube-lock.yaml new file mode 100644 index 0000000..ec02c5c --- /dev/null +++ b/aube-lock.yaml @@ -0,0 +1,7658 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@types/node': + specifier: '>=18.12.0' + version: 26.1.2 + '@unocss/nuxt': + specifier: 66.7.5 + version: 66.7.5(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)))(vite@8.2.1(@types/node@26.1.2))(webpack@5.109.2) + '@vue/compiler-sfc': + specifier: ^3.5.34 || ^4.0.0 + version: 3.5.41 + nuxt: + specifier: ^4.5.2 + version: 4.5.2(@types/node@26.1.2)(rolldown@1.2.3) + rolldown: + specifier: ~1.2.1 + version: 1.2.3 + uqr: + specifier: 0.1.3 + version: 0.1.3 + vite: + specifier: ^7.3.0 || ^8.0.0 + version: 8.2.1(@types/node@26.1.2) + vue: + specifier: ^3.5.40 + version: 3.5.41(typescript@5.9.3) + vue-router: + specifier: ^5.2.0 + version: 5.2.0(@vue/compiler-sfc@3.5.41)(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3)) + devDependencies: + prettier: + specifier: 3.8.1 + version: 3.8.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vue-tsc: + specifier: ^3.2.0 + version: 3.3.9(typescript@5.9.3) + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@8.0.0': + resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@8.0.0': + resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@8.0.4': + resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@babel/types@8.0.4': + resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@bomb.sh/tab@0.0.19': + resolution: {integrity: sha512-dTRfo9Q9B+lbLG3JCu8a/AGQSfD2XXcFcnakQzVjSOX+VvR/s9zpsH8TlqV3iHqazniRn1Ypwd1hcRlXcu/4BA==} + hasBin: true + peerDependencies: + cac: ^6.7.14 + citty: ^0.1.6 || ^0.2.0 + commander: ^13.1.0 || ^14.0.0 || ^15.0.0 + peerDependenciesMeta: + cac: + optional: true + citty: + optional: true + commander: + optional: true + + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} + + '@cloudflare/kv-asset-handler@0.4.2': + resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} + engines: {node: '>=18.0.0'} + + '@colordx/core@5.5.0': + resolution: {integrity: sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==} + + '@dxup/nuxt@0.5.6': + resolution: {integrity: sha512-uZjAFoocWtWHr7YP9jm6FqwI8kjX2QN9bjcncoZt0GS+zExIAP3Ewv6EqEUvVP7w9pjZE+T19QxLHeoacN/MNg==} + + '@dxup/unimport@0.1.2': + resolution: {integrity: sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.4': + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} + + '@ioredis/commands@1.10.0': + resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/wasm-runtime@1.2.2': + resolution: {integrity: sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.3 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.3 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nuxt/cli@3.37.0': + resolution: {integrity: sha512-Zj9NwHjEBzVrgezsgMFjpMhNqwNgROk9DzNi/dyfk1mCbXIRigV11br2xOl0Satek30bmv7oZAfMtCnDe6Ip0Q==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@nuxt/schema': ^4.4.6 + peerDependenciesMeta: + '@nuxt/schema': + optional: true + + '@nuxt/devalue@2.0.2': + resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} + + '@nuxt/devtools-kit@3.4.1': + resolution: {integrity: sha512-6ltPm2yUW8GvDdf3VJna7+flLi+ej7xRfSr+S4ovevKt/CuPf9EqYOn1jW7Kw/U1MXt/71zkn+/O2vu3G6O9Hg==} + peerDependencies: + vite: '>=6.0' + + '@nuxt/devtools-wizard@3.4.1': + resolution: {integrity: sha512-taGeuTnkHsZVjgD9r6NXvvHaBzB2j4mCgOmlmkz3ntsqgh1SJfmsD11Tmtl7FVAxJS8Wuvuzgt0GyTlADBW9Wg==} + hasBin: true + + '@nuxt/devtools@3.4.1': + resolution: {integrity: sha512-20zZs6k/zAdi+PM7s1BwxE3hanZ+R1OGi5DWCKPyzSnhUUeeNebvWNgec7Rwnx6iKLkJfK4WFIZ+FL2QurG/ZQ==} + hasBin: true + peerDependencies: + '@vitejs/devtools': '*' + vite: '>=6.0' + peerDependenciesMeta: + '@vitejs/devtools': + optional: true + + '@nuxt/kit@4.5.2': + resolution: {integrity: sha512-l66LU9DcJYjmNwqwAj2I5UGRrUbnG2DOKGChnN70zIGtn0eq/z87gi/FRgha6eMb9/FmB1PFHgtx6PWVml1C2Q==} + engines: {node: '>=18.12.0'} + + '@nuxt/nitro-server@4.5.2': + resolution: {integrity: sha512-sx/vtT8D1WIRUOMuKQz/9z8nZb7jgVWc6HWwlkXKDjYZ84otPFtYCozKqhXWv6xf3JxJvge/RUAOwh9Z7P4nQQ==} + engines: {node: ^22.19.0 || ^24.11.0 || >=26.0.0} + peerDependencies: + '@babel/plugin-proposal-decorators': ^7.25.0 || ^8.0.0 + '@babel/plugin-syntax-typescript': ^7.25.0 || ^8.0.0 + '@rollup/plugin-babel': ^6.0.0 || ^7.0.0 + nuxt: ^4.5.2 + peerDependenciesMeta: + '@babel/plugin-proposal-decorators': + optional: true + '@babel/plugin-syntax-typescript': + optional: true + '@rollup/plugin-babel': + optional: true + + '@nuxt/schema@4.5.2': + resolution: {integrity: sha512-h9g1kt9O2iU9nX6HDFu9gvwtpn+8oSJX0RSTWRBnEx/Pkz+WlOHtjuS0SbkTAXw5aT1+H1GysWVwNTjJfBY/0w==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/telemetry@2.8.0': + resolution: {integrity: sha512-zAwXY24KYvpLTmiV+osagd2EHkfs5IF+7oDZYTQoit5r0kPlwaCNlzHp5I/wUAWT4LBw6lG8gZ6bWidAdv/erQ==} + engines: {node: '>=18.12.0'} + hasBin: true + peerDependencies: + '@nuxt/kit': '>=3.0.0' + + '@nuxt/vite-builder@4.5.2': + resolution: {integrity: sha512-fC8KUs5F1VpSEjTIjmx5pdflciMlp3FDCubx3AXElvRPLtBAPmyB69kmqVFjRnVQ8+vRHNyI7iBHUg9Se8srLA==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} + peerDependencies: + '@babel/plugin-proposal-decorators': ^7.25.0 || ^8.0.0 + '@babel/plugin-syntax-jsx': ^7.25.0 || ^8.0.0 + nuxt: 4.5.2 + rolldown: ^1.0.0 + rollup-plugin-visualizer: ^6.0.0 || ^7.0.1 + vue: ^3.3.4 + peerDependenciesMeta: + '@babel/plugin-proposal-decorators': + optional: true + '@babel/plugin-syntax-jsx': + optional: true + rolldown: + optional: true + rollup-plugin-visualizer: + optional: true + + '@oxc-parser/binding-android-arm-eabi@0.131.0': + resolution: {integrity: sha512-t2xicr9pfzkSRYx5aPqZqlLaayIwJTqgQ81Jor31Xep2nGyL2Aq3d0K5wOfeR7VevaSdxaS9dzSQP9xDwn8fDg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.131.0': + resolution: {integrity: sha512-nlGIod6gw75x1aEDgLS+srj+JRGY0HHm9MI9YgzE/B64l6d6+H3MSP9NOgp0+HTg8tp4vV9rVfgQGgd+TfVZcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.131.0': + resolution: {integrity: sha512-jukuV6xe5RbQKFo7QD34NDCLDZp4PSOm8rmckhNdH/60ymG5zXbDzGBEyc+nTkuLQNama2aSGCt+CPfpjNTqyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.131.0': + resolution: {integrity: sha512-g3JOo4khe9rslHm5WYaVDWb0HS/M1MLR3I9S8560MkKIcC96VQY00QjOlsuRyfSj/JDXj8i9T7ryPO2RidiXVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.131.0': + resolution: {integrity: sha512-1hziITDTxjMePnX+dR9ocVT+EuZkQ8wm4FPAbmbEiKG+Phbo73J1ZnPAA6Y/aGsWF3McOFnQuZIktAFwalkfJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0': + resolution: {integrity: sha512-9uRxfXwyKG9+MwmGQBo2ncPNwZH5HTmCETFM2WiuDBNDCW4NC5ttSQkwCAMrTAWgwMzVBH1CP8pM0v7nebCWXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.131.0': + resolution: {integrity: sha512-mgbLvzRShXOLBdWGInf08Af4q+pfj1xD8hSgLClDZ9of/BXkB6+LIhTH7fihiDUipqB3yoSkKBWaZ3Ejlf5Yag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.131.0': + resolution: {integrity: sha512-OPT8++4aN6j2GJ8+3IZHS/byXoZP4aSBn+FoG6rgBJ2fKwPKXWF3MqrFMNW7NKHM28FLY579xYLxJSfgobEqPA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.131.0': + resolution: {integrity: sha512-vtPiwmfVTAXzaxDKsOXG+LwgRAA7WEnaeHzhS5z0GE89gAK18KSXnly7Z6saXXq6L3dVMyK44uoTI03zKxrpmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.131.0': + resolution: {integrity: sha512-8AW8L7w5cGHSdZPcyZX2yR0+GUODsT15rbRjfdD54rv6DMbtuEB19ysLOpKJlRGfH6UNYNpCHaU1uJWgTWf1/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.131.0': + resolution: {integrity: sha512-vvpjkjEOUsPcsYf8evE4MO3aGx9+3wodXEBOicGNnOwTuAik8eBONNkgSdhkGsAblQmfVHJyanRnpxglddTXIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.131.0': + resolution: {integrity: sha512-AqmcNC3fClXX+fxQ6VGEN1667xVFiRBkY0CZmDMSiaeFUsv1+UkBPYYi48IUKcA9/ivvoKNRzQl2I4//kT9F/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.131.0': + resolution: {integrity: sha512-7d3jOMKy7RSQCcDLIci+ySll2FgsOMl/GiRux4q2JNv0zg4EdhFISa9idvrdN/HEUIQQJNg6dmveUeJl2YErGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.131.0': + resolution: {integrity: sha512-JHK/h95qVqVQ+ITER837kcTdwBDFpFaNnOTYGCP0zdUSX/mLKC7tXOoyrTb6vG7iRPwGlcgBil3v2IjYw1FqJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.131.0': + resolution: {integrity: sha512-b2BO82O8azXAyf7EUgOPKu145nWypbNyk07HbU09fkzhm9lEA5oPvaN/M8Nlo7tOErVTa2WOgS4QbOnxAPXdDQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.131.0': + resolution: {integrity: sha512-GHO9glZaX7LkX/OGfluEPf1yjg+ehiFbUdowbX6uNWOQhmwKWU4m4+nZ9FJkrHNKuxyI1KKertMdGjVKCApKWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.131.0': + resolution: {integrity: sha512-3SkikPaEFoih1N83qLVEDLRLeY4nYsf6JT9SnWiMCQ5lGQdKup6bEuKCqkRiG9dD1IIaFeYz9RjlciPmYoFIWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.131.0': + resolution: {integrity: sha512-Os5bEhryeA2jkH+ZrnZyAC1EP5gs+X4YB1Fjqml7UPD5kU7ecsK1MPEVMfCrdt/GDNpDbavYXiOXOdyJ5b3OPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.131.0': + resolution: {integrity: sha512-m+jNz9EuF0NXoiptc6B9h5yompZQVW/a5MJeOu5zojfH5yWk82tvF2ccrHkfhgtrS9h9DD5l1Qv8dWlfY7Nz8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.131.0': + resolution: {integrity: sha512-o14Hk8dAyiEUMFEWEgmAwFZvBt1RzAYLM3xeQ+5315JXgVYhoemivgYcbYVRbsFkS71ShMGlAFE0kPnr460rww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.131.0': + resolution: {integrity: sha512-PgnWDfV0h+b16XNKbXU7Daib/BFSt/J2mEzfYIBu6JB/wNdlU+kVYXCkGA1A9fWkTbOgbjh4e6NhPeQOYvFhEA==} + + '@oxc-project/types@0.143.0': + resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + + '@parcel/watcher-wasm@2.6.0': + resolution: {integrity: sha512-dtjbDxKSDPQ8AmA+pS4OFaHE1FKrjtGpLGBxw85uKFkRorjNbvDM/aFPgqosu40wprbp1xw2ZSxIKqghCUHe2w==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + + '@poppinss/dumper@0.7.0': + resolution: {integrity: sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==} + + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.2.3': + resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.3': + resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.3': + resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.3': + resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.3': + resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.3': + resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.3': + resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.3': + resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.3': + resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.3': + resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.3': + resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.3': + resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.3': + resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.3': + resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/plugin-alias@6.0.0': + resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} + engines: {node: '>=20.19.0'} + peerDependencies: + rollup: '>=4.0.0' + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@29.0.3': + resolution: {integrity: sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@6.0.3': + resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@1.0.0': + resolution: {integrity: sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.62.4': + resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.4': + resolution: {integrity: sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.4': + resolution: {integrity: sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.4': + resolution: {integrity: sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.4': + resolution: {integrity: sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.4': + resolution: {integrity: sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': + resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.4': + resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.4': + resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.4': + resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.4': + resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.4': + resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.4': + resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.4': + resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.4': + resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.4': + resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.4': + resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.4': + resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.4': + resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.4': + resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.4': + resolution: {integrity: sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.4': + resolution: {integrity: sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.4': + resolution: {integrity: sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.4': + resolution: {integrity: sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.4': + resolution: {integrity: sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==} + cpu: [x64] + os: [win32] + + '@simple-git/args-pathspec@1.0.3': + resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} + + '@simple-git/argv-parser@1.1.1': + resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==} + + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.23': + resolution: {integrity: sha512-iRoq6i6JDJP6Mt2A5JaPvzw0pgYHH6k92ij+yXiTrB7T2y9N789aWE3EHWj/5ztlJBokcCBja3iYLVdu5wgnkg==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@26.1.2': + resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@unhead/bundler@3.3.1': + resolution: {integrity: sha512-F9gEgqpUKqHFzOv+7Pgm3TbmXhUdLX+WjZiPAK/huLDzblzZmvAUE9vRDymWaOST7jqGT/tPKkwl2kqbgb3nPw==} + peerDependencies: + '@unhead/cli': ^3.3.1 + '@vitejs/devtools-kit': ^0.4.1 + esbuild: '>=0.17.0' + lightningcss: '>=1.20.0' + oxc-parser: '>=0.98.0' + rolldown: '>=1.0.0' + unhead: ^3.3.1 + vite: '>=6.4.2' + webpack: '>=5.0.0' + peerDependenciesMeta: + '@unhead/cli': + optional: true + '@vitejs/devtools-kit': + optional: true + esbuild: + optional: true + lightningcss: + optional: true + oxc-parser: + optional: true + rolldown: + optional: true + vite: + optional: true + webpack: + optional: true + + '@unhead/vue@3.3.1': + resolution: {integrity: sha512-iS+eiE1NehbV/eF7wzR7UUuUVTv8fIphFOCekQvEMuPqfKPCB8f3wf7sgPgUngYX6mdgM6PmkGmaOQgTBxqwbw==} + peerDependencies: + vite: '>=6.4.2' + vue: '>=3.5.18' + webpack: '>=5.0.0' + peerDependenciesMeta: + vite: + optional: true + webpack: + optional: true + + '@unocss/cli@66.7.5': + resolution: {integrity: sha512-fgWkECRn2LGVo9sEpmjk/KJ3NSKUDitaZCNrJcEYM93DG+ELriTHcL+VWBlF4rcZf9fdGlq1nKbbRHUZirFCHQ==} + hasBin: true + + '@unocss/config@66.7.5': + resolution: {integrity: sha512-dkPl9glhEahJ+Xoja5ZseKKnH+vZaeaKQzg8b0otcKcPPNrHQgu1nu3QgfeOjnXOGrjZIotHwUeVtt4ZA2Skgg==} + + '@unocss/core@66.7.5': + resolution: {integrity: sha512-UdJb8MiMywcau8QrWEVgUAz0kvoFHyR+sACwYCgmBh/BpKJGyR/zw/Ys3wvysbm0f+i/20VGBex/QQxYVlzdyQ==} + + '@unocss/extractor-arbitrary-variants@66.7.5': + resolution: {integrity: sha512-5zOkbnLIJc8E749qNjLXfPHl3FdHloop12h706/ojr6idK4ix0KLm43R//uLnphixCehdHJRuHnavnM4C/kQbA==} + + '@unocss/inspector@66.7.5': + resolution: {integrity: sha512-WmTJMnj8bmRxvw/wGeShmL2eEHr2/L0BdGTXSxhfzwcO8y5XZEbBmVciLcM7pqaTXQ6JY4+KnITrDUf1urjZxQ==} + + '@unocss/nuxt@66.7.5': + resolution: {integrity: sha512-jEpG/bvPjjpXqr/hmTXxDZLajI/SyakviVX03djtcJl8jih1khXMqUAAehLcFUJg1DvoUIUdReGagTJGdyGPNw==} + + '@unocss/preset-attributify@66.7.5': + resolution: {integrity: sha512-1Oi1Cp81pqYJwG3h4+OlP5A0FKyaa07MFBXaXc4Yr3faiTbsI8SKj2TqnZCb+NQvBsEqslEd+jKXGZ3lKzCVOQ==} + + '@unocss/preset-icons@66.7.5': + resolution: {integrity: sha512-ZsxadWnGGtHdANTikuMnjkQaT1qwUFJHZBF4fzVsPMnUiiKGs8rzXukwM9w3Gi9ontM7nbG2FYi9clWETSlpFg==} + + '@unocss/preset-mini@66.7.5': + resolution: {integrity: sha512-o37TSl4ecT0dKu+3/TYuTYht75h82SEwDNl476m9ve0KW4Pv1O2tT/9TWd7N5cutEpySr8/YtjMwtWBD+drxBg==} + + '@unocss/preset-tagify@66.7.5': + resolution: {integrity: sha512-/8YB1tXVi+WmNKPhsCdtO1xnQKEkshSnWDp6AbvVP3f6qOF7adlMYpAt3kpWCoVUBsfOQ06ZQlnfricMjObyoQ==} + + '@unocss/preset-typography@66.7.5': + resolution: {integrity: sha512-2dxC8LT9KYa29UZT4muDFl7DbIXvKktTfeSMbUGMdZKbHcuMtKSP2U52wti1PL5I9duqp4v+8G33EeVutGTUaQ==} + + '@unocss/preset-uno@66.7.5': + resolution: {integrity: sha512-zaUlYgNngbt50fZA/LbtsEnmPKojPqeiXCyUUiKQMv2uJQhncR32xhLZXVQ+TJD7hlfZ+6FAqlco1NIiAcub9w==} + + '@unocss/preset-web-fonts@66.7.5': + resolution: {integrity: sha512-OLLTK7kswdSu51qxEm6O+AehecgCfS08Ivqo+280lKzFW7V1jXr5okeJ1ty+85oHCprJqzcD9iG1khxNRLomcA==} + + '@unocss/preset-wind3@66.7.5': + resolution: {integrity: sha512-atFe/7Qein+oMdyZs0hEo+3EjV99Av2LVxDbzpCungxIfbS3TnQt70EIuHXMPNCVWLYwrMV+/P1n9Ntb0E3mow==} + + '@unocss/preset-wind4@66.7.5': + resolution: {integrity: sha512-n3jIvQv8x1jXpmWfvNFBIqHNARki4mKZXfxAA31gekpXsRRTg16u1+yC1+PBBJgoEDFEnnmKnG7EZP88S8LVXA==} + + '@unocss/preset-wind@66.7.5': + resolution: {integrity: sha512-LVKgGr0A9Lc7F85xGXrrb71DDXMlHGA8bcj/Kht8BCsuRdBZadNbLlnv5qnSJiHYhi3/blzcgVoaeRor6L9yNA==} + + '@unocss/reset@66.7.5': + resolution: {integrity: sha512-z3wbt2cuQPjtT6w5xzRYZYFIIlUPzhVKz8yIcE9fvu7BgR3hO7uVsg/5mzDoGwQ96Ya3Sk68rpmI/gLYl4bJag==} + + '@unocss/rule-utils@66.7.5': + resolution: {integrity: sha512-/AKHBRF6ZOexE3EDDv8ZEYh40P5e2Eha41IYUbE1wjigW7++ssmvimSTdufJzZvU5DGP++E3B3WEsFPprZMjAg==} + + '@unocss/transformer-attributify-jsx@66.7.5': + resolution: {integrity: sha512-r8qDwNSt0eGSwWws3xsuIHb3PZYR2embFdYoE67hD/xlYgLjX1uPy/HUlGCSSh4uLc4vVYjurr0Oq5xF/B8YiA==} + + '@unocss/transformer-compile-class@66.7.5': + resolution: {integrity: sha512-KuECgsGF7tGe808vIvKViEjI0UCUgYgneJfK+/TWBkjC7s8dLVaUtJzzcP9/r6OfGlgyn/x1YTdRqTaCENa7Xg==} + + '@unocss/transformer-directives@66.7.5': + resolution: {integrity: sha512-VMJApXXOwlDubkW+cNMmOkfxLefFupJr+yU23gGYUB2NPsuVltc8H5CDM0gfVebpeL5CUW05evxzEAk2wsju+Q==} + + '@unocss/transformer-variant-group@66.7.5': + resolution: {integrity: sha512-iDmP3mM8J+IxuQf5Uh33zsi528xnGxTpKRJ0c+LCrqBTTkR2tZr4aCzNmJ0g29Js2yEOsyNXRRc8BNTuvgn0AA==} + + '@unocss/vite@66.7.5': + resolution: {integrity: sha512-1z1TBCNJCR2WzjPtjzmCHr8rtzXHosMjLdsCNe6Mzsfwiw044gzzLVuiEZO9vIjkI50lvQ+gIOxOiVQG0hGAeA==} + peerDependencies: + vite: ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0 + + '@unocss/webpack@66.7.5': + resolution: {integrity: sha512-9ji+BsB1VyspbEZwcwGPZPF6uuPpsRm9gBNMK14Toib33QIiBqpEBNzBNGNfbIjne3hmS6fGySN344Z0VldHcA==} + peerDependencies: + webpack: ^5 + + '@vercel/nft@1.10.2': + resolution: {integrity: sha512-w+WyX5Ulmj4dtTZrxaulqrjaLZHSbnPzx75SJsTNYmotKsqn1JlLnDJa+lz5hn90HJofhl/2MAtw0mCrgM3qYw==} + engines: {node: '>=20'} + hasBin: true + + '@vitejs/plugin-vue-jsx@5.1.6': + resolution: {integrity: sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@6.0.8': + resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vue-macros/common@3.1.4': + resolution: {integrity: sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==} + engines: {node: '>=20.19.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + + '@vue/babel-helper-vue-transform-on@2.0.1': + resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} + + '@vue/babel-plugin-jsx@2.0.1': + resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@2.0.1': + resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.41': + resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==} + + '@vue/compiler-dom@3.5.41': + resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==} + + '@vue/compiler-sfc@3.5.41': + resolution: {integrity: sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==} + + '@vue/compiler-ssr@3.5.41': + resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==} + + '@vue/devtools-api@8.2.1': + resolution: {integrity: sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==} + + '@vue/devtools-core@8.2.1': + resolution: {integrity: sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@8.2.1': + resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==} + + '@vue/devtools-shared@8.2.1': + resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==} + + '@vue/language-core@3.3.9': + resolution: {integrity: sha512-in/68oAa4BCtVY6n/nkuhLIkV8DHYd2UivedJ6cMZ6UYtlq9jaoaSNUBHYCVO44z3nKg7MdE5OBoHKt5SxeBKQ==} + + '@vue/reactivity@3.5.41': + resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==} + + '@vue/runtime-core@3.5.41': + resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==} + + '@vue/runtime-dom@3.5.41': + resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==} + + '@vue/server-renderer@3.5.41': + resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==} + + '@vue/shared@3.5.41': + resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + alien-signals@3.2.1: + resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + + ast-walker-scope@0.9.0: + resolution: {integrity: sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==} + engines: {node: '>=20.19.0'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + autoprefixer@10.5.4: + resolution: {integrity: sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.8.0: + resolution: {integrity: sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q==} + engines: {bare: '>=1.28.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.7: + resolution: {integrity: sha512-o8CRCiJtib+ycO3mE4A5UChtGX4dDP2XxsWVu9P+Zc3H8tcmKwNVEDoDTXmwN+uuMhfKeT7/i7Y26xS8W7ohoA==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.11.12: + resolution: {integrity: sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==} + engines: {node: '>=6.0.0'} + hasBin: true + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + + caniuse-api@4.0.0: + resolution: {integrity: sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==} + + caniuse-lite@1.0.30001807: + resolution: {integrity: sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + cluster-key-slot@1.1.1: + resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compatx@0.2.0: + resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie-es@2.0.1: + resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==} + + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + crossws@0.4.10: + resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} + peerDependencies: + srvx: '>=0.11.5' + peerDependenciesMeta: + srvx: + optional: true + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@8.0.4: + resolution: {integrity: sha512-WUn2NmdLD0FlUI8XdQrlfDjVNGLOI3cxaw7Y6msbfxn4G2vJByuO6M73Wo5B9Rd0Ap36SQhG7wsOXAMnVdC2eQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + cssnano-utils@6.0.2: + resolution: {integrity: sha512-AqysikWP69dOKAP/UMvUYrlZ1gvvQu0/eMFVUKLhH+ZM23dUAKXC31xKvNyL9It2UMF2uDmK4XotBeO9vSBKzg==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + cssnano@8.0.4: + resolution: {integrity: sha512-m6epEvKkzysdXamdK4BU9S6lQzx+syY+5Qm4f2dbpxlewBtEYOKi2v2iIr1jLsjuAr3V1WjRp6hXFPH1BEDirw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + db0@0.3.4: + resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} + peerDependencies: + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + sqlite3: '*' + peerDependenciesMeta: + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + better-sqlite3: + optional: true + drizzle-orm: + optional: true + mysql2: + optional: true + sqlite3: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.9.0: + resolution: {integrity: sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-prop@10.2.0: + resolution: {integrity: sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==} + engines: {node: '>=20'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.402: + resolution: {integrity: sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + error-stack-parser-es@2.0.1: + resolution: {integrity: sha512-J36ntO+rMQVRuR/umlmxmfLi4TpWwtmTnHoJoXTiC2xDNazs0VDPKcX6pbhZMDd2HFtH9isMBJXMdbki+A++Pg==} + + errx@0.1.2: + resolution: {integrity: sha512-chfpPHmCerdo/rXr/nNvPZRkV4WwDRwzwnsJ0Uzz3tVi8Z41tDctRjduYy1138ii77AFlts1qvWtX3g/Acg91Q==} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-npm-meta@2.2.0: + resolution: {integrity: sha512-99jPl8JkCSCa4VlboNU1XuL98ijm74Pm9CGo6H4BoMVoVh1uhguQcvwLgXDT8Vkl2qj/UEQ0J9gD8beHjTFk1w==} + hasBin: true + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fnv1a-64@0.1.2: + resolution: {integrity: sha512-mJbcILTPybAR1jdOwt/lVv8N2cffeJFFP+gVbSAwLEx1ujXH27RpPd8Rokec/KX9c76UYIB6Co+H4lQzxPnJfA==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + fuse.js@7.5.0: + resolution: {integrity: sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==} + engines: {node: '>=10'} + + fzf@0.5.2: + resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} + + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + giget@3.3.1: + resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globby@16.2.2: + resolution: {integrity: sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==} + engines: {node: '>=20'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + gzip-size@7.0.0: + resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + httpxy@0.5.5: + resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + + image-meta@0.2.2: + resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + impound@1.1.6: + resolution: {integrity: sha512-ugavDQkE74SGrBjagNIwNVHNBxX14mmfQnTm4jFGzOoWwYsgihqV698BNr5xwRY9quKK4rEg8bc6ECltllMr+w==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ioredis@5.11.1: + resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==} + engines: {node: '>=12.22.0'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + knitwork@1.3.0: + resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} + + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + listhen@1.10.1: + resolution: {integrity: sha512-6nt/86SkqUQSLW1ofz8MxC6RhRMqOl3ONISe6qqvJ3xj09aJWQx6DhgSZpugs3PX4PXdOas/WD6A9jx6J2N19A==} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.5.6 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-regexp@0.10.0: + resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} + + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@1.1.0: + resolution: {integrity: sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==} + + magicast@0.5.4: + resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimizer-webpack-plugin@5.6.1: + resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + mocked-exports@0.1.1: + resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.17: + resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanotar@0.3.0: + resolution: {integrity: sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nitropack@2.13.4: + resolution: {integrity: sha512-tX7bT6zxNeMwkc6hxHiZeUoTOjVrcjoh1Z3cmxOlodIqjl4HISgqfGOmkWSayky3Nv9Z5+KQH52F8nmXJY5AAA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + xml2js: ^0.6.2 + peerDependenciesMeta: + xml2js: + optional: true + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.4.0: + resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} + + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nostics@1.2.0: + resolution: {integrity: sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nuxt@4.5.2: + resolution: {integrity: sha512-tR3fcqeHlHmmkLMpIg3V7Y+1ltr302lW8djMw/iy+myfo7QSSz+BVJDuQhg5j73b9oteSyBfOKTDYTgvMtj6TA==} + engines: {node: ^22.19.0 || ^24.11.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + '@types/node': '>=18.12.0' + rolldown: ~1.2.1 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + '@types/node': + optional: true + + nypm@0.6.9: + resolution: {integrity: sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==} + engines: {node: '>=18'} + hasBin: true + + object-identity@0.2.3: + resolution: {integrity: sha512-2J8Joz2Tf7aaylhqFvIUJHNgpuGR38Hh75Voq9GzTbStBxJUaOtN0K1aOd3cV5qp+ij1pMqRbPrGCGMOyX303w==} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ofetch@2.0.0-alpha.3: + resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + on-change@6.0.2: + resolution: {integrity: sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w==} + engines: {node: '>=20'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + + oxc-parser@0.131.0: + resolution: {integrity: sha512-SJ3/7ZPbgie8dr5Z9BI/M51zZbpXba+hRSG0MDzVwMW5CRQg2fjYE0jHGlLX4eeiibGgC/mzoDFKSDHwVZEHRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-walker@0.7.0: + resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==} + peerDependencies: + oxc-parser: '>=0.98.0' + + oxc-walker@1.1.1: + resolution: {integrity: sha512-Hwd7dq28zu/Er99+bpWp16CGwFrhyalJh0W3JOB7XpPvgWo3MqMi2ksWGKuzzA9zt50mJ2pIUwR5lpAdZ9ACNQ==} + peerDependencies: + '@oxc-project/types': '>=0.98.0' + oxc-parser: '>=0.98.0' + rolldown: '>=1.0.0' + peerDependenciesMeta: + '@oxc-project/types': + optional: true + oxc-parser: + optional: true + rolldown: + optional: true + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-colormin@8.0.2: + resolution: {integrity: sha512-3puH3etbn8GPaJuF8OybCdUW6PJO0KU9ZnsaA/1VG9HU0Wdrf94dOTQkbQnA8/qkYdPjwHzcWvzUGXIeawBa0w==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-convert-values@8.0.2: + resolution: {integrity: sha512-KA6VVp93xASmDI0HWgRQ7938XR20hZEVL525YCbcTVsuxn4BNxs+ge4wLNow+ay+uqPuy3uEh51zhjfI92uN4w==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-discard-comments@8.0.2: + resolution: {integrity: sha512-tQk36szZkG9ngZM9bKrUp3hM2SxdclYJVnMtAMKyi0RqY7IQpx67TJ3+0thRMV47niKBw9Y/1auGkBeCfPC97A==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-discard-duplicates@8.0.2: + resolution: {integrity: sha512-Y2IDdRqvnpzsOH5ZLcJnvh/Eiye8O3r6uO7oFTe3YuFfrat3xQRDPjTVohRmi8RWuOIq2rGjva1n4Adus4pljw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-discard-empty@8.0.2: + resolution: {integrity: sha512-fGHTnqg2S4fBudyd+tCE+qT57R4YRUaYLannCrKYsE8u/rCMGCBMPwIM4jcNWJLP5vMEBitGrXa5mGB7VKA+Eg==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-discard-overridden@8.0.2: + resolution: {integrity: sha512-a9Dvv5ccOI7P94oCaeytj4FCSsHiXyH8KwXQorU/GJWDRvwFMY9yUs4uPKSG2HBSGtR49xo3ieml6F1EQCJtZA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-merge-longhand@8.0.2: + resolution: {integrity: sha512-iN1JQ21vKd3ZdbHmj69lqOwaWiFvxlXVQ5EeH/sw5M3TqI1sFR28G4yleAcNkMwB55E6qGRRVR3lem+ZJazmoQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-merge-rules@8.0.2: + resolution: {integrity: sha512-ipELN1m3k/GLGD+wmYHtiEVE2TMW5OKm4CgSRqYDeDz1ZX89AbeUCoeos0dUdTcpMilSa+zIRwvD78U3Uv/1BA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-minify-font-values@8.0.2: + resolution: {integrity: sha512-T6oURfdYH/BtXLLN/biomuY1hSYSGbfRyLyxQ+7+VCRw7Zj1ROpRwHpaX2PP/rpmT/0yHaGIVUNShmanvm3PXw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-minify-gradients@8.0.2: + resolution: {integrity: sha512-s49jAcFm5eF7GLLU0+28e4mQc/vISBMtu+1gQbq/Uf7+w155G8nbItaQp5NYY7QsYerpj2qvtNkYN25gZWWYdw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-minify-params@8.0.2: + resolution: {integrity: sha512-ifaU795JsBddkffWbTOXl8ubUyBqpNiLS8xjqKmE/Sw9AOpjWG2uFPfpEv3AZPXWNkWJf8kGvW9wLHImEUJUkA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-minify-selectors@8.0.3: + resolution: {integrity: sha512-3WchKL9xoA80/jNkRcimRGIc9mP6sHPQUY/1WzV+GbF69I/upieyaKzZcIdQzf9cBmCJ6vjxi+NrKqCojoOb7Q==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-charset@8.0.2: + resolution: {integrity: sha512-iy3/b+gX+dHfbNZq/4rfThbMAqxhneBJEhS71y5toliav5rLowkZ6g0ZJGymXRZytDOt/u+fRSFkNJLkRPYaug==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-display-values@8.0.2: + resolution: {integrity: sha512-T6Az9mgc7FUWvI6mK0uOsItT6csep7fdLtDSRC2XBMTCvrQmtYiz86T5hEM6sfAkZVVhfrALPhdPxJWVoNAktw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-positions@8.0.2: + resolution: {integrity: sha512-BBg188AxYLC86LDEnkbQTcdnZugP2vDwYQQDV+Htju2gpTqM2a3o/oQ91/h9+j0277InjNgrI7l1LDDRrlWQ5w==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-repeat-style@8.0.2: + resolution: {integrity: sha512-6mbVJzuogwcAHMd6MMpmAMcc3BkleOcY2xazCp+HCMiod78tx7rdOrufTrPYGjBLaTjkgNUr8KCkLHj8mfH6WQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-string@8.0.2: + resolution: {integrity: sha512-8UK2KJSChlv7V12QgWTWtbRzzZcki/f21e8egMlFHTE9rEBCCyLo60rcY3mh77cDZhrBSIfKM9ciOsU6249nbA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-timing-functions@8.0.2: + resolution: {integrity: sha512-C2OyYiEMKjCxA0m+QJ5SeMf12OenIIGqrXEuWizEunZZP+s5TRq1aT8naxqr/8rytSRqD4SwH4mywc9G44u4cw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-unicode@8.0.2: + resolution: {integrity: sha512-ttWq9oM88gSPpfspoZB49r/lv1fvjOadi79E/4BxGVt0rughnNDdTnDLmWj+epOjS6iKhmse3kbNcISR6Jl+3A==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-url@8.0.2: + resolution: {integrity: sha512-PvSiaJOQpP0AW5GSHrWZXupfhUgLUtS1MubJX+wPwh6RZZP6CHnZQy/S8uX2vvHMd57qIZ44Sb/37rFMiAWPfA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-normalize-whitespace@8.0.2: + resolution: {integrity: sha512-Fipz8bjy96XPmtMPsqbGw3fypbS+aOHJfpTzfQY9z0lDYFqqGIqYWwrfsi2ZOv7B86pY81vQGJ6mSHWvTXDV7g==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-ordered-values@8.0.2: + resolution: {integrity: sha512-LBqMGd6Bam4TVp9dKui01o0prWtsGfPP+WtENunNs3L9oi+t75uPyEmzzaimxinmGgeiFLix9xLI0FfD+qedjw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-reduce-initial@8.0.2: + resolution: {integrity: sha512-+612lhSpyp1g4ZU0zQKwmdHnAi8LevMpzvQuP2RVhq+EUWqAwwUMk03OQEfzy+es9OSdRTuy5ugnFeEeOiIe2A==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-reduce-transforms@8.0.2: + resolution: {integrity: sha512-7D2vDXJ2HBNQpbiw5dY9UyLfBRCGRBjV0ChMqHdHghFsjAH3hIIUgb/rE+e77LFiT8VjXUK2fZh3omG4R96n8A==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} + engines: {node: '>=4'} + + postcss-svgo@8.0.3: + resolution: {integrity: sha512-ADG8YNtwE5bcqvxw1gU0X7FkgdvinZZxWKHSCMwayX7gPl4XRmBMyiC84Ukal5bPS9Nk/2tI7siJwqxIN4/grg==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-unique-selectors@8.0.2: + resolution: {integrity: sha512-cIftRB4rW3UCqnQjFAS6WlUzragjsU2AtMzWDdDQKTMjgPh1rO8qYgnoYqkUgRXKnxd3902laOWbkkYO/GYEHw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@7.1.1: + resolution: {integrity: sha512-X+vn9z8nOFZQlxOLmfJ0iKDdMD7jYTsTW12OAlCpdoE3Igik6L37pugIZi+N3usuyp5McfgKPWi12q3zvHLeGQ==} + engines: {node: '>=20'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rolldown-string@0.3.1: + resolution: {integrity: sha512-dv8GOXkYqUQdI0rsXB8hmzO95pKWSuX2eg5/JSJa9czfEVIFuKNR7ZJDfat8LlmD35RAhWY+evS7/wXXqFDfSg==} + engines: {node: '>=20.19.0'} + peerDependencies: + rolldown: '*' + peerDependenciesMeta: + rolldown: + optional: true + + rolldown@1.2.3: + resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup-plugin-visualizer@7.0.1: + resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} + engines: {node: '>=22'} + hasBin: true + peerDependencies: + rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup@4.62.4: + resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rou3@0.9.1: + resolution: {integrity: sha512-z/sSmzvtwMDDnxsPVhfWMuG6F6mbmhFDXoVqLmMfbpDD9qfV3GDmSQpf0+W296/ZDIpW2wcMmBfpVFzcnOi/nA==} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serialize-javascript@7.0.7: + resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} + engines: {node: '>=20.0.0'} + + seroval@1.6.2: + resolution: {integrity: sha512-mPT+SD2TrlB6wvte1KkYOYUkubaTbd6pZ/6Kk3C9nxzrHmCZyhxOO7XGAeL7f+yLKZglzGtM9odUVvg/EhO+vQ==} + engines: {node: '>=10'} + + serve-placeholder@2.0.2: + resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git@3.36.0: + resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smob@1.6.2: + resolution: {integrity: sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==} + engines: {node: '>=20.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + srvx@0.11.22: + resolution: {integrity: sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==} + engines: {node: '>=20.16.0'} + hasBin: true + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + + string-width-cjs@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + aliasOf: string-width + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi-cjs@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + aliasOf: strip-ansi + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-literal@4.0.0: + resolution: {integrity: sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==} + + structured-clone-es@2.0.1: + resolution: {integrity: sha512-10ZL5r77LhknxlP1FBiCW+VdnuWOEFLdSS2SKtjyEV+L4qP1hUEIMIZW94LC3jKxRmT/Dj7KkD1mqh/IY6lhKQ==} + + stylehacks@8.0.2: + resolution: {integrity: sha512-3d5vjQODiMc4VwED1w24fAYSfeAjdIRLy88cJQ9NAYkZr/6ozCVbusda5N+0kXsfGWW3pizUgYK2TOZxiU0cSQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.25 + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svgo@4.0.2: + resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==} + engines: {node: '>=16'} + hasBin: true + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + terser@5.49.2: + resolution: {integrity: sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyclip@0.1.15: + resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} + engines: {node: ^16.14.0 || >= 17.3.0} + + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} + engines: {node: '>=20'} + + type-level-regexp@0.1.17: + resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + unconfig@7.5.0: + resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + unctx@2.5.0: + resolution: {integrity: sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==} + + unctx@3.0.0: + resolution: {integrity: sha512-DoXdZVeyi2jyEsn86i8MO5RTItm1kffUkH9/+DQORn3Q688AMOy2551CIl6AdGL2UpwD675wtbNOl75wIQN/uA==} + peerDependencies: + magic-string: '>=0.30.21' + oxc-parser: '>=0.140.0' + rolldown: ^1.1.5 + unplugin: ^3.3.0 + peerDependenciesMeta: + magic-string: + optional: true + oxc-parser: + optional: true + rolldown: + optional: true + unplugin: + optional: true + + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + undici@8.10.0: + resolution: {integrity: sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==} + engines: {node: '>=22.19.0'} + + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + + unhead@3.3.1: + resolution: {integrity: sha512-eqHlbLyuvIXw898WopQmosTml4PdYW5ZhXDom/sf7ysAqQB9uvYrw2/dNvbrmkJTufSkmNmgGCjoQcvoT2mS/A==} + peerDependencies: + vite: '>=6.4.2' + peerDependenciesMeta: + vite: + optional: true + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + + unimport@6.4.0: + resolution: {integrity: sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + oxc-parser: '*' + rolldown: ^1.0.0 + peerDependenciesMeta: + oxc-parser: + optional: true + rolldown: + optional: true + + unocss@66.7.5: + resolution: {integrity: sha512-nAdmU8TwnQoiLnQjZ6Hm1GmHy9lTexKsAZNEJtZnxN9wyFRc1eLjQgmh9r7UEGxBQMQLD8OZOgmk5HpwObbh0Q==} + peerDependencies: + '@unocss/astro': 66.7.5 + '@unocss/postcss': 66.7.5 + '@unocss/webpack': 66.7.5 + peerDependenciesMeta: + '@unocss/astro': + optional: true + '@unocss/postcss': + optional: true + '@unocss/webpack': + optional: true + + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + unplugin@3.3.0: + resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + + unrouting@0.2.2: + resolution: {integrity: sha512-EoCab68s1o9AWFq9fjKsMEsmjKrPO11SAsvopikks2eEm/KLXgZMCof4cgpVgdy0Vz71OFBJw6DoDqu1oOSFGw==} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + untun@0.2.2: + resolution: {integrity: sha512-+NnOJcSiEtYsVgJmXUzQbJeRAFXJC4yPJYuh6kF9B0Rm6zunXcs/3GZOTllyocSbUDIxD6Bj7e/4ATw7sph1Sw==} + hasBin: true + + untyped@2.0.0: + resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} + hasBin: true + + unwasm@0.5.3: + resolution: {integrity: sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uqr@0.1.3: + resolution: {integrity: sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} + + vite-dev-rpc@2.0.0: + resolution: {integrity: sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0 + + vite-hot-client@2.2.0: + resolution: {integrity: sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0 + + vite-node@6.0.0: + resolution: {integrity: sha512-oj4PVrT+pDh6GYf5wfUXkcZyekYS8kKPfLPXVl8qe324Ec6l4K2DUKNadRbZ3LQl0qGcDz+PyOo7ZAh00Y+JjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + vite-plugin-checker@0.14.5: + resolution: {integrity: sha512-c9lQ92eisUO+F7Fd93aelojmiOS+NQpPgQ1XR2LTQHox1/laZf4yAoQj+L3RA9Vgh10e2nFd9b8r2LLyYZsbpA==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@biomejs/biome': '>=2.4.12' + eslint: '>=9.39.4' + meow: ^13.2.0 || ^14.0.0 + optionator: ^0.9.4 + oxlint: '>=1' + stylelint: '>=16.26.1' + typescript: '*' + vite: '>=5.4.21' + vue-tsc: ~2.2.10 || ^3.0.0 + peerDependenciesMeta: + '@biomejs/biome': + optional: true + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + oxlint: + optional: true + stylelint: + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + vite-plugin-inspect@11.4.1: + resolution: {integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 || ^8.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-tracer@1.4.0: + resolution: {integrity: sha512-0tQCjCqZWVSK6UeRW9S4ABbf47lKQ68zvrT2FNvZmiL+alDydCVyH/T3Jlfbdc3T3C2Iuyyl5aVsMbF8IQIoxA==} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vue: ^3.5.0 + + vite@8.2.1: + resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.4.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-bundle-renderer@2.3.1: + resolution: {integrity: sha512-7F4LNMopUw5RgYWo4zCmVUHCc6aQRC6dCKHUYkM/n+fux4AUGdL1x6m5A515WWyFysRRN7cx3hBzVqoisfRfzw==} + + vue-component-type-helpers@3.3.9: + resolution: {integrity: sha512-3c/UfMe0SqyEfcGTyH7mfshHagJ9QTCbppCb0/uGpHZpFug7+If3GeGZN7I0YheKEExemx3xldQPoO7PQSOLQg==} + + vue-devtools-stub@0.1.0: + resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} + + vue-router@5.2.0: + resolution: {integrity: sha512-QAC5i0LEb1GLG0LXDQmHu8L7FX12j0KwU/JTKmLQUJMrn04gQdKP6Du+p0QwpHb3iy71vBlqnHQ8WAfOSAWhqw==} + peerDependencies: + '@pinia/colada': '>=0.21.2' + '@vue/compiler-sfc': ^3.5.34 || ^4.0.0 + pinia: ^3.0.4 || ^4.0.2 + vite: ^7.3.0 || ^8.0.0 + vue: ^3.5.34 || ^4.0.0 + peerDependenciesMeta: + '@pinia/colada': + optional: true + '@vue/compiler-sfc': + optional: true + pinia: + optional: true + vite: + optional: true + + vue-tsc@3.3.9: + resolution: {integrity: sha512-TS3Y1ux/IRoE8OCP2PpACAeOseuIs0UvWrcr7u+w3PmfY+SlCfEf8zjrBgnQksHUgLpthi5vHlffcQTQTdPBZA==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.41: + resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} + engines: {node: '>=10.13.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-sources@3.5.1: + resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + webpack@5.109.2: + resolution: {integrity: sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + + wrap-ansi-cjs@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + aliasOf: wrap-ansi + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + ws@8.21.2: + resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.1: + resolution: {integrity: sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.8.0 + tinyexec: 1.3.0 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@8.0.0': + dependencies: + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.7 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.8 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-string-parser@8.0.0': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-identifier@8.0.4': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/parser@8.0.4': + dependencies: + '@babel/types': 8.0.4 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.8': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@babel/types@8.0.4': + dependencies: + '@babel/helper-string-parser': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + + '@bomb.sh/tab@0.0.19(citty@0.2.2)': + dependencies: + citty: 0.2.2 + + '@clack/core@1.4.3': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.7.0': + dependencies: + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@cloudflare/kv-asset-handler@0.4.2': {} + + '@colordx/core@5.5.0': {} + + '@dxup/nuxt@0.5.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))': + dependencies: + '@dxup/unimport': 0.1.2 + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + '@vue/compiler-dom': 3.5.41 + chokidar: 5.0.0 + knitwork: 1.3.0 + magic-string: 1.1.0 + pathe: 2.0.3 + tinyglobby: 0.2.17 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - magicast + - oxc-parser + - unloader + - webpack + + '@dxup/unimport@0.1.2': {} + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.4': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 + + '@ioredis/commands@1.10.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: 4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: 6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: 7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.8.5 + tar: 7.5.22 + transitivePeerDependencies: + - encoding + - supports-color + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nuxt/cli@3.37.0(@nuxt/schema@4.5.2)': + dependencies: + '@bomb.sh/tab': 0.0.19(citty@0.2.2) + '@clack/prompts': 1.7.0 + '@nuxt/schema': 4.5.2 + c12: 3.3.4 + citty: 0.2.2 + confbox: 0.2.4 + consola: 3.4.2 + debug: 4.4.3 + defu: 6.1.7 + exsolve: 1.1.1 + fuse.js: 7.5.0 + fzf: 0.5.2 + giget: 3.3.1 + jiti: 2.7.0 + listhen: 1.10.1 + nypm: 0.6.9 + ofetch: 1.5.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + scule: 1.3.0 + semver: 7.8.5 + srvx: 0.11.22 + std-env: 4.2.0 + tinyclip: 0.1.15 + tinyexec: 1.3.0 + ufo: 1.6.4 + youch: 4.1.1 + transitivePeerDependencies: + - '@parcel/watcher' + - cac + - commander + - magicast + - supports-color + + '@nuxt/devalue@2.0.2': {} + + '@nuxt/devtools-kit@3.4.1(vite@8.2.1(@types/node@26.1.2))': + dependencies: + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + execa: 8.0.1 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + transitivePeerDependencies: + - magicast + - oxc-parser + + '@nuxt/devtools-wizard@3.4.1': + dependencies: + '@clack/prompts': 1.7.0 + consola: 3.4.2 + diff: 8.0.4 + execa: 8.0.1 + magicast: 0.5.4 + pathe: 2.0.3 + pkg-types: 2.3.1 + semver: 7.8.5 + + '@nuxt/devtools@3.4.1(vite@8.2.1(@types/node@26.1.2))': + dependencies: + '@nuxt/devtools-kit': 3.4.1(vite@8.2.1(@types/node@26.1.2)) + '@nuxt/devtools-wizard': 3.4.1 + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + '@vue/devtools-core': 8.2.1(vue@3.5.41(typescript@5.9.3)) + '@vue/devtools-kit': 8.2.1 + birpc: 4.0.0 + consola: 3.4.2 + destr: 2.0.5 + error-stack-parser-es: 2.0.1 + execa: 8.0.1 + fast-npm-meta: 2.2.0 + get-port-please: 3.2.0 + hookable: 6.1.1 + image-meta: 0.2.2 + is-installed-globally: 1.0.0 + launch-editor: 2.14.1 + local-pkg: 1.2.1 + magicast: 0.5.4 + nypm: 0.6.9 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + semver: 7.8.5 + simple-git: 3.36.0 + sirv: 3.0.2 + structured-clone-es: 2.0.1 + tinyglobby: 0.2.17 + unstorage: 1.17.5 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vite-plugin-inspect: 11.4.1(@nuxt/kit@4.5.2)(vite@8.2.1(@types/node@26.1.2)) + vite-plugin-vue-tracer: 1.4.0(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3)) + which: 6.0.1 + ws: 8.21.2 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - idb-keyval + - ioredis + - magicast + - oxc-parser + - supports-color + - uploadthing + - utf-8-validate + + '@nuxt/kit@4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)))': + dependencies: + c12: 3.3.4 + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + errx: 0.1.2 + exsolve: 1.1.1 + ignore: 7.0.6 + jiti: 2.7.0 + klona: 2.0.6 + mlly: 1.8.2 + nostics: 1.2.0 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.1 + rc9: 3.0.1 + scule: 1.3.0 + tinyglobby: 0.2.17 + ufo: 1.6.4 + unctx: 3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + untyped: 2.0.0 + verkit: 0.3.2 + transitivePeerDependencies: + - magicast + - oxc-parser + + '@nuxt/nitro-server@4.5.2(nuxt@4.5.2(@types/node@26.1.2)(rolldown@1.2.3))': + dependencies: + '@nuxt/devalue': 2.0.2 + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + '@unhead/vue': 3.3.1(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3)) + '@vue/shared': 3.5.41 + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + devalue: 5.9.0 + errx: 0.1.2 + escape-string-regexp: 5.0.0 + exsolve: 1.1.1 + h3: 1.15.11 + impound: 1.1.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + klona: 2.0.6 + mocked-exports: 0.1.1 + nitropack: 2.13.4 + nostics: 1.2.0 + nuxt: 4.5.2(@types/node@26.1.2)(rolldown@1.2.3) + nypm: 0.6.9 + ohash: 2.0.11 + pathe: 2.0.3 + rou3: 0.9.1 + std-env: 4.2.0 + ufo: 1.6.4 + unctx: 3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + unstorage: 1.17.5 + vue: 3.5.41(typescript@5.9.3) + vue-bundle-renderer: 2.3.1 + vue-devtools-stub: 0.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@farmfe/core' + - '@libsql/client' + - '@netlify/blobs' + - '@oxc-project/types' + - '@parcel/watcher' + - '@planetscale/database' + - '@rspack/core' + - '@unhead/cli' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools-kit' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - bun-types-no-globals + - db0 + - drizzle-orm + - encoding + - esbuild + - idb-keyval + - ioredis + - lightningcss + - magicast + - mysql2 + - oxc-parser + - react-native-b4a + - sqlite3 + - supports-color + - unloader + - uploadthing + - webpack + - xml2js + + '@nuxt/schema@4.5.2': + dependencies: + '@vue/shared': 3.5.41 + defu: 6.1.7 + nostics: 1.2.0 + pathe: 2.0.3 + pkg-types: 2.3.1 + std-env: 4.2.0 + + '@nuxt/telemetry@2.8.0(@nuxt/kit@4.5.2)': + dependencies: + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + citty: 0.2.2 + consola: 3.4.2 + ofetch: 2.0.0-alpha.3 + rc9: 3.0.1 + std-env: 4.2.0 + + '@nuxt/vite-builder@4.5.2(nuxt@4.5.2(@types/node@26.1.2)(rolldown@1.2.3))(rolldown@1.2.3)(vue@3.5.41(typescript@5.9.3))': + dependencies: + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + '@vitejs/plugin-vue': 6.0.8(vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0))(vue@3.5.41(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0))(vue@3.5.41(typescript@5.9.3)) + autoprefixer: 10.5.4(postcss@8.5.26) + consola: 3.4.2 + cssnano: 8.0.4(postcss@8.5.26) + defu: 6.1.7 + escape-string-regexp: 5.0.0 + exsolve: 1.1.1 + generic-names: 4.0.0 + get-port-please: 3.2.0 + jiti: 2.7.0 + js-tokens: 10.0.0 + knitwork: 1.3.0 + mlly: 1.8.2 + mocked-exports: 0.1.1 + nuxt: 4.5.2(@types/node@26.1.2)(rolldown@1.2.3) + nypm: 0.6.9 + pathe: 2.0.3 + pkg-types: 2.3.1 + postcss: 8.5.26 + rolldown: 1.2.3 + rolldown-string: 0.3.1(rolldown@1.2.3) + seroval: 1.6.2 + std-env: 4.2.0 + ufo: 1.6.4 + unenv: 2.0.0-rc.24 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vite-node: 6.0.0(@types/node@26.1.2)(jiti@2.7.0) + vite-plugin-checker: 0.14.5(typescript@5.9.3)(vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0))(vue-tsc@3.3.9(typescript@5.9.3)) + vue: 3.5.41(typescript@5.9.3) + vue-bundle-renderer: 2.3.1 + transitivePeerDependencies: + - '@biomejs/biome' + - '@vitejs/devtools' + - esbuild + - eslint + - less + - magicast + - meow + - optionator + - oxc-parser + - oxlint + - sass + - sass-embedded + - stylelint + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@oxc-parser/binding-android-arm-eabi@0.131.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.131.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.131.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.131.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.131.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.131.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.131.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.131.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.131.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.131.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.131.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.131.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.131.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.131.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.131.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.131.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.131.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.131.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.131.0': + optional: true + + '@oxc-project/types@0.131.0': {} + + '@oxc-project/types@0.143.0': {} + + '@parcel/watcher-wasm@2.6.0': + dependencies: + is-glob: 4.0.3 + picomatch: 4.0.5 + bundledDependencies: + - napi-wasm + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.29': {} + + '@poppinss/colors@4.1.6': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.7.0': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.2.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.3': + optional: true + + '@rolldown/binding-darwin-x64@1.2.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.3': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.3': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/plugin-alias@6.0.0(rollup@4.62.4)': + dependencies: + rollup: 4.62.4 + + '@rollup/plugin-commonjs@29.0.3(rollup@4.62.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.4) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.5) + is-reference: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.5 + rollup: 4.62.4 + + '@rollup/plugin-inject@5.0.5(rollup@4.62.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.4) + estree-walker: 2.0.2 + magic-string: 0.30.21 + rollup: 4.62.4 + + '@rollup/plugin-json@6.1.0(rollup@4.62.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.4) + rollup: 4.62.4 + + '@rollup/plugin-node-resolve@16.0.3(rollup@4.62.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.4) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.12 + rollup: 4.62.4 + + '@rollup/plugin-replace@6.0.3(rollup@4.62.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.4) + magic-string: 0.30.21 + rollup: 4.62.4 + + '@rollup/plugin-terser@1.0.0(rollup@4.62.4)': + dependencies: + rollup: 4.62.4 + serialize-javascript: 7.0.7 + smob: 1.6.2 + terser: 5.49.2 + + '@rollup/pluginutils@5.4.0(rollup@4.62.4)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.5 + rollup: 4.62.4 + + '@rollup/rollup-android-arm-eabi@4.62.4': + optional: true + + '@rollup/rollup-android-arm64@4.62.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.4': + optional: true + + '@rollup/rollup-darwin-x64@4.62.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.4': + optional: true + + '@simple-git/args-pathspec@1.0.3': {} + + '@simple-git/argv-parser@1.1.1': + dependencies: + '@simple-git/args-pathspec': 1.0.3 + + '@sindresorhus/is@7.2.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@speed-highlight/core@1.2.23': {} + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/estree@1.0.9': {} + + '@types/jsesc@2.5.1': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@26.1.2': + dependencies: + undici-types: 8.3.0 + + '@types/resolve@1.20.2': {} + + '@unhead/bundler@3.3.1(rolldown@1.2.3)(unhead@3.3.1(vite@8.2.1(@types/node@26.1.2)))(vite@8.2.1(@types/node@26.1.2))': + dependencies: + magic-string: 1.1.0 + oxc-walker: 1.1.1(rolldown@1.2.3) + rolldown: 1.2.3 + unhead: 3.3.1(vite@8.2.1(@types/node@26.1.2)) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@oxc-project/types' + - '@rspack/core' + - bun-types-no-globals + - oxc-parser + - unloader + - webpack + + '@unhead/vue@3.3.1(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3))': + dependencies: + '@unhead/bundler': 3.3.1(rolldown@1.2.3)(unhead@3.3.1(vite@8.2.1(@types/node@26.1.2)))(vite@8.2.1(@types/node@26.1.2)) + hookable: 6.1.1 + unhead: 3.3.1(vite@8.2.1(@types/node@26.1.2)) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vue: 3.5.41(typescript@5.9.3) + transitivePeerDependencies: + - '@farmfe/core' + - '@oxc-project/types' + - '@rspack/core' + - '@unhead/cli' + - '@vitejs/devtools-kit' + - bun-types-no-globals + - esbuild + - lightningcss + - oxc-parser + - unloader + - webpack + + '@unocss/cli@66.7.5': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.7.5 + '@unocss/core': 66.7.5 + '@unocss/preset-wind3': 66.7.5 + '@unocss/preset-wind4': 66.7.5 + '@unocss/transformer-directives': 66.7.5 + cac: 7.0.0 + chokidar: 5.0.0 + colorette: 2.0.20 + consola: 3.4.2 + magic-string: 0.30.21 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + tinyglobby: 0.2.17 + unplugin-utils: 0.3.2 + + '@unocss/config@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + colorette: 2.0.20 + consola: 3.4.2 + unconfig: 7.5.0 + + '@unocss/core@66.7.5': {} + + '@unocss/extractor-arbitrary-variants@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + + '@unocss/inspector@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/rule-utils': 66.7.5 + colorette: 2.0.20 + gzip-size: 6.0.0 + sirv: 3.0.2 + + '@unocss/nuxt@66.7.5(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)))(vite@8.2.1(@types/node@26.1.2))(webpack@5.109.2)': + dependencies: + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + '@unocss/config': 66.7.5 + '@unocss/core': 66.7.5 + '@unocss/preset-attributify': 66.7.5 + '@unocss/preset-icons': 66.7.5 + '@unocss/preset-tagify': 66.7.5 + '@unocss/preset-typography': 66.7.5 + '@unocss/preset-web-fonts': 66.7.5 + '@unocss/preset-wind3': 66.7.5 + '@unocss/preset-wind4': 66.7.5 + '@unocss/reset': 66.7.5 + '@unocss/vite': 66.7.5(vite@8.2.1(@types/node@26.1.2)) + '@unocss/webpack': 66.7.5(webpack@5.109.2) + unocss: 66.7.5(@unocss/webpack@66.7.5(webpack@5.109.2)) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - '@unocss/astro' + - '@unocss/postcss' + - bun-types-no-globals + - magicast + - oxc-parser + - unloader + + '@unocss/preset-attributify@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + + '@unocss/preset-icons@66.7.5': + dependencies: + '@iconify/utils': 3.1.4 + '@unocss/core': 66.7.5 + ofetch: 1.5.1 + + '@unocss/preset-mini@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/extractor-arbitrary-variants': 66.7.5 + '@unocss/rule-utils': 66.7.5 + + '@unocss/preset-tagify@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + + '@unocss/preset-typography@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/rule-utils': 66.7.5 + + '@unocss/preset-uno@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/preset-wind3': 66.7.5 + + '@unocss/preset-web-fonts@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + ofetch: 1.5.1 + + '@unocss/preset-wind3@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/preset-mini': 66.7.5 + '@unocss/rule-utils': 66.7.5 + + '@unocss/preset-wind4@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/extractor-arbitrary-variants': 66.7.5 + '@unocss/rule-utils': 66.7.5 + + '@unocss/preset-wind@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/preset-wind3': 66.7.5 + + '@unocss/reset@66.7.5': {} + + '@unocss/rule-utils@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + magic-string: 0.30.21 + + '@unocss/transformer-attributify-jsx@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + oxc-parser: 0.131.0 + oxc-walker: 0.7.0(oxc-parser@0.131.0) + + '@unocss/transformer-compile-class@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + + '@unocss/transformer-directives@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + '@unocss/rule-utils': 66.7.5 + css-tree: 3.2.1 + + '@unocss/transformer-variant-group@66.7.5': + dependencies: + '@unocss/core': 66.7.5 + + '@unocss/vite@66.7.5(vite@8.2.1(@types/node@26.1.2))': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.7.5 + '@unocss/core': 66.7.5 + '@unocss/inspector': 66.7.5 + chokidar: 5.0.0 + magic-string: 0.30.21 + pathe: 2.0.3 + tinyglobby: 0.2.17 + unplugin-utils: 0.3.2 + vite: 8.2.1(@types/node@26.1.2) + + '@unocss/webpack@66.7.5(webpack@5.109.2)': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.7.5 + '@unocss/core': 66.7.5 + chokidar: 5.0.0 + magic-string: 0.30.21 + pathe: 2.0.3 + tinyglobby: 0.2.17 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))(webpack@5.109.2) + unplugin-utils: 0.3.2 + webpack: 5.109.2 + webpack-sources: 3.5.1 + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - unloader + + '@vercel/nft@1.10.2(rollup@4.62.4)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.4.0(rollup@4.62.4) + acorn: 8.18.0 + acorn-import-attributes: 1.9.5(acorn@8.18.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.5 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@vitejs/plugin-vue-jsx@5.1.6(vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0))(vue@3.5.41(typescript@5.9.3))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.1 + '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vue: 3.5.41(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0))(vue@3.5.41(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vue: 3.5.41(typescript@5.9.3) + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue-macros/common@3.1.4(vue@3.5.41(typescript@5.9.3))': + dependencies: + '@vue/compiler-sfc': 3.5.41 + ast-kit: 2.2.0 + local-pkg: 1.2.1 + magic-string-ast: 1.0.3 + unplugin-utils: 0.3.2 + vue: 3.5.41(typescript@5.9.3) + + '@vue/babel-helper-vue-transform-on@2.0.1': {} + + '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@vue/babel-helper-vue-transform-on': 2.0.1 + '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.7) + '@vue/shared': 3.5.41 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.7)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/parser': 7.29.8 + '@vue/compiler-sfc': 3.5.41 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.41': + dependencies: + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.41 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.41': + dependencies: + '@vue/compiler-core': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/compiler-sfc@3.5.41': + dependencies: + '@babel/parser': 7.29.8 + '@vue/compiler-core': 3.5.41 + '@vue/compiler-dom': 3.5.41 + '@vue/compiler-ssr': 3.5.41 + '@vue/shared': 3.5.41 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.26 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.41': + dependencies: + '@vue/compiler-dom': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/devtools-api@8.2.1': + dependencies: + '@vue/devtools-kit': 8.2.1 + + '@vue/devtools-core@8.2.1(vue@3.5.41(typescript@5.9.3))': + dependencies: + '@vue/devtools-kit': 8.2.1 + '@vue/devtools-shared': 8.2.1 + vue: 3.5.41(typescript@5.9.3) + + '@vue/devtools-kit@8.2.1': + dependencies: + '@vue/devtools-shared': 8.2.1 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + + '@vue/devtools-shared@8.2.1': {} + + '@vue/language-core@3.3.9': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.41 + '@vue/shared': 3.5.41 + alien-signals: 3.2.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.5 + + '@vue/reactivity@3.5.41': + dependencies: + '@vue/shared': 3.5.41 + + '@vue/runtime-core@3.5.41': + dependencies: + '@vue/reactivity': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/runtime-dom@3.5.41': + dependencies: + '@vue/reactivity': 3.5.41 + '@vue/runtime-core': 3.5.41 + '@vue/shared': 3.5.41 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.41': + dependencies: + '@vue/compiler-ssr': 3.5.41 + '@vue/runtime-dom': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/shared@3.5.41': {} + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abbrev@3.0.1: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + + acorn@8.18.0: {} + + agent-base@7.1.4: {} + + ajv-formats@2.1.1(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + + ajv-keywords@5.1.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + fast-deep-equal: 3.1.3 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@3.2.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + ansis@4.3.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + archiver-utils@5.0.2: + dependencies: + glob: 10.5.0 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.18.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.2.0 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.29.8 + pathe: 2.0.3 + + ast-walker-scope@0.9.0: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + ast-kit: 2.2.0 + + async-sema@3.1.1: {} + + async@3.2.6: {} + + autoprefixer@10.5.4(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + caniuse-lite: 1.0.30001807 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + b4a@1.8.1: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + bare-events@2.9.1: {} + + bare-fs@4.8.0: + dependencies: + bare-events: 2.9.1 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.7 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + bare-path@3.1.1: {} + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + bare-events: 2.9.1 + streamx: 2.28.0 + teex: 1.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-url@2.4.7: + dependencies: + bare-path: 3.1.1 + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.11.12: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + birpc@2.9.0: {} + + birpc@4.0.0: {} + + boolbase@1.0.0: {} + + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.7: + dependencies: + baseline-browser-mapping: 2.11.12 + caniuse-lite: 1.0.30001807 + electron-to-chromium: 1.5.402 + node-releases: 2.0.53 + update-browserslist-db: 1.2.3(browserslist@4.28.7) + + buffer-crc32@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + c12@3.3.4: + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.1.1 + giget: 3.3.1 + jiti: 2.7.0 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + + c12@3.3.4(magicast@0.5.4): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.1.1 + giget: 3.3.1 + jiti: 2.7.0 + magicast: 0.5.4 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + + cac@7.0.0: {} + + caniuse-api@4.0.0: + dependencies: + browserslist: 4.28.7 + caniuse-lite: 1.0.30001807 + + caniuse-lite@1.0.30001807: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + + chownr@3.0.0: {} + + chrome-trace-event@1.0.4: {} + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + citty@0.2.2: {} + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + cluster-key-slot@1.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@11.1.0: {} + + commander@2.20.3: {} + + commondir@1.0.1: {} + + compatx@0.2.0: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + confbox@0.1.8: {} + + confbox@0.2.4: {} + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.3: {} + + cookie-es@2.0.1: {} + + cookie-es@3.1.1: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + croner@10.0.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + crossws@0.4.10(srvx@0.11.22): + dependencies: + srvx: 0.11.22 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@8.0.4(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + cssnano-utils: 6.0.2(postcss@8.5.26) + postcss: 8.5.26 + postcss-calc: 10.1.1(postcss@8.5.26) + postcss-colormin: 8.0.2(postcss@8.5.26) + postcss-convert-values: 8.0.2(postcss@8.5.26) + postcss-discard-comments: 8.0.2(postcss@8.5.26) + postcss-discard-duplicates: 8.0.2(postcss@8.5.26) + postcss-discard-empty: 8.0.2(postcss@8.5.26) + postcss-discard-overridden: 8.0.2(postcss@8.5.26) + postcss-merge-longhand: 8.0.2(postcss@8.5.26) + postcss-merge-rules: 8.0.2(postcss@8.5.26) + postcss-minify-font-values: 8.0.2(postcss@8.5.26) + postcss-minify-gradients: 8.0.2(postcss@8.5.26) + postcss-minify-params: 8.0.2(postcss@8.5.26) + postcss-minify-selectors: 8.0.3(postcss@8.5.26) + postcss-normalize-charset: 8.0.2(postcss@8.5.26) + postcss-normalize-display-values: 8.0.2(postcss@8.5.26) + postcss-normalize-positions: 8.0.2(postcss@8.5.26) + postcss-normalize-repeat-style: 8.0.2(postcss@8.5.26) + postcss-normalize-string: 8.0.2(postcss@8.5.26) + postcss-normalize-timing-functions: 8.0.2(postcss@8.5.26) + postcss-normalize-unicode: 8.0.2(postcss@8.5.26) + postcss-normalize-url: 8.0.2(postcss@8.5.26) + postcss-normalize-whitespace: 8.0.2(postcss@8.5.26) + postcss-ordered-values: 8.0.2(postcss@8.5.26) + postcss-reduce-initial: 8.0.2(postcss@8.5.26) + postcss-reduce-transforms: 8.0.2(postcss@8.5.26) + postcss-svgo: 8.0.3(postcss@8.5.26) + postcss-unique-selectors: 8.0.2(postcss@8.5.26) + + cssnano-utils@6.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + cssnano@8.0.4(postcss@8.5.26): + dependencies: + cssnano-preset-default: 8.0.4(postcss@8.5.26) + lilconfig: 3.1.3 + postcss: 8.5.26 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.2.3: {} + + db0@0.3.4: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deepmerge@4.3.1: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + defu@6.1.7: {} + + denque@2.1.0: {} + + depd@2.0.0: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: {} + + devalue@5.9.0: {} + + diff@8.0.4: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-prop@10.2.0: + dependencies: + type-fest: 5.8.0 + + dotenv@17.4.2: {} + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.402: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.24.5: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@4.5.0: {} + + entities@7.0.1: {} + + error-stack-parser-es@1.0.5: {} + + error-stack-parser-es@2.0.1: {} + + errx@0.1.2: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.3.1: {} + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exsolve@1.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-npm-meta@2.2.0: + dependencies: + cac: 7.0.0 + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-uri@3.1.5: {} + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.5): + dependencies: + picomatch: 4.0.5 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fnv1a-64@0.1.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fraction.js@5.3.4: {} + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + fuse.js@7.5.0: {} + + fzf@0.5.2: {} + + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + get-port-please@3.2.0: {} + + get-stream@8.0.1: {} + + giget@3.3.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@13.0.6: + dependencies: + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globby@16.2.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.6 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 + + graceful-fs@4.2.11: {} + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + gzip-size@7.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.5 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + has-flag@4.0.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hookable@5.5.3: {} + + hookable@6.1.1: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http-shutdown@1.2.2: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + httpxy@0.5.5: {} + + human-signals@5.0.0: {} + + ieee754@1.2.1: {} + + ignore@7.0.6: {} + + image-meta@0.2.2: {} + + import-meta-resolve@4.2.0: {} + + impound@1.1.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + es-module-lexer: 2.3.1 + pathe: 2.0.3 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + unplugin-utils: 0.3.2 + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - unloader + - webpack + + inherits@2.0.4: {} + + ini@4.1.1: {} + + ioredis@5.11.1: + dependencies: + '@ioredis/commands': 1.10.0 + cluster-key-slot: 1.1.1 + debug: 4.4.3 + denque: 2.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + iron-webcrypto@1.2.1: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.9 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@4.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-worker@27.5.1: + dependencies: + '@types/node': 26.1.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@2.7.0: {} + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + kleur@4.1.5: {} + + klona@2.0.6: {} + + knitwork@1.3.0: {} + + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.10.0 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + lilconfig@3.1.3: {} + + listhen@1.10.1: + dependencies: + '@parcel/watcher-wasm': 2.6.0 + citty: 0.2.2 + consola: 3.4.2 + crossws: 0.4.10(srvx@0.11.22) + defu: 6.1.7 + get-port-please: 3.2.0 + h3: 1.15.11 + http-shutdown: 1.2.2 + jiti: 2.7.0 + node-forge: 1.4.0 + pathe: 2.0.3 + std-env: 4.2.0 + tinyclip: 0.1.15 + ufo: 1.6.4 + untun: 0.2.2 + uqr: 0.1.3 + + loader-utils@3.3.1: {} + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 + + lodash@4.18.1: {} + + lru-cache@10.4.3: {} + + lru-cache@11.5.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-regexp@0.10.0: + dependencies: + estree-walker: 3.0.3 + magic-string: 0.30.21 + mlly: 1.8.2 + regexp-tree: 0.1.27 + type-level-regexp: 0.1.17 + ufo: 1.6.4 + unplugin: 2.3.11 + + magic-string-ast@1.0.3: + dependencies: + magic-string: 0.30.21 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@1.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.4: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@4.1.0: {} + + mimic-fn@4.0.0: {} + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.4 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + + minimizer-webpack-plugin@5.6.1(esbuild@0.28.1)(webpack@5.109.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + esbuild: 0.28.1 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.49.2 + webpack: 5.109.2 + + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + mocked-exports@0.1.1: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.17: {} + + nanotar@0.3.0: {} + + neo-async@2.6.2: {} + + nitropack@2.13.4: + dependencies: + '@cloudflare/kv-asset-handler': 0.4.2 + '@rollup/plugin-alias': 6.0.0(rollup@4.62.4) + '@rollup/plugin-commonjs': 29.0.3(rollup@4.62.4) + '@rollup/plugin-inject': 5.0.5(rollup@4.62.4) + '@rollup/plugin-json': 6.1.0(rollup@4.62.4) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.62.4) + '@rollup/plugin-replace': 6.0.3(rollup@4.62.4) + '@rollup/plugin-terser': 1.0.0(rollup@4.62.4) + '@vercel/nft': 1.10.2(rollup@4.62.4) + archiver: 7.0.1 + c12: 3.3.4(magicast@0.5.4) + chokidar: 5.0.0 + citty: 0.2.2 + compatx: 0.2.0 + confbox: 0.2.4 + consola: 3.4.2 + cookie-es: 2.0.1 + croner: 10.0.1 + crossws: 0.3.5 + db0: 0.3.4 + defu: 6.1.7 + destr: 2.0.5 + dot-prop: 10.2.0 + esbuild: 0.28.1 + escape-string-regexp: 5.0.0 + etag: 1.8.1 + exsolve: 1.1.1 + globby: 16.2.2 + gzip-size: 7.0.0 + h3: 1.15.11 + hookable: 5.5.3 + httpxy: 0.5.5 + ioredis: 5.11.1 + jiti: 2.7.0 + klona: 2.0.6 + knitwork: 1.3.0 + listhen: 1.10.1 + magic-string: 0.30.21 + magicast: 0.5.4 + mime: 4.1.0 + mlly: 1.8.2 + node-fetch-native: 1.6.7 + node-mock-http: 1.0.5 + ofetch: 1.5.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + pretty-bytes: 7.1.1 + radix3: 1.1.2 + rollup: 4.62.4 + rollup-plugin-visualizer: 7.0.1(rolldown@1.2.3)(rollup@4.62.4) + scule: 1.3.0 + semver: 7.8.5 + serve-placeholder: 2.0.2 + serve-static: 2.2.1 + source-map: 0.7.6 + std-env: 4.2.0 + ufo: 1.6.4 + ultrahtml: 1.7.0 + uncrypto: 0.1.3 + unctx: 2.5.0 + unenv: 2.0.0-rc.24 + unimport: 6.4.0(rolldown@1.2.3) + unplugin-utils: 0.3.2 + unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.1) + untyped: 2.0.0 + unwasm: 0.5.3 + youch: 4.1.1 + youch-core: 0.3.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@farmfe/core' + - '@libsql/client' + - '@netlify/blobs' + - '@parcel/watcher' + - '@planetscale/database' + - '@rspack/core' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - bun-types-no-globals + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - oxc-parser + - react-native-b4a + - sqlite3 + - supports-color + - unloader + - uploadthing + - webpack + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.4.0: {} + + node-gyp-build@4.8.4: {} + + node-mock-http@1.0.5: {} + + node-releases@2.0.53: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-path@3.0.0: {} + + nostics@1.2.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nuxt@4.5.2(@types/node@26.1.2)(rolldown@1.2.3): + dependencies: + '@dxup/nuxt': 0.5.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + '@nuxt/cli': 3.37.0(@nuxt/schema@4.5.2) + '@nuxt/devtools': 3.4.1(vite@8.2.1(@types/node@26.1.2)) + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + '@nuxt/nitro-server': 4.5.2(nuxt@4.5.2(@types/node@26.1.2)(rolldown@1.2.3)) + '@nuxt/schema': 4.5.2 + '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.2) + '@nuxt/vite-builder': 4.5.2(nuxt@4.5.2(@types/node@26.1.2)(rolldown@1.2.3))(rolldown@1.2.3)(vue@3.5.41(typescript@5.9.3)) + '@types/node': 26.1.2 + '@unhead/vue': 3.3.1(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3)) + '@vue/shared': 3.5.41 + chokidar: 5.0.0 + compatx: 0.2.0 + consola: 3.4.2 + cookie-es: 3.1.1 + defu: 6.1.7 + devalue: 5.9.0 + errx: 0.1.2 + escape-string-regexp: 5.0.0 + exsolve: 1.1.1 + fnv1a-64: 0.1.2 + hookable: 6.1.1 + ignore: 7.0.6 + impound: 1.1.6(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + jiti: 2.7.0 + klona: 2.0.6 + knitwork: 1.3.0 + magic-string: 1.1.0 + mlly: 1.8.2 + nanotar: 0.3.0 + nostics: 1.2.0 + nypm: 0.6.9 + object-identity: 0.2.3 + ofetch: 1.5.1 + ohash: 2.0.11 + on-change: 6.0.2 + oxc-walker: 1.1.1(rolldown@1.2.3) + pathe: 2.0.3 + perfect-debounce: 2.1.0 + picomatch: 4.0.5 + pkg-types: 2.3.1 + rolldown: 1.2.3 + rolldown-string: 0.3.1(rolldown@1.2.3) + rou3: 0.9.1 + scule: 1.3.0 + std-env: 4.2.0 + tinyglobby: 0.2.17 + ufo: 1.6.4 + ultrahtml: 1.7.0 + uncrypto: 0.1.3 + unctx: 3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + undici: 8.10.0 + unhead: 3.3.1(vite@8.2.1(@types/node@26.1.2)) + unimport: 6.4.0(rolldown@1.2.3) + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + unrouting: 0.2.2 + untyped: 2.0.0 + verkit: 0.3.2 + vue: 3.5.41(typescript@5.9.3) + vue-component-type-helpers: 3.3.9 + vue-router: 5.2.0(@vue/compiler-sfc@3.5.41)(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/plugin-proposal-decorators' + - '@babel/plugin-syntax-jsx' + - '@babel/plugin-syntax-typescript' + - '@biomejs/biome' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@farmfe/core' + - '@libsql/client' + - '@netlify/blobs' + - '@oxc-project/types' + - '@parcel/watcher' + - '@pinia/colada' + - '@planetscale/database' + - '@rollup/plugin-babel' + - '@rspack/core' + - '@unhead/cli' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools' + - '@vitejs/devtools-kit' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - bufferutil + - bun-types-no-globals + - cac + - commander + - db0 + - drizzle-orm + - encoding + - esbuild + - eslint + - idb-keyval + - ioredis + - less + - lightningcss + - magicast + - meow + - mysql2 + - optionator + - oxc-parser + - oxlint + - pinia + - react-native-b4a + - rollup-plugin-visualizer + - sass + - sass-embedded + - sqlite3 + - stylelint + - stylus + - sugarss + - supports-color + - terser + - tsx + - unloader + - uploadthing + - utf-8-validate + - webpack + - xml2js + - yaml + + nypm@0.6.9: + dependencies: + citty: 0.2.2 + pathe: 2.0.3 + tinyexec: 1.3.0 + + object-identity@0.2.3: {} + + obug@2.1.4: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + ofetch@2.0.0-alpha.3: {} + + ohash@2.0.11: {} + + on-change@6.0.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + + oxc-parser@0.131.0: + dependencies: + '@oxc-project/types': 0.131.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.131.0 + '@oxc-parser/binding-android-arm64': 0.131.0 + '@oxc-parser/binding-darwin-arm64': 0.131.0 + '@oxc-parser/binding-darwin-x64': 0.131.0 + '@oxc-parser/binding-freebsd-x64': 0.131.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.131.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.131.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.131.0 + '@oxc-parser/binding-linux-arm64-musl': 0.131.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.131.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.131.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.131.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.131.0 + '@oxc-parser/binding-linux-x64-gnu': 0.131.0 + '@oxc-parser/binding-linux-x64-musl': 0.131.0 + '@oxc-parser/binding-openharmony-arm64': 0.131.0 + '@oxc-parser/binding-wasm32-wasi': 0.131.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.131.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.131.0 + '@oxc-parser/binding-win32-x64-msvc': 0.131.0 + + oxc-walker@0.7.0(oxc-parser@0.131.0): + dependencies: + magic-regexp: 0.10.0 + oxc-parser: 0.131.0 + + oxc-walker@1.1.1(rolldown@1.2.3): + dependencies: + rolldown: 1.2.3 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.8.0: {} + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.2 + minipass: 7.1.3 + + pathe@2.0.3: {} + + perfect-debounce@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.5: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.1.1 + pathe: 2.0.3 + + postcss-calc@10.1.1(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-selector-parser: 7.1.4 + postcss-value-parser: 4.2.0 + + postcss-colormin@8.0.2(postcss@8.5.26): + dependencies: + '@colordx/core': 5.5.0 + browserslist: 4.28.7 + caniuse-api: 4.0.0 + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-convert-values@8.0.2(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-selector-parser: 7.1.4 + + postcss-discard-duplicates@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + postcss-discard-empty@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + postcss-discard-overridden@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + postcss-merge-longhand@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + stylehacks: 8.0.2(postcss@8.5.26) + + postcss-merge-rules@8.0.2(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + caniuse-api: 4.0.0 + cssnano-utils: 6.0.2(postcss@8.5.26) + postcss: 8.5.26 + postcss-selector-parser: 7.1.4 + + postcss-minify-font-values@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@8.0.2(postcss@8.5.26): + dependencies: + '@colordx/core': 5.5.0 + cssnano-utils: 6.0.2(postcss@8.5.26) + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-minify-params@8.0.2(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + cssnano-utils: 6.0.2(postcss@8.5.26) + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@8.0.3(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + caniuse-api: 4.0.0 + cssesc: 3.0.0 + postcss: 8.5.26 + postcss-selector-parser: 7.1.4 + + postcss-normalize-charset@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + postcss-normalize-display-values@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@8.0.2(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@8.0.2(postcss@8.5.26): + dependencies: + cssnano-utils: 6.0.2(postcss@8.5.26) + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@8.0.2(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + caniuse-api: 4.0.0 + postcss: 8.5.26 + + postcss-reduce-transforms@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@7.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@8.0.3(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-value-parser: 4.2.0 + svgo: 4.0.2 + + postcss-unique-selectors@8.0.2(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-selector-parser: 7.1.4 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.26: + dependencies: + nanoid: 3.3.17 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + powershell-utils@0.1.0: {} + + prettier@3.8.1: {} + + pretty-bytes@7.1.1: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + quansync@0.2.11: {} + + quansync@1.0.0: {} + + queue-microtask@1.2.3: {} + + radix3@1.1.2: {} + + range-parser@1.3.0: {} + + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + + readdirp@5.1.1: {} + + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + + regexp-tree@0.1.27: {} + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.12.0: {} + + reusify@1.1.0: {} + + rolldown-string@0.3.1(rolldown@1.2.3): + dependencies: + magic-string: 1.1.0 + rolldown: 1.2.3 + + rolldown@1.2.3: + dependencies: + '@oxc-project/types': 0.143.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.3 + '@rolldown/binding-darwin-arm64': 1.2.3 + '@rolldown/binding-darwin-x64': 1.2.3 + '@rolldown/binding-freebsd-x64': 1.2.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.3 + '@rolldown/binding-linux-arm64-gnu': 1.2.3 + '@rolldown/binding-linux-arm64-musl': 1.2.3 + '@rolldown/binding-linux-ppc64-gnu': 1.2.3 + '@rolldown/binding-linux-s390x-gnu': 1.2.3 + '@rolldown/binding-linux-x64-gnu': 1.2.3 + '@rolldown/binding-linux-x64-musl': 1.2.3 + '@rolldown/binding-openharmony-arm64': 1.2.3 + '@rolldown/binding-win32-arm64-msvc': 1.2.3 + '@rolldown/binding-win32-x64-msvc': 1.2.3 + + rollup-plugin-visualizer@7.0.1(rolldown@1.2.3)(rollup@4.62.4): + dependencies: + open: 11.0.0 + picomatch: 4.0.5 + rolldown: 1.2.3 + rollup: 4.62.4 + source-map: 0.7.6 + yargs: 18.1.0 + + rollup@4.62.4: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.62.4 + '@rollup/rollup-android-arm64': 4.62.4 + '@rollup/rollup-darwin-arm64': 4.62.4 + '@rollup/rollup-darwin-x64': 4.62.4 + '@rollup/rollup-freebsd-arm64': 4.62.4 + '@rollup/rollup-freebsd-x64': 4.62.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.4 + '@rollup/rollup-linux-arm-musleabihf': 4.62.4 + '@rollup/rollup-linux-arm64-gnu': 4.62.4 + '@rollup/rollup-linux-arm64-musl': 4.62.4 + '@rollup/rollup-linux-loong64-gnu': 4.62.4 + '@rollup/rollup-linux-loong64-musl': 4.62.4 + '@rollup/rollup-linux-ppc64-gnu': 4.62.4 + '@rollup/rollup-linux-ppc64-musl': 4.62.4 + '@rollup/rollup-linux-riscv64-gnu': 4.62.4 + '@rollup/rollup-linux-riscv64-musl': 4.62.4 + '@rollup/rollup-linux-s390x-gnu': 4.62.4 + '@rollup/rollup-linux-x64-gnu': 4.62.4 + '@rollup/rollup-linux-x64-musl': 4.62.4 + '@rollup/rollup-openbsd-x64': 4.62.4 + '@rollup/rollup-openharmony-arm64': 4.62.4 + '@rollup/rollup-win32-arm64-msvc': 4.62.4 + '@rollup/rollup-win32-ia32-msvc': 4.62.4 + '@rollup/rollup-win32-x64-gnu': 4.62.4 + '@rollup/rollup-win32-x64-msvc': 4.62.4 + fsevents: 2.3.3 + + rou3@0.9.1: {} + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + sax@1.6.1: {} + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-javascript@7.0.7: {} + + seroval@1.6.2: {} + + serve-placeholder@2.0.2: + dependencies: + defu: 6.1.7 + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.10.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-git@3.36.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.3 + '@simple-git/argv-parser': 1.1.1 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + slash@5.1.0: {} + + smob@1.6.2: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + srvx@0.11.22: {} + + standard-as-callback@2.1.0: {} + + statuses@2.0.2: {} + + std-env@4.2.0: {} + + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string-width-cjs@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi-cjs@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@3.0.0: {} + + strip-literal@4.0.0: + dependencies: + js-tokens: 10.0.0 + + structured-clone-es@2.0.1: {} + + stylehacks@8.0.2(postcss@8.5.26): + dependencies: + browserslist: 4.28.7 + postcss: 8.5.26 + postcss-selector-parser: 7.1.4 + + supports-color@10.2.2: {} + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svgo@4.0.2: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.1 + + tagged-tag@1.0.0: {} + + tapable@2.3.3: {} + + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.8.0 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar@7.5.22: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + terser@5.49.2: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.18.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + + tiny-invariant@1.3.3: {} + + tinyclip@0.1.15: {} + + tinyexec@1.3.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + totalist@3.0.1: {} + + tr46@0.0.3: {} + + tslib@2.8.1: + optional: true + + type-fest@5.8.0: + dependencies: + tagged-tag: 1.0.0 + + type-level-regexp@0.1.17: {} + + typescript@5.9.3: {} + + ufo@1.6.4: {} + + ultrahtml@1.7.0: {} + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + unconfig@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + defu: 6.1.7 + jiti: 2.7.0 + quansync: 1.0.0 + unconfig-core: 7.5.0 + + uncrypto@0.1.3: {} + + unctx@2.5.0: + dependencies: + acorn: 8.18.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + unplugin: 2.3.11 + + unctx@3.0.0(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))): + dependencies: + magic-string: 1.1.0 + rolldown: 1.2.3 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + + undici-types@8.3.0: {} + + undici@8.10.0: {} + + unenv@2.0.0-rc.24: + dependencies: + pathe: 2.0.3 + + unhead@3.3.1(vite@8.2.1(@types/node@26.1.2)): + dependencies: + hookable: 6.1.1 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - unloader + - webpack + + unicorn-magic@0.3.0: {} + + unicorn-magic@0.4.0: {} + + unimport@6.4.0(rolldown@1.2.3): + dependencies: + acorn: 8.18.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.2.1 + magic-string: 1.1.0 + mlly: 1.8.2 + pathe: 2.0.3 + picomatch: 4.0.5 + pkg-types: 2.3.1 + rolldown: 1.2.3 + scule: 1.3.0 + strip-literal: 4.0.0 + tinyglobby: 0.2.17 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + unplugin-utils: 0.3.2 + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - unloader + - webpack + + unocss@66.7.5(@unocss/webpack@66.7.5(webpack@5.109.2)): + dependencies: + '@unocss/cli': 66.7.5 + '@unocss/core': 66.7.5 + '@unocss/preset-attributify': 66.7.5 + '@unocss/preset-icons': 66.7.5 + '@unocss/preset-mini': 66.7.5 + '@unocss/preset-tagify': 66.7.5 + '@unocss/preset-typography': 66.7.5 + '@unocss/preset-uno': 66.7.5 + '@unocss/preset-web-fonts': 66.7.5 + '@unocss/preset-wind': 66.7.5 + '@unocss/preset-wind3': 66.7.5 + '@unocss/preset-wind4': 66.7.5 + '@unocss/transformer-attributify-jsx': 66.7.5 + '@unocss/transformer-compile-class': 66.7.5 + '@unocss/transformer-directives': 66.7.5 + '@unocss/transformer-variant-group': 66.7.5 + '@unocss/vite': 66.7.5(vite@8.2.1(@types/node@26.1.2)) + '@unocss/webpack': 66.7.5(webpack@5.109.2) + + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.5 + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.18.0 + picomatch: 4.0.5 + webpack-virtual-modules: 0.6.2 + + unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)): + dependencies: + '@jridgewell/remapping': 2.3.5 + esbuild: 0.28.1 + picomatch: 4.0.5 + rolldown: 1.2.3 + rollup: 4.62.4 + vite: 8.2.1(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0) + webpack-virtual-modules: 0.6.2 + + unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))(webpack@5.109.2): + dependencies: + '@jridgewell/remapping': 2.3.5 + esbuild: 0.28.1 + picomatch: 4.0.5 + rolldown: 1.2.3 + rollup: 4.62.4 + vite: 8.2.1(@types/node@26.1.2)(esbuild@0.28.1) + webpack: 5.109.2 + webpack-virtual-modules: 0.6.2 + + unrouting@0.2.2: + dependencies: + escape-string-regexp: 5.0.0 + ufo: 1.6.4 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.2 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + unstorage@1.17.5(db0@0.3.4)(ioredis@5.11.1): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + db0: 0.3.4 + destr: 2.0.5 + h3: 1.15.11 + ioredis: 5.11.1 + lru-cache: 11.5.2 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + untun@0.2.2: {} + + untyped@2.0.0: + dependencies: + citty: 0.1.6 + defu: 6.1.7 + jiti: 2.7.0 + knitwork: 1.3.0 + scule: 1.3.0 + + unwasm@0.5.3: + dependencies: + exsolve: 1.1.1 + knitwork: 1.3.0 + magic-string: 0.30.21 + mlly: 1.8.2 + pathe: 2.0.3 + pkg-types: 2.3.1 + + update-browserslist-db@1.2.3(browserslist@4.28.7): + dependencies: + browserslist: 4.28.7 + escalade: 3.2.0 + picocolors: 1.1.1 + + uqr@0.1.3: {} + + util-deprecate@1.0.2: {} + + verkit@0.3.2: {} + + vite-dev-rpc@2.0.0(vite@8.2.1(@types/node@26.1.2)): + dependencies: + birpc: 4.0.0 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vite-hot-client: 2.2.0(vite@8.2.1(@types/node@26.1.2)) + + vite-hot-client@2.2.0(vite@8.2.1(@types/node@26.1.2)): + dependencies: + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + + vite-node@6.0.0(@types/node@26.1.2)(jiti@2.7.0): + dependencies: + cac: 7.0.0 + es-module-lexer: 2.3.1 + obug: 2.1.4 + pathe: 2.0.3 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + transitivePeerDependencies: + - '@vitejs/devtools' + - esbuild + - less + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vite-plugin-checker@0.14.5(typescript@5.9.3)(vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0))(vue-tsc@3.3.9(typescript@5.9.3)): + dependencies: + '@babel/code-frame': 7.29.7 + chokidar: 5.0.0 + npm-run-path: 6.0.0 + picocolors: 1.1.1 + picomatch: 4.0.5 + proper-lockfile: 4.1.2 + tiny-invariant: 1.3.3 + typescript: 5.9.3 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vue-tsc: 3.3.9(typescript@5.9.3) + + vite-plugin-inspect@11.4.1(@nuxt/kit@4.5.2)(vite@8.2.1(@types/node@26.1.2)): + dependencies: + '@nuxt/kit': 4.5.2(magic-string@1.1.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2))) + ansis: 4.3.1 + error-stack-parser-es: 1.0.5 + obug: 2.1.4 + ohash: 2.0.11 + open: 11.0.0 + perfect-debounce: 2.1.0 + sirv: 3.0.2 + unplugin-utils: 0.3.2 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vite-dev-rpc: 2.0.0(vite@8.2.1(@types/node@26.1.2)) + + vite-plugin-vue-tracer@1.4.0(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3)): + dependencies: + estree-walker: 3.0.3 + exsolve: 1.1.1 + magic-string: 0.30.21 + pathe: 2.0.3 + source-map-js: 1.2.1 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0) + vue: 3.5.41(typescript@5.9.3) + + vite@8.2.1(@types/node@26.1.2): + dependencies: + '@types/node': 26.1.2 + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.26 + rolldown: 1.2.3 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + + vite@8.2.1(@types/node@26.1.2)(esbuild@0.28.1): + dependencies: + '@types/node': 26.1.2 + esbuild: 0.28.1 + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.26 + rolldown: 1.2.3 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + + vite@8.2.1(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0): + dependencies: + '@types/node': 26.1.2 + esbuild: 0.28.1 + jiti: 2.7.0 + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.26 + rolldown: 1.2.3 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + + vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0): + dependencies: + '@types/node': 26.1.2 + jiti: 2.7.0 + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.26 + rolldown: 1.2.3 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + + vite@8.2.1(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0): + dependencies: + '@types/node': 26.1.2 + jiti: 2.7.0 + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.26 + rolldown: 1.2.3 + tinyglobby: 0.2.17 + yaml: 2.9.0 + optionalDependencies: + fsevents: 2.3.3 + + vscode-uri@3.1.0: {} + + vue-bundle-renderer@2.3.1: + dependencies: + ufo: 1.6.4 + + vue-component-type-helpers@3.3.9: {} + + vue-devtools-stub@0.1.0: {} + + vue-router@5.2.0(@vue/compiler-sfc@3.5.41)(vite@8.2.1(@types/node@26.1.2))(vue@3.5.41(typescript@5.9.3)): + dependencies: + '@babel/generator': 8.0.0 + '@vue-macros/common': 3.1.4(vue@3.5.41(typescript@5.9.3)) + '@vue/compiler-sfc': 3.5.41 + '@vue/devtools-api': 8.2.1 + ast-walker-scope: 0.9.0 + chokidar: 5.0.0 + json5: 2.2.3 + local-pkg: 1.2.1 + magic-string: 0.30.21 + mlly: 1.8.2 + muggle-string: 0.4.1 + nostics: 1.2.0 + pathe: 2.0.3 + picomatch: 4.0.5 + scule: 1.3.0 + tinyglobby: 0.2.17 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.4)(vite@8.2.1(@types/node@26.1.2)) + unplugin-utils: 0.3.2 + vite: 8.2.1(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0) + vue: 3.5.41(typescript@5.9.3) + yaml: 2.9.0 + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - unloader + - webpack + + vue-tsc@3.3.9(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.28 + '@vue/language-core': 3.3.9 + typescript: 5.9.3 + + vue@3.5.41(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.41 + '@vue/compiler-sfc': 3.5.41 + '@vue/runtime-dom': 3.5.41 + '@vue/server-renderer': 3.5.41 + '@vue/shared': 3.5.41 + typescript: 5.9.3 + + watchpack@2.5.2: + dependencies: + graceful-fs: 4.2.11 + + webidl-conversions@3.0.1: {} + + webpack-sources@3.5.1: {} + + webpack-virtual-modules@0.6.2: {} + + webpack@5.109.2: + dependencies: + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.18.0 + browserslist: 4.28.7 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.24.5 + es-module-lexer: 2.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + graceful-fs: 4.2.11 + mime-db: 1.54.0 + minimizer-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.109.2) + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + watchpack: 2.5.2 + webpack-sources: 3.5.1 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@6.0.1: + dependencies: + isexe: 4.0.0 + + wrap-ansi-cjs@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + ws@8.21.2: {} + + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yaml@2.9.0: {} + + yargs-parser@22.0.0: {} + + yargs@18.1.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.3 + error-stack-parser-es: 1.0.5 + + youch@4.1.1: + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.7.0 + '@speed-highlight/core': 1.2.23 + cookie-es: 3.1.1 + youch-core: 0.3.3 + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 diff --git a/nuxt.config.ts b/nuxt.config.ts new file mode 100644 index 0000000..1b1d3c1 --- /dev/null +++ b/nuxt.config.ts @@ -0,0 +1,27 @@ +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + compatibilityDate: "2025-07-15", + devtools: { enabled: false }, + runtimeConfig: { + authPasscode: process.env.AUTH_PASSCODE || "", + authSecret: process.env.AUTH_SECRET || "", + authTokenTtlDays: process.env.AUTH_TOKEN_TTL_DAYS || "7", + storageDir: process.env.QUICKDROP_STORAGE_DIR || ".data/quickdrop", + }, + modules: ["@unocss/nuxt"], + app: { + head: { + htmlAttrs: { lang: "en" }, + link: [{ rel: "icon", href: "/favicon.ico" }], + }, + }, + routeRules: { + "/**": { + headers: { + "Referrer-Policy": "no-referrer", + "X-Content-Type-Options": "nosniff", + "Permissions-Policy": "camera=(), microphone=(), geolocation=()", + }, + }, + }, +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..58b66d6 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "quickdrop", + "type": "module", + "private": true, + "scripts": { + "build": "nuxt build", + "typecheck": "nuxt typecheck", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "test": "node --test tests/*.test.mjs", + "format": "prettier --write \"app/**/*.{vue,ts}\" \"server/**/*.ts\" \"shared/**/*.ts\" \"tests/**/*.mjs\" \"*.{ts,json,md}\"", + "format:check": "prettier --check \"app/**/*.{vue,ts}\" \"server/**/*.ts\" \"shared/**/*.ts\" \"tests/**/*.mjs\" \"*.{ts,json,md}\"", + "postinstall": "nuxt prepare" + }, + "dependencies": { + "@unocss/nuxt": "66.7.5", + "nuxt": "^4.5.2", + "uqr": "0.1.3", + "vue": "^3.5.40", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "prettier": "3.8.1", + "typescript": "^5.9.3", + "vue-tsc": "^3.2.0" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..18993ad91cfd43e03b074dd0b5cc3f37ab38e49c GIT binary patch literal 4286 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

>XasG?0MAGYA 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 literal 0 HcmV?d00001 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..c48cf63 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: /room/ +Disallow: /api/ diff --git a/server/api/auth/login.post.ts b/server/api/auth/login.post.ts new file mode 100644 index 0000000..6739ac6 --- /dev/null +++ b/server/api/auth/login.post.ts @@ -0,0 +1,35 @@ +import { createError, defineEventHandler, setResponseStatus } from "h3"; +import { + authConfigured, + issueSession, + requireSameOrigin, + verifyPasscode, +} from "../../utils/auth"; +import { readJson } from "../../utils/http"; +export default defineEventHandler(async (event) => { + requireSameOrigin(event); + const body = await readJson<{ passcode?: unknown }>(event, 1024); + if ( + !body || + typeof body !== "object" || + Object.keys(body).some((key) => key !== "passcode") + ) + throw createError({ + statusCode: 400, + statusMessage: "Malformed login request.", + }); + if (!authConfigured()) + throw createError({ + statusCode: 503, + statusMessage: "Authentication is not configured.", + }); + if (!verifyPasscode(body?.passcode)) { + await new Promise((resolve) => setTimeout(resolve, 350)); + throw createError({ + statusCode: 401, + statusMessage: "Incorrect passcode.", + }); + } + issueSession(event); + setResponseStatus(event, 204); +}); diff --git a/server/api/auth/logout.post.ts b/server/api/auth/logout.post.ts new file mode 100644 index 0000000..3ca92b5 --- /dev/null +++ b/server/api/auth/logout.post.ts @@ -0,0 +1,7 @@ +import { defineEventHandler, setResponseStatus } from "h3"; +import { clearAuthCookie, requireSameOrigin } from "../../utils/auth"; +export default defineEventHandler((event) => { + requireSameOrigin(event); + clearAuthCookie(event); + setResponseStatus(event, 204); +}); diff --git a/server/api/auth/session.get.ts b/server/api/auth/session.get.ts new file mode 100644 index 0000000..5bbcd82 --- /dev/null +++ b/server/api/auth/session.get.ts @@ -0,0 +1,5 @@ +import { defineEventHandler } from "h3"; +import { isAuthenticated } from "../../utils/auth"; +export default defineEventHandler((event) => ({ + authenticated: isAuthenticated(event), +})); diff --git a/server/api/drops/[id].get.ts b/server/api/drops/[id].get.ts new file mode 100644 index 0000000..8d16102 --- /dev/null +++ b/server/api/drops/[id].get.ts @@ -0,0 +1,25 @@ +import { + createError, + defineEventHandler, + getRequestHeader, + getRouterParam, +} from "h3"; +import { dropStore, DropStoreError } from "../../utils/drop-store"; +import { publicHeaders } from "../../utils/http"; +export default defineEventHandler(async (event) => { + publicHeaders(event); + const id = String(getRouterParam(event, "id") || "").toUpperCase(); + const access = getRequestHeader(event, "x-quickdrop-access") || ""; + try { + return await dropStore.descriptor(id, access); + } catch (error) { + if (error instanceof DropStoreError && error.code === "expired") + throw createError({ statusCode: 410, statusMessage: "Drop expired." }); + if (error instanceof DropStoreError && error.code === "forbidden") + throw createError({ + statusCode: 403, + statusMessage: "Invalid access capability.", + }); + throw createError({ statusCode: 404, statusMessage: "Drop not found." }); + } +}); diff --git a/server/api/drops/[id]/chunks/[index].get.ts b/server/api/drops/[id]/chunks/[index].get.ts new file mode 100644 index 0000000..69b9045 --- /dev/null +++ b/server/api/drops/[id]/chunks/[index].get.ts @@ -0,0 +1,72 @@ +import { + createError, + defineEventHandler, + getRouterParam, + sendStream, + setHeaders, +} from "h3"; +import { dropStore, DropStoreError } from "../../../../utils/drop-store"; +import { bearerToken, publicHeaders } from "../../../../utils/http"; + +export default defineEventHandler(async (event) => { + publicHeaders(event); + const token = bearerToken(event); + if (!token) + throw createError({ + statusCode: 403, + statusMessage: "A valid lease is required.", + }); + const id = String(getRouterParam(event, "id") || "").toUpperCase(); + let handle: + | Awaited>["handle"] + | undefined; + let stream: + | ReturnType["createReadStream"]> + | undefined; + let closed = false; + const close = async () => { + if (closed) return; + closed = true; + stream?.destroy(); + await handle?.close().catch(() => undefined); + }; + const abort = () => { + if (!event.node.res.writableEnded && stream && !stream.destroyed) + stream.destroy(new Error("Client disconnected.")); + void close(); + }; + try { + const chunk = await dropStore.readChunk( + id, + Number(getRouterParam(event, "index")), + token, + ); + handle = chunk.handle; + stream = handle.createReadStream(); + event.node.res.once("close", abort); + event.node.res.once("finish", close); + setHeaders(event, { + "content-type": "application/octet-stream", + "content-length": chunk.size, + "cache-control": "private, no-store", + }); + return await sendStream(event, stream); + } catch (error) { + await close(); + if (error instanceof DropStoreError) + throw createError({ + statusCode: + error.code === "expired" + ? 410 + : error.code === "not-found" + ? 404 + : 403, + statusMessage: error.message, + }); + throw error; + } finally { + event.node.res.off("close", abort); + event.node.res.off("finish", close); + await close(); + } +}); diff --git a/server/api/drops/[id]/chunks/[index].put.ts b/server/api/drops/[id]/chunks/[index].put.ts new file mode 100644 index 0000000..910036f --- /dev/null +++ b/server/api/drops/[id]/chunks/[index].put.ts @@ -0,0 +1,30 @@ +import { + createError, + defineEventHandler, + getRouterParam, + setResponseStatus, +} from "h3"; +import { requireAuth } from "../../../../utils/auth"; +import { dropStore, DropStoreError } from "../../../../utils/drop-store"; +import { readBounded, requireContentType } from "../../../../utils/http"; +export default defineEventHandler(async (event) => { + requireAuth(event); + requireContentType(event, "application/octet-stream"); + const id = String(getRouterParam(event, "id") || "").toUpperCase(); + const index = Number(getRouterParam(event, "index")); + try { + const result = await dropStore.putChunk( + id, + index, + await readBounded(event, 8388624), + ); + setResponseStatus(event, result === "created" ? 201 : 204); + } catch (error) { + if (error instanceof DropStoreError) { + const status = + error.code === "not-found" ? 404 : error.code === "expired" ? 410 : 409; + throw createError({ statusCode: status, statusMessage: error.message }); + } + throw error; + } +}); diff --git a/server/api/drops/[id]/complete.post.ts b/server/api/drops/[id]/complete.post.ts new file mode 100644 index 0000000..1e9958e --- /dev/null +++ b/server/api/drops/[id]/complete.post.ts @@ -0,0 +1,32 @@ +import { + createError, + defineEventHandler, + getRouterParam, + setResponseStatus, +} from "h3"; +import { dropStore, DropStoreError } from "../../../utils/drop-store"; +import { bearerToken, publicHeaders, readBounded } from "../../../utils/http"; +export default defineEventHandler(async (event) => { + publicHeaders(event); + if ((await readBounded(event, 0)).byteLength) + throw createError({ + statusCode: 400, + statusMessage: "Completion body must be empty.", + }); + const token = bearerToken(event); + if (!token) + throw createError({ + statusCode: 403, + statusMessage: "A valid lease is required.", + }); + try { + await dropStore.complete( + String(getRouterParam(event, "id") || "").toUpperCase(), + token, + ); + } catch (error) { + if (!(error instanceof DropStoreError)) + throw error; /* Completion is deliberately idempotent: an already completed, expired, or unknown lease has the desired state. */ + } + setResponseStatus(event, 204); +}); diff --git a/server/api/drops/[id]/finalize.post.ts b/server/api/drops/[id]/finalize.post.ts new file mode 100644 index 0000000..b6800c8 --- /dev/null +++ b/server/api/drops/[id]/finalize.post.ts @@ -0,0 +1,37 @@ +import { createError, defineEventHandler, getRouterParam } from "h3"; +import { requireAuth } from "../../../utils/auth"; +import { dropStore, DropStoreError } from "../../../utils/drop-store"; +import { readBounded, requireContentType } from "../../../utils/http"; +import { validateManifestBodyLength } from "../../../../shared/utils/drop-contract"; +export default defineEventHandler(async (event) => { + requireAuth(event); + requireContentType(event, "application/octet-stream"); + const body = await readBounded(event, 65552); + try { + validateManifestBodyLength(body.byteLength); + } catch { + throw createError({ statusCode: 400, statusMessage: "Invalid manifest." }); + } + const id = String(getRouterParam(event, "id") || "").toUpperCase(); + try { + const result = await dropStore.finalize(id, body); + return { + id, + expiresAt: new Date(result.expiresAt!).toISOString(), + maxReads: result.maxReads, + }; + } catch (error) { + if (error instanceof DropStoreError) { + const status = + error.code === "not-found" + ? 404 + : error.code === "expired" + ? 410 + : error.code === "incomplete" + ? 409 + : 409; + throw createError({ statusCode: status, statusMessage: error.message }); + } + throw error; + } +}); diff --git a/server/api/drops/[id]/leases.post.ts b/server/api/drops/[id]/leases.post.ts new file mode 100644 index 0000000..0b71495 --- /dev/null +++ b/server/api/drops/[id]/leases.post.ts @@ -0,0 +1,39 @@ +import { + createError, + defineEventHandler, + getRequestHeader, + getRouterParam, + setResponseStatus, +} from "h3"; +import { dropStore, DropStoreError } from "../../../utils/drop-store"; +import { bearerToken, publicHeaders, readBounded } from "../../../utils/http"; +export default defineEventHandler(async (event) => { + publicHeaders(event); + if ((await readBounded(event, 0)).byteLength) + throw createError({ + statusCode: 400, + statusMessage: "Lease claim body must be empty.", + }); + const id = String(getRouterParam(event, "id") || "").toUpperCase(); + const access = getRequestHeader(event, "x-quickdrop-access") || ""; + try { + const result = await dropStore.claim(id, access, bearerToken(event)); + setResponseStatus(event, result.reused ? 200 : 201); + return { + token: result.token, + leaseExpiresAt: new Date(result.leaseExpiresAt).toISOString(), + expiresAt: new Date(result.expiresAt).toISOString(), + }; + } catch (error) { + if (error instanceof DropStoreError) { + const status = + error.code === "exhausted" || error.code === "expired" + ? 410 + : error.code === "forbidden" + ? 403 + : 404; + throw createError({ statusCode: status, statusMessage: error.message }); + } + throw error; + } +}); diff --git a/server/api/drops/index.post.ts b/server/api/drops/index.post.ts new file mode 100644 index 0000000..a59bbd1 --- /dev/null +++ b/server/api/drops/index.post.ts @@ -0,0 +1,26 @@ +import { createError, defineEventHandler, setResponseStatus } from "h3"; +import { requireAuth } from "../../utils/auth"; +import { dropStore } from "../../utils/drop-store"; +import { readJson } from "../../utils/http"; +import { validateReservation } from "../../../shared/utils/drop-contract"; +export default defineEventHandler(async (event) => { + requireAuth(event); + const body = readJson(event, 4096); + let request; + try { + request = validateReservation(await body); + } catch (error) { + throw createError({ + statusCode: 400, + statusMessage: + error instanceof Error ? error.message : "Invalid reservation.", + }); + } + const result = await dropStore.reserve(request); + setResponseStatus(event, 201); + return { + id: result.id, + uploadExpiresAt: new Date(result.uploadExpiresAt).toISOString(), + access: result.access, + }; +}); diff --git a/server/plugins/drop-cleanup.ts b/server/plugins/drop-cleanup.ts new file mode 100644 index 0000000..6abd779 --- /dev/null +++ b/server/plugins/drop-cleanup.ts @@ -0,0 +1,16 @@ +import { cleanupExpiredDrops } from "../utils/drop-store"; + +export default defineNitroPlugin((nitroApp) => { + cleanupExpiredDrops().catch((error) => + console.error("[quickdrop] Initial expiry cleanup failed.", error), + ); + + const timer = setInterval(() => { + cleanupExpiredDrops().catch((error) => + console.error("[quickdrop] Scheduled expiry cleanup failed.", error), + ); + }, 60 * 1000); + timer.unref(); + + nitroApp.hooks.hook("close", () => clearInterval(timer)); +}); diff --git a/server/utils/auth.ts b/server/utils/auth.ts new file mode 100644 index 0000000..ec93064 --- /dev/null +++ b/server/utils/auth.ts @@ -0,0 +1,104 @@ +import { createHmac, randomBytes, timingSafeEqual } from "node:crypto"; +import type { H3Event } from "h3"; +import { + createError, + deleteCookie, + getCookie, + getRequestHeader, + setCookie, +} from "h3"; +const COOKIE = "quickdrop_auth"; +const DAY = 86400000; +function config() { + const runtime = useRuntimeConfig(); + const configuredTtl = Number( + process.env.AUTH_TOKEN_TTL_DAYS || runtime.authTokenTtlDays || 7, + ); + const ttlDays = + Number.isFinite(configuredTtl) && configuredTtl > 0 ? configuredTtl : 7; + return { + passcode: String(process.env.AUTH_PASSCODE || runtime.authPasscode || ""), + secret: String(process.env.AUTH_SECRET || runtime.authSecret || ""), + ttl: ttlDays * DAY, + }; +} +function mac(value: string, secret: string) { + return createHmac("sha256", secret).update(value).digest("base64url"); +} +export function authConfigured() { + const c = config(); + return Boolean(c.passcode && c.secret); +} +export function issueSession(event: H3Event) { + const c = config(); + if (!c.secret) throw new Error("Authentication is not configured."); + const payload = `${Date.now() + c.ttl}.${randomBytes(24).toString("base64url")}`; + setCookie(event, COOKIE, `${payload}.${mac(payload, c.secret)}`, { + httpOnly: true, + sameSite: "lax", + secure: process.env.NODE_ENV === "production", + path: "/", + maxAge: Math.floor(c.ttl / 1000), + }); +} +export function clearAuthCookie(event: H3Event) { + deleteCookie(event, COOKIE, { path: "/" }); +} +export function isAuthenticated(event: H3Event): boolean { + const c = config(); + const token = getCookie(event, COOKIE); + if (!token || !c.secret) return false; + const split = token.lastIndexOf("."); + if (split < 1) return false; + const payload = token.slice(0, split); + const supplied = Buffer.from(token.slice(split + 1)); + const expected = Buffer.from(mac(payload, c.secret)); + if ( + supplied.length !== expected.length || + !timingSafeEqual(supplied, expected) + ) + return false; + const expiry = Number(payload.slice(0, payload.indexOf("."))); + return Number.isSafeInteger(expiry) && expiry > Date.now(); +} +export function requireAuth(event: H3Event) { + if (!isAuthenticated(event)) + throw createError({ + statusCode: 401, + statusMessage: "Authentication required.", + }); + requireSameOrigin(event); +} +export function verifyPasscode(value: unknown): boolean { + const c = config(); + if (!c.passcode || typeof value !== "string") return false; + const supplied = Buffer.from(value); + const expected = Buffer.from(c.passcode); + return ( + supplied.length === expected.length && timingSafeEqual(supplied, expected) + ); +} +export function requireSameOrigin(event: H3Event) { + const origin = getRequestHeader(event, "origin"); + const site = getRequestHeader(event, "sec-fetch-site"); + if ( + site && + ["cross-site", "same-site"].includes(site) && + site === "cross-site" + ) + throw createError({ + statusCode: 403, + statusMessage: "Cross-site state change rejected.", + }); + if (origin) { + const host = getRequestHeader(event, "host"); + const proto = getRequestHeader(event, "x-forwarded-proto") || "http"; + try { + if (new URL(origin).host !== host || !["http", "https"].includes(proto)) + throw new Error(); + } catch { + throw createError({ statusCode: 403, statusMessage: "Origin rejected." }); + } + } +} +export { COOKIE }; diff --git a/server/utils/drop-store.ts b/server/utils/drop-store.ts new file mode 100644 index 0000000..d1a9cba --- /dev/null +++ b/server/utils/drop-store.ts @@ -0,0 +1,580 @@ +import { createHash, randomBytes, timingSafeEqual } from "node:crypto"; +import { + mkdir, + readFile, + readdir, + rename, + rm, + stat, + writeFile, + open as openFile, +} from "node:fs/promises"; +import { resolve } from "node:path"; +import { + ROOM_ID_PATTERN, + expiresInMs, + validateReservation, + validateRoomId, +} from "../../shared/utils/drop-contract"; +import { + CHUNK_SIZE, + LEASE_IDLE_MS, + UPLOAD_RESERVATION_MS, + type PublicDescriptor, + type ReserveRequest, + type StoredDrop, + type StoredLease, +} from "../../shared/types/drop"; +const ALPHABET = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; +const productionRoot = resolve( + process.env.QUICKDROP_STORAGE_DIR || ".data/quickdrop", +); +export class DropStoreError extends Error { + constructor( + public code: + | "not-found" + | "expired" + | "conflict" + | "incomplete" + | "exhausted" + | "forbidden", + message?: string, + ) { + super(message || code); + } +} +interface LockEntry { + tail: Promise; + waiters: number; +} +const locks = new Map(); +async function withLock( + key: string, + operation: () => Promise, +): Promise { + let entry = locks.get(key); + if (!entry) { + entry = { tail: Promise.resolve(), waiters: 0 }; + locks.set(key, entry); + } + entry.waiters++; + const previous = entry.tail; + let release!: () => void; + entry.tail = new Promise((resolve) => { + release = resolve; + }); + await previous; + try { + return await operation(); + } finally { + release(); + entry.waiters--; + if (entry.waiters === 0 && locks.get(key) === entry) locks.delete(key); + } +} +function hash(value: string): string { + return createHash("sha256").update(value).digest("hex"); +} +function sameHash(left: string, right: string): boolean { + const a = Buffer.from(left, "hex"); + const b = Buffer.from(right, "hex"); + return a.length === b.length && timingSafeEqual(a, b); +} +function bearer(): string { + return randomBytes(32).toString("base64url"); +} +function nowValue(clock: (() => number) | { now(): number }): number { + return typeof clock === "function" ? clock() : clock.now(); +} +function ensureId(id: string) { + try { + validateRoomId(id); + } catch { + throw new DropStoreError("not-found", "Drop not found."); + } + return id; +} + +export interface DropStoreOptions { + root?: string; + clock?: (() => number) | { now(): number }; +} +const TEMP_FILE_GRACE_MS = 60 * 60 * 1000; +const METADATALESS_GRACE_MS = 60 * 60 * 1000; +export function pathsFor(id: string, root = productionRoot) { + ensureId(id); + const directory = resolve(root, id); + return { + directory, + metadata: resolve(directory, "metadata.json"), + manifest: resolve(directory, "manifest.bin"), + chunks: resolve(directory, "chunks"), + }; +} +async function atomicWrite(path: string, data: Uint8Array | string) { + const temp = `${path}.tmp-${process.pid}-${randomBytes(6).toString("hex")}`; + await writeFile(temp, data, { mode: 0o600 }); + try { + const handle = await openFile(temp, "r"); + await handle.sync(); + await handle.close(); + } catch { + /* fsync is best effort on unusual filesystems */ + } + await rename(temp, path); +} +function chunkPath(paths: ReturnType, index: number) { + return resolve(paths.chunks, `${String(index).padStart(10, "0")}.bin`); +} + +export class DropStore { + readonly root: string; + readonly clock: (() => number) | { now(): number }; + constructor(options: DropStoreOptions = {}) { + this.root = resolve(options.root || productionRoot); + this.clock = options.clock || (() => Date.now()); + } + async ensure() { + await mkdir(this.root, { recursive: true, mode: 0o700 }); + } + async reserve( + input: ReserveRequest, + ): Promise<{ id: string; uploadExpiresAt: number; access: string }> { + validateReservation(input); + await this.ensure(); + for (let attempt = 0; attempt < 100; attempt++) { + const id = Array.from( + randomBytes(32), + (byte) => ALPHABET[byte % ALPHABET.length], + ).join(""); + const paths = pathsFor(id, this.root); + try { + await mkdir(paths.directory, { recursive: false, mode: 0o700 }); + await mkdir(paths.chunks, { mode: 0o700 }); + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "EEXIST") continue; + throw error; + } + const createdAt = nowValue(this.clock); + const access = bearer(); + const metadata: StoredDrop = { + version: 2, + id, + state: "uploading", + createdAt, + uploadExpiresAt: createdAt + UPLOAD_RESERVATION_MS, + expiresInMs: expiresInMs(input.expiresIn), + expiresAt: null, + maxReads: input.maxReads, + readsClaimed: 0, + chunkSize: input.chunkSize, + chunkCount: input.chunkCount, + noncePrefix: input.noncePrefix, + leases: {}, + accessHash: hash(access), + }; + try { + await atomicWrite(paths.metadata, JSON.stringify(metadata)); + return { id, uploadExpiresAt: metadata.uploadExpiresAt, access }; + } catch (error) { + await rm(paths.directory, { recursive: true, force: true }); + throw error; + } + } + throw new Error("Could not allocate a drop id."); + } + async readMetadata(id: string): Promise { + const paths = pathsFor(id, this.root); + try { + return JSON.parse(await readFile(paths.metadata, "utf8")) as StoredDrop; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") return null; + throw error; + } + } + private async metadataLocked(id: string): Promise { + const metadata = await this.readMetadata(id); + if (!metadata || metadata.version !== 2 || metadata.id !== id) + throw new DropStoreError("not-found", "Drop not found."); + const now = nowValue(this.clock); + if ( + (metadata.state === "uploading" && metadata.uploadExpiresAt <= now) || + (metadata.state === "ready" && + metadata.expiresAt !== null && + metadata.expiresAt <= now) + ) { + await rm(pathsFor(id, this.root).directory, { + recursive: true, + force: true, + }); + throw new DropStoreError("expired", "Drop expired."); + } + return metadata; + } + private async save(id: string, metadata: StoredDrop) { + await atomicWrite( + pathsFor(id, this.root).metadata, + JSON.stringify(metadata), + ); + } + async putChunk( + id: string, + index: number, + body: Uint8Array, + ): Promise<"created" | "same"> { + ensureId(id); + return withLock(`${this.root}\0${id}`, async () => { + const metadata = await this.metadataLocked(id); + if (metadata.state !== "uploading") + throw new DropStoreError("conflict", "Drop is already finalized."); + if ( + !Number.isSafeInteger(index) || + index < 0 || + index >= metadata.chunkCount + ) + throw new DropStoreError("conflict", "Invalid chunk index."); + const paths = pathsFor(id, this.root); + const target = chunkPath(paths, index); + const expectedFull = metadata.chunkSize + 16; + if ( + body.byteLength < 16 || + body.byteLength > expectedFull || + (index < metadata.chunkCount - 1 && body.byteLength !== expectedFull) + ) + throw new DropStoreError("conflict", "Invalid chunk length."); + try { + const existing = await readFile(target); + if ( + existing.byteLength === body.byteLength && + sameHash( + hash(existing.toString("base64")), + hash(Buffer.from(body).toString("base64")), + ) + ) + return "same"; + throw new DropStoreError( + "conflict", + "Chunk already exists with different contents.", + ); + } catch (error) { + if (error instanceof DropStoreError) throw error; + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; + } + const temp = resolve( + paths.directory, + `.chunk-${index}-${randomBytes(5).toString("hex")}`, + ); + await writeFile(temp, body, { mode: 0o600 }); + try { + const handle = await openFile(temp, "r"); + await handle.sync(); + await handle.close(); + } catch {} + await rename(temp, target); + return "created"; + }); + } + async finalize(id: string, manifest: Uint8Array): Promise { + ensureId(id); + if (manifest.byteLength <= 16) + throw new DropStoreError("conflict", "Invalid manifest."); + return withLock(`${this.root}\0${id}`, async () => { + const metadata = await this.metadataLocked(id); + const paths = pathsFor(id, this.root); + if (metadata.state === "ready") { + const current = await readFile(paths.manifest); + if (Buffer.compare(current, Buffer.from(manifest)) !== 0) + throw new DropStoreError( + "conflict", + "Manifest conflicts with finalized drop.", + ); + return metadata; + } + for (let index = 0; index < metadata.chunkCount; index++) { + let info; + try { + info = await stat(chunkPath(paths, index)); + } catch { + throw new DropStoreError("incomplete", "Some chunks are missing."); + } + if ( + info.size < 16 || + (index < metadata.chunkCount - 1 && + info.size !== metadata.chunkSize + 16) + ) + throw new DropStoreError("incomplete", "Chunk geometry is invalid."); + } + let previous: Buffer | null = null; + try { + previous = await readFile(paths.manifest); + } catch {} + if (previous && Buffer.compare(previous, Buffer.from(manifest)) !== 0) + throw new DropStoreError( + "conflict", + "Manifest conflicts with staged data.", + ); + if (!previous) await atomicWrite(paths.manifest, manifest); + metadata.state = "ready"; + metadata.expiresAt = nowValue(this.clock) + metadata.expiresInMs; + metadata.manifestBytes = manifest.byteLength; + metadata.chunkCipherBytes = []; + for (let index = 0; index < metadata.chunkCount; index++) + metadata.chunkCipherBytes.push( + (await stat(chunkPath(paths, index))).size, + ); + await this.save(id, metadata); + return metadata; + }); + } + async descriptor(id: string, access: string): Promise { + ensureId(id); + return withLock(`${this.root}\0${id}`, async () => { + const metadata = await this.metadataLocked(id); + if (metadata.state !== "ready") + throw new DropStoreError("not-found", "Drop is not ready."); + if (!sameHash(hash(access), metadata.accessHash)) + throw new DropStoreError("forbidden", "Invalid access capability."); + const manifest = await readFile(pathsFor(id, this.root).manifest); + return { + version: 2, + id, + chunkSize: metadata.chunkSize, + chunkCount: metadata.chunkCount, + noncePrefix: metadata.noncePrefix, + chunkCipherBytes: metadata.chunkCipherBytes || [], + manifest: manifest.toString("base64url"), + expiresAt: new Date(metadata.expiresAt!).toISOString(), + canClaim: + metadata.maxReads === null || + metadata.readsClaimed < metadata.maxReads, + maxReads: metadata.maxReads, + }; + }); + } + async claim( + id: string, + access: string, + existing?: string, + ): Promise<{ + token: string; + leaseExpiresAt: number; + expiresAt: number; + reused: boolean; + }> { + ensureId(id); + return withLock(`${this.root}\0${id}`, async () => { + const metadata = await this.metadataLocked(id); + if (metadata.state !== "ready") + throw new DropStoreError("not-found", "Drop is not ready."); + if (!sameHash(hash(access), metadata.accessHash)) + throw new DropStoreError("forbidden", "Invalid access capability."); + const now = nowValue(this.clock); + for (const [tokenHash, lease] of Object.entries(metadata.leases)) { + if (lease.expiresAt <= now) delete metadata.leases[tokenHash]; + } + if (existing && metadata.leases[hash(existing)]) { + const lease = metadata.leases[hash(existing)]!; + lease.lastSeenAt = now; + lease.expiresAt = Math.min(now + LEASE_IDLE_MS, metadata.expiresAt!); + await this.save(id, metadata); + return { + token: existing, + leaseExpiresAt: lease.expiresAt, + expiresAt: metadata.expiresAt!, + reused: true, + }; + } + if ( + metadata.maxReads !== null && + metadata.readsClaimed >= metadata.maxReads + ) { + await this.save(id, metadata); + throw new DropStoreError("exhausted", "No new reads remain."); + } + const token = bearer(); + const lease: StoredLease = { + createdAt: now, + lastSeenAt: now, + expiresAt: Math.min(now + LEASE_IDLE_MS, metadata.expiresAt!), + }; + metadata.leases[hash(token)] = lease; + metadata.readsClaimed++; + await this.save(id, metadata); + return { + token, + leaseExpiresAt: lease.expiresAt, + expiresAt: metadata.expiresAt!, + reused: false, + }; + }); + } + async readChunk( + id: string, + index: number, + token: string, + ): Promise<{ handle: Awaited>; size: number }> { + ensureId(id); + return withLock(`${this.root}\0${id}`, async () => { + const metadata = await this.metadataLocked(id); + const tokenHash = hash(token); + if (metadata.state !== "ready" || !metadata.leases[tokenHash]) + throw new DropStoreError("forbidden", "Invalid lease."); + const lease = metadata.leases[tokenHash]!; + const now = nowValue(this.clock); + if (lease.expiresAt <= now) { + delete metadata.leases[hash(token)]; + await this.save(id, metadata); + throw new DropStoreError("forbidden", "Lease expired."); + } + if ( + !Number.isSafeInteger(index) || + index < 0 || + index >= metadata.chunkCount + ) + throw new DropStoreError("not-found", "Chunk not found."); + lease.lastSeenAt = now; + lease.expiresAt = Math.min(now + LEASE_IDLE_MS, metadata.expiresAt!); + await this.save(id, metadata); + const handle = await openFile( + chunkPath(pathsFor(id, this.root), index), + "r", + ); + try { + const info = await handle.stat(); + return { handle, size: info.size }; + } catch (error) { + await handle.close().catch(() => undefined); + throw error; + } + }); + } + async complete(id: string, token: string): Promise { + ensureId(id); + return withLock(`${this.root}\0${id}`, async () => { + const existing = await this.readMetadata(id); + if (!existing) return; + const now = nowValue(this.clock); + if (existing.expiresAt !== null && existing.expiresAt <= now) { + await rm(pathsFor(id, this.root).directory, { + recursive: true, + force: true, + }); + return; + } + const metadata = await this.metadataLocked(id); + const key = hash(token); + if (!metadata.leases[key]) + throw new DropStoreError("forbidden", "Invalid lease."); + delete metadata.leases[key]; + if ( + metadata.maxReads !== null && + metadata.readsClaimed >= metadata.maxReads && + Object.keys(metadata.leases).length === 0 + ) + await rm(pathsFor(id, this.root).directory, { + recursive: true, + force: true, + }); + else await this.save(id, metadata); + }); + } + async delete(id: string) { + ensureId(id); + await withLock(`${this.root}\0${id}`, () => + rm(pathsFor(id, this.root).directory, { recursive: true, force: true }), + ); + } + async cleanup() { + await this.ensure(); + const entries = await readdir(this.root, { withFileTypes: true }); + for (const entry of entries) { + if (!entry.isDirectory() || !ROOM_ID_PATTERN.test(entry.name)) continue; + await withLock(`${this.root}\0${entry.name}`, async () => { + try { + const dropDirectory = pathsFor(entry.name, this.root).directory; + const now = nowValue(this.clock); + for (const temporary of await readdir(dropDirectory)) { + if ( + !temporary.startsWith(".chunk-") && + !temporary.includes(".tmp-") + ) + continue; + const temporaryPath = resolve(dropDirectory, temporary); + const temporaryInfo = await stat(temporaryPath).catch(() => null); + if ( + temporaryInfo && + now - temporaryInfo.mtimeMs >= TEMP_FILE_GRACE_MS + ) + await rm(temporaryPath, { force: true }); + } + const metadata = await this.readMetadata(entry.name); + if (!metadata) { + const directoryInfo = await stat(dropDirectory); + if (now - directoryInfo.mtimeMs >= METADATALESS_GRACE_MS) + await rm(dropDirectory, { recursive: true, force: true }); + return; + } + if ( + (metadata.state === "uploading" && + metadata.uploadExpiresAt <= now) || + (metadata.state === "ready" && + metadata.expiresAt !== null && + metadata.expiresAt <= now) + ) { + await rm(dropDirectory, { recursive: true, force: true }); + return; + } + let changed = false; + for (const [key, lease] of Object.entries(metadata.leases)) + if ( + lease.expiresAt <= now || + now - lease.lastSeenAt >= LEASE_IDLE_MS + ) { + delete metadata.leases[key]; + changed = true; + } + if ( + metadata.maxReads !== null && + metadata.readsClaimed >= metadata.maxReads && + Object.keys(metadata.leases).length === 0 + ) { + await rm(dropDirectory, { recursive: true, force: true }); + return; + } + if (changed) await this.save(entry.name, metadata); + } catch (error) { + console.error( + `[quickdrop] ignoring malformed drop ${entry.name}`, + error, + ); + await rm(resolve(this.root, entry.name), { + recursive: true, + force: true, + }); + } + }); + } + } +} +export const dropStore = new DropStore(); +export async function ensureStore() { + return dropStore.ensure(); +} +export async function cleanupExpiredDrops() { + return dropStore.cleanup(); +} +export async function deleteDrop(id: string) { + return dropStore.delete(id); +} +export async function createRoomId() { + return ( + await dropStore.reserve({ + version: 2, + chunkSize: CHUNK_SIZE, + chunkCount: 1, + noncePrefix: randomBytes(8).toString("base64url"), + expiresIn: "24h", + maxReads: 1, + }) + ).id; +} diff --git a/server/utils/http.ts b/server/utils/http.ts new file mode 100644 index 0000000..158a320 --- /dev/null +++ b/server/utils/http.ts @@ -0,0 +1,55 @@ +import type { H3Event } from "h3"; +import { createError, getRequestHeader } from "h3"; +export async function readBounded( + event: H3Event, + max: number, +): Promise { + const declared = getRequestHeader(event, "content-length"); + if (declared && (!/^\d+$/u.test(declared) || Number(declared) > max)) + throw createError({ + statusCode: 413, + statusMessage: "Request body exceeds the limit.", + }); + const chunks: Buffer[] = []; + let total = 0; + for await (const value of event.node.req) { + const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value); + total += chunk.byteLength; + if (total > max) + throw createError({ + statusCode: 413, + statusMessage: "Request body exceeds the limit.", + }); + chunks.push(chunk); + } + return Buffer.concat(chunks, total); +} +export async function readJson(event: H3Event, max: number): Promise { + const body = await readBounded(event, max); + try { + return JSON.parse(body.toString("utf8")) as T; + } catch { + throw createError({ statusCode: 400, statusMessage: "Malformed JSON." }); + } +} +export function requireContentType(event: H3Event, expected: string) { + const type = ( + (getRequestHeader(event, "content-type") || "").split(";", 1)[0] || "" + ) + .trim() + .toLowerCase(); + if (type !== expected) + throw createError({ + statusCode: 415, + statusMessage: `Content-Type must be ${expected}.`, + }); +} +export function bearerToken(event: H3Event): string | undefined { + const value = getRequestHeader(event, "authorization") || ""; + return /^Bearer ([A-Za-z0-9_-]{20,})$/u.exec(value)?.[1]; +} +export function publicHeaders(event: H3Event) { + event.node.res.setHeader("cache-control", "no-store"); + event.node.res.setHeader("referrer-policy", "no-referrer"); + event.node.res.setHeader("x-content-type-options", "nosniff"); +} diff --git a/shared/types/drop.ts b/shared/types/drop.ts new file mode 100644 index 0000000..59b9a64 --- /dev/null +++ b/shared/types/drop.ts @@ -0,0 +1,79 @@ +export const PROTOCOL_VERSION = 2 as const; +export const CHUNK_SIZE = 8 * 1024 * 1024; +export const GCM_TAG_BYTES = 16; +export const MAX_CHUNK_BODY = CHUNK_SIZE + GCM_TAG_BYTES; +export const MAX_MANIFEST_PLAINTEXT = 64 * 1024; +export const MAX_MANIFEST_BODY = MAX_MANIFEST_PLAINTEXT + GCM_TAG_BYTES; +export const UPLOAD_RESERVATION_MS = 24 * 60 * 60 * 1000; +export const LEASE_IDLE_MS = 15 * 60 * 1000; +export const BLOB_WARNING_BYTES = 100 * 1024 * 1024; +export const BLOB_FALLBACK_MAX_BYTES = 256 * 1024 * 1024; +export const PREVIEW_MAX_BYTES = 25 * 1024 * 1024; +export const EXPIRY_VALUES = ["1h", "2h", "6h", "12h", "24h", "7d"] as const; +export type ExpiryChoice = (typeof EXPIRY_VALUES)[number]; +export const READ_VALUES = [1, 5, 10, 20, 50, 100] as const; +export type ReadChoice = (typeof READ_VALUES)[number] | null; +export const DEFAULT_EXPIRY: ExpiryChoice = "24h"; +export const DEFAULT_READS: ReadChoice = 1; +export type DropState = "uploading" | "ready"; +export interface ReserveRequest { + version: 2; + chunkSize: number; + chunkCount: number; + noncePrefix: string; + expiresIn: ExpiryChoice; + maxReads: ReadChoice; +} +export interface ReserveResponse { + id: string; + uploadExpiresAt: string; +} +export interface PublicDescriptor { + version: 2; + id: string; + chunkSize: number; + chunkCount: number; + noncePrefix: string; + chunkCipherBytes: number[]; + manifest: string; + expiresAt: string; + canClaim: boolean; + maxReads: ReadChoice; +} +export interface EncryptedManifest { + version: 2; + name: string; + type: string; + size: number; + lastModified: number; + chunkSize: number; + chunkCount: number; +} +export interface LeaseResponse { + token: string; + leaseExpiresAt: string; + expiresAt: string; +} +export interface StoredLease { + createdAt: number; + lastSeenAt: number; + expiresAt: number; +} +export interface StoredDrop { + version: 2; + id: string; + state: DropState; + createdAt: number; + uploadExpiresAt: number; + expiresInMs: number; + expiresAt: number | null; + maxReads: ReadChoice; + readsClaimed: number; + chunkSize: number; + chunkCount: number; + noncePrefix: string; + manifestBytes?: number; + chunkCipherBytes?: number[]; + leases: Record; + accessHash: string; +} diff --git a/shared/utils/drop-contract.ts b/shared/utils/drop-contract.ts new file mode 100644 index 0000000..4b30664 --- /dev/null +++ b/shared/utils/drop-contract.ts @@ -0,0 +1,121 @@ +import { + CHUNK_SIZE, + EXPIRY_VALUES, + GCM_TAG_BYTES, + MAX_CHUNK_BODY, + MAX_MANIFEST_BODY, + MAX_MANIFEST_PLAINTEXT, + PROTOCOL_VERSION, + READ_VALUES, + LEASE_IDLE_MS, + UPLOAD_RESERVATION_MS, + type ExpiryChoice, + type ReadChoice, + type ReserveRequest, +} from "../types/drop"; +export const ROOM_ID_PATTERN = /^[23456789ABCDEFGHJKLMNPQRSTUVWXYZ]{32}$/u; +export const B64URL_PATTERN = /^[A-Za-z0-9_-]+$/u; +const MAX_CHUNKS = 0xfffffffe; +export const EXPIRY_MS: Record = { + "1h": 3600000, + "2h": 7200000, + "6h": 21600000, + "12h": 43200000, + "24h": 86400000, + "7d": 604800000, +}; +export function isExpiry(value: unknown): value is ExpiryChoice { + return ( + typeof value === "string" && + (EXPIRY_VALUES as readonly string[]).includes(value) + ); +} +export function isReadLimit(value: unknown): value is ReadChoice { + return ( + value === null || + (typeof value === "number" && READ_VALUES.includes(value as never)) + ); +} +export function isBase64Url(value: unknown, bytes?: number): value is string { + return ( + typeof value === "string" && + value.length > 0 && + value.length <= 512 && + B64URL_PATTERN.test(value) && + (!bytes || + Math.ceil((value.length * 6) / 8) === bytes || + value.length === Math.ceil((bytes * 8) / 6)) + ); +} +export function decodeBase64Url(value: string): Uint8Array { + if (!B64URL_PATTERN.test(value) || value.length % 4 === 1) + throw new Error("Invalid base64url"); + const normalized = value + .replaceAll("-", "+") + .replaceAll("_", "/") + .padEnd(Math.ceil(value.length / 4) * 4, "="); + const binary = atob(normalized); + return Uint8Array.from(binary, (c) => c.charCodeAt(0)); +} +export function validateRoomId(id: unknown): asserts id is string { + if (typeof id !== "string" || !ROOM_ID_PATTERN.test(id)) + throw new Error("Invalid drop id"); +} +export function validateReservation(input: unknown): ReserveRequest { + if (!input || typeof input !== "object" || Array.isArray(input)) + throw new Error("Invalid reservation"); + const value = input as Record; + const allowed = [ + "version", + "chunkSize", + "chunkCount", + "noncePrefix", + "expiresIn", + "maxReads", + ]; + if (Object.keys(value).some((key) => !allowed.includes(key))) + throw new Error("Unknown reservation field"); + const chunkCount = value.chunkCount; + if ( + value.version !== PROTOCOL_VERSION || + value.chunkSize !== CHUNK_SIZE || + !Number.isSafeInteger(chunkCount) || + (chunkCount as number) < 1 || + (chunkCount as number) > MAX_CHUNKS + ) + throw new Error("Invalid chunk geometry"); + if ( + !isExpiry(value.expiresIn) || + !isReadLimit(value.maxReads) || + !isBase64Url(value.noncePrefix, 8) + ) + throw new Error("Invalid reservation policy"); + if (decodeBase64Url(value.noncePrefix as string).byteLength !== 8) + throw new Error("Invalid nonce prefix"); + return value as unknown as ReserveRequest; +} +export function validateChunkIndex(index: unknown, count: number): number { + const parsed = typeof index === "number" ? index : Number(index); + if (!Number.isSafeInteger(parsed) || parsed < 0 || parsed >= count) + throw new Error("Invalid chunk index"); + return parsed; +} +export function validateChunkBodyLength(length: number, final: boolean): void { + if ( + !Number.isSafeInteger(length) || + length < (final ? GCM_TAG_BYTES : MAX_CHUNK_BODY) || + length > MAX_CHUNK_BODY + ) + throw new Error("Invalid chunk body length"); +} +export function validateManifestBodyLength(length: number): void { + if ( + !Number.isSafeInteger(length) || + length <= GCM_TAG_BYTES || + length > MAX_MANIFEST_BODY + ) + throw new Error("Invalid manifest body length"); +} +export function expiresInMs(value: ExpiryChoice): number { + return EXPIRY_MS[value]; +} diff --git a/tests/drop-contract.test.mjs b/tests/drop-contract.test.mjs new file mode 100644 index 0000000..f58540c --- /dev/null +++ b/tests/drop-contract.test.mjs @@ -0,0 +1,35 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { loadModule } from "./test-helpers.mjs"; + +const contract = await loadModule("shared/utils/drop-contract.ts"); +const types = await loadModule("shared/types/drop.ts"); +const valid = { + version: 2, + chunkSize: types.CHUNK_SIZE, + chunkCount: 1, + noncePrefix: "AQIDBAUGBwg", + expiresIn: "24h", + maxReads: 1, +}; + +test("reservation validation accepts protocol geometry and rejects unsafe policies", () => { + assert.deepEqual(contract.validateReservation(valid), valid); + for (const bad of [ + { ...valid, chunkSize: 1 }, + { ...valid, chunkCount: 0 }, + { ...valid, chunkCount: 1.5 }, + { ...valid, expiresIn: "forever" }, + { ...valid, maxReads: 2 }, + { ...valid, unknown: true }, + { ...valid, noncePrefix: "AA" }, + ]) + assert.throws(() => contract.validateReservation(bad)); +}); + +test("manifest body must contain plaintext as well as the GCM tag", () => { + assert.throws(() => contract.validateManifestBodyLength(types.GCM_TAG_BYTES)); + assert.doesNotThrow(() => + contract.validateManifestBodyLength(types.GCM_TAG_BYTES + 1), + ); +}); diff --git a/tests/drop-crypto.test.mjs b/tests/drop-crypto.test.mjs new file mode 100644 index 0000000..281e666 --- /dev/null +++ b/tests/drop-crypto.test.mjs @@ -0,0 +1,126 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { loadModule } from "./test-helpers.mjs"; + +const crypto = await loadModule("app/utils/crypto.ts"); +const id = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; +const key = crypto.generateKey(); +const wrongKey = crypto.generateKey(); +const nonce = crypto.generateNoncePrefix(); + +test("AES-GCM manifest and chunk round trips preserve plaintext", async () => { + const plain = new TextEncoder().encode("hello chunk"); + const cipher = await crypto.encryptChunk( + plain, + key, + id, + nonce, + 0, + 8 * 1024 * 1024, + 1, + ); + assert.deepEqual( + [ + ...(await crypto.decryptChunk( + cipher, + key, + id, + nonce, + 0, + plain.byteLength, + 8 * 1024 * 1024, + 1, + )), + ], + [...plain], + ); + const manifest = { + version: 2, + name: "hello.txt", + type: "text/plain", + size: plain.byteLength, + lastModified: 1, + chunkSize: 8 * 1024 * 1024, + chunkCount: 1, + }; + const encrypted = await crypto.encryptManifest(manifest, key, id, nonce); + assert.deepEqual( + await crypto.decryptManifest( + encrypted, + key, + id, + nonce, + manifest.chunkSize, + manifest.chunkCount, + ), + manifest, + ); +}); + +test("empty chunks are authenticated and round-trip", async () => { + const cipher = await crypto.encryptChunk( + new Uint8Array(), + key, + id, + nonce, + 0, + 8 * 1024 * 1024, + 1, + ); + assert.equal(cipher.byteLength, 16); + assert.equal( + ( + await crypto.decryptChunk( + cipher, + key, + id, + nonce, + 0, + 0, + 8 * 1024 * 1024, + 1, + ) + ).byteLength, + 0, + ); +}); + +test("tampering and wrong key or AAD fail integrity", async () => { + const cipher = await crypto.encryptChunk( + new Uint8Array([1, 2, 3]), + key, + id, + nonce, + 0, + 8 * 1024 * 1024, + 1, + ); + const tampered = new Uint8Array(cipher); + tampered[0] ^= 1; + await assert.rejects( + crypto.decryptChunk(tampered, key, id, nonce, 0, 3, 8 * 1024 * 1024, 1), + /integrity/, + ); + await assert.rejects( + crypto.decryptChunk(cipher, wrongKey, id, nonce, 0, 3, 8 * 1024 * 1024, 1), + /integrity/, + ); + await assert.rejects( + crypto.decryptChunk(cipher, key, id, nonce, 1, 3, 8 * 1024 * 1024, 1), + /integrity/, + ); +}); + +test("tag-only manifests are rejected before decryption", async () => { + await assert.rejects( + crypto.decryptManifest( + new Uint8Array(16), + key, + id, + nonce, + 8 * 1024 * 1024, + 1, + ), + /empty/, + ); +}); diff --git a/tests/drop-store.test.mjs b/tests/drop-store.test.mjs new file mode 100644 index 0000000..49aaa0c --- /dev/null +++ b/tests/drop-store.test.mjs @@ -0,0 +1,153 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { mkdtemp, readFile, rm, stat, utimes, access } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { loadModule } from "./test-helpers.mjs"; + +const { DropStore, DropStoreError, pathsFor } = await loadModule( + "server/utils/drop-store.ts", +); +const { CHUNK_SIZE } = await loadModule("shared/types/drop.ts"); +const noncePrefix = "AQIDBAUGBwg"; +let roots = []; +async function fresh(clock = { now: () => Date.now() }) { + const root = await mkdtemp(join(tmpdir(), "quickdrop-test-")); + roots.push(root); + return { store: new DropStore({ root, clock }), root }; +} +async function reserve(store, maxReads = 1, expiresIn = "24h") { + return store.reserve({ + version: 2, + chunkSize: CHUNK_SIZE, + chunkCount: 1, + noncePrefix, + expiresIn, + maxReads, + }); +} +async function ready(store, maxReads = 1, expiresIn = "24h") { + const result = await reserve(store, maxReads, expiresIn); + await store.putChunk(result.id, 0, new Uint8Array(16)); + await store.finalize(result.id, new Uint8Array(17)); + return result; +} +async function exists(path) { + try { + await access(path); + return true; + } catch { + return false; + } +} +test.after(async () => { + await Promise.all( + roots.map((root) => rm(root, { recursive: true, force: true })), + ); +}); + +test("finalize starts expiry and rejects missing chunks", async () => { + let now = 1000; + const { store } = await fresh({ now: () => now }); + const result = await reserve(store, 1, "1h"); + await assert.rejects( + store.finalize(result.id, new Uint8Array(17)), + (error) => error instanceof DropStoreError && error.code === "incomplete", + ); + await store.putChunk(result.id, 0, new Uint8Array(16)); + const metadata = await store.finalize(result.id, new Uint8Array(17)); + assert.equal(metadata.expiresAt, now + 3600000); + now += 3599999; + assert.equal( + (await store.descriptor(result.id, result.access)).id, + result.id, + ); + now++; + await assert.rejects( + store.descriptor(result.id, result.access), + (error) => error instanceof DropStoreError && error.code === "expired", + ); +}); + +test("chunk retries are idempotent and conflicting contents are rejected", async () => { + const { store } = await fresh(); + const result = await reserve(store); + const body = new Uint8Array(16).fill(7); + assert.equal(await store.putChunk(result.id, 0, body), "created"); + assert.equal(await store.putChunk(result.id, 0, body), "same"); + await assert.rejects( + store.putChunk(result.id, 0, new Uint8Array(16).fill(8)), + (error) => error instanceof DropStoreError && error.code === "conflict", + ); +}); + +test("maxReads claims are serialized, valid lease reuse does not increment, and completion cleans up", async () => { + const { store, root } = await fresh(); + const result = await ready(store, 1); + const claims = await Promise.allSettled([ + store.claim(result.id, result.access), + store.claim(result.id, result.access), + ]); + assert.equal( + claims.filter((value) => value.status === "fulfilled").length, + 1, + ); + assert.equal(claims.filter((value) => value.status === "rejected").length, 1); + const first = claims.find((value) => value.status === "fulfilled").value; + const metadataBefore = await store.readMetadata(result.id); + const reused = await store.claim(result.id, result.access, first.token); + assert.equal(reused.reused, true); + assert.equal( + (await store.readMetadata(result.id)).readsClaimed, + metadataBefore.readsClaimed, + ); + const chunk = await store.readChunk(result.id, 0, first.token); + assert.equal(chunk.size, 16); + await chunk.handle.close(); + await store.complete(result.id, first.token); + assert.equal(await exists(pathsFor(result.id, root).directory), false); +}); + +test("unlimited drops allow multiple leases and metadata remains parseable", async () => { + const { store, root } = await fresh(); + const result = await ready(store, null); + const one = await store.claim(result.id, result.access); + const two = await store.claim(result.id, result.access); + assert.notEqual(one.token, two.token); + assert.equal((await store.readMetadata(result.id)).readsClaimed, 2); + JSON.parse(await readFile(pathsFor(result.id, root).metadata, "utf8")); + await store.complete(result.id, one.token); + assert.equal(await exists(pathsFor(result.id, root).directory), true); +}); + +test("idle lease cleanup and stale temporary files are safe", async () => { + let now = 100000; + const { store, root } = await fresh({ now: () => now }); + const result = await ready(store, 1); + await store.claim(result.id, result.access); + const paths = pathsFor(result.id, root); + const stale = join(paths.directory, ".chunk-stale"); + await (await import("node:fs/promises")).writeFile(stale, "stale"); + const old = new Date(now - 2 * 3600000); + await utimes(stale, old, old); + now += 16 * 60 * 1000; + await store.cleanup(); + assert.equal(await exists(stale), false); + assert.equal(await exists(paths.directory), false); +}); + +test("metadata-less valid directories are removed only after grace period", async () => { + let now = 10_000_000; + const { store, root } = await fresh({ now: () => now }); + const result = await reserve(store); + const paths = pathsFor(result.id, root); + await rm(paths.metadata); + const recent = new Date(now); + await utimes(paths.directory, recent, recent); + await store.cleanup(); + assert.equal(await exists(paths.directory), true); + const old = new Date(now - 2 * 3600000); + await utimes(paths.directory, old, old); + await store.cleanup(); + assert.equal(await exists(paths.directory), false); +}); diff --git a/tests/http-smoke.test.mjs b/tests/http-smoke.test.mjs new file mode 100644 index 0000000..0f86293 --- /dev/null +++ b/tests/http-smoke.test.mjs @@ -0,0 +1,207 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { access, mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { execFile, spawn } from "node:child_process"; +import { promisify } from "node:util"; + +try { + await access(".output/server/index.mjs"); +} catch { + await promisify(execFile)("npm", ["run", "build"], { stdio: "inherit" }); +} +const port = 19000 + Math.floor(Math.random() * 500); +const storage = await mkdtemp(join(tmpdir(), "quickdrop-http-")); +const child = spawn(process.execPath, [".output/server/index.mjs"], { + env: { + ...process.env, + NITRO_HOST: "127.0.0.1", + NITRO_PORT: String(port), + AUTH_PASSCODE: "smoke-passcode", + AUTH_SECRET: "smoke-secret-for-tests", + QUICKDROP_STORAGE_DIR: storage, + }, + stdio: "ignore", +}); +async function request(url, init) { + return fetch(`http://127.0.0.1:${port}${url}`, init); +} +async function waitForServer() { + for (let attempt = 0; attempt < 50; attempt++) { + try { + const response = await request("/api/auth/session"); + if (response.status === 200) return; + } catch {} + await new Promise((resolve) => setTimeout(resolve, 100)); + } + throw new Error("built server did not start"); +} + +test("built server enforces auth and serves capability-only lease/chunk APIs", async () => { + try { + await waitForServer(); + const reservationBody = JSON.stringify({ + version: 2, + chunkSize: 8 * 1024 * 1024, + chunkCount: 1, + noncePrefix: "AQIDBAUGBwg", + expiresIn: "24h", + maxReads: 1, + }); + assert.equal( + ( + await request("/api/drops", { + method: "POST", + headers: { "content-type": "application/json" }, + body: reservationBody, + }) + ).status, + 401, + ); + const login = await request("/api/auth/login", { + method: "POST", + headers: { + "content-type": "application/json", + origin: `http://127.0.0.1:${port}`, + }, + body: JSON.stringify({ passcode: "smoke-passcode" }), + }); + assert.equal(login.status, 204); + const cookie = login.headers.get("set-cookie").split(";", 1)[0]; + const reserve = await request("/api/drops", { + method: "POST", + headers: { + "content-type": "application/json", + cookie, + origin: `http://127.0.0.1:${port}`, + }, + body: reservationBody, + }); + assert.equal(reserve.status, 201); + const created = await reserve.json(); + const chunk = new Uint8Array(16); + const put = await request(`/api/drops/${created.id}/chunks/0`, { + method: "PUT", + headers: { + "content-type": "application/octet-stream", + cookie, + origin: `http://127.0.0.1:${port}`, + }, + body: chunk, + }); + assert.equal(put.status, 201); + const finalize = await request(`/api/drops/${created.id}/finalize`, { + method: "POST", + headers: { + "content-type": "application/octet-stream", + cookie, + origin: `http://127.0.0.1:${port}`, + }, + body: new Uint8Array(17), + }); + assert.equal(finalize.status, 200); + const descriptor = await request(`/api/drops/${created.id}`, { + headers: { "x-quickdrop-access": created.access }, + }); + assert.equal(descriptor.status, 200); + const first = await request(`/api/drops/${created.id}/leases`, { + method: "POST", + headers: { "x-quickdrop-access": created.access }, + }); + assert.equal(first.status, 201); + const lease = await first.json(); + const second = await request(`/api/drops/${created.id}/leases`, { + method: "POST", + headers: { "x-quickdrop-access": created.access }, + }); + assert.equal(second.status, 410); + const reused = await request(`/api/drops/${created.id}/leases`, { + method: "POST", + headers: { + "x-quickdrop-access": created.access, + authorization: `Bearer ${lease.token}`, + }, + }); + assert.equal(reused.status, 200); + assert.equal((await reused.json()).token, lease.token); + const chunkGet = await request(`/api/drops/${created.id}/chunks/0`, { + headers: { authorization: `Bearer ${lease.token}` }, + }); + assert.equal(chunkGet.status, 200); + assert.equal((await chunkGet.arrayBuffer()).byteLength, 16); + const complete = await request(`/api/drops/${created.id}/complete`, { + method: "POST", + headers: { authorization: `Bearer ${lease.token}` }, + }); + assert.equal(complete.status, 204); + + // Completion retries must also be idempotent when the drop remains (unlimited reads). + const unlimitedBody = JSON.stringify({ + ...JSON.parse(reservationBody), + maxReads: null, + }); + const unlimitedReserve = await request("/api/drops", { + method: "POST", + headers: { + "content-type": "application/json", + cookie, + origin: `http://127.0.0.1:${port}`, + }, + body: unlimitedBody, + }); + assert.equal(unlimitedReserve.status, 201); + const unlimited = await unlimitedReserve.json(); + assert.equal( + ( + await request(`/api/drops/${unlimited.id}/chunks/0`, { + method: "PUT", + headers: { + "content-type": "application/octet-stream", + cookie, + origin: `http://127.0.0.1:${port}`, + }, + body: chunk, + }) + ).status, + 201, + ); + assert.equal( + ( + await request(`/api/drops/${unlimited.id}/finalize`, { + method: "POST", + headers: { + "content-type": "application/octet-stream", + cookie, + origin: `http://127.0.0.1:${port}`, + }, + body: new Uint8Array(17), + }) + ).status, + 200, + ); + const unlimitedClaim = await request(`/api/drops/${unlimited.id}/leases`, { + method: "POST", + headers: { "x-quickdrop-access": unlimited.access }, + }); + assert.equal(unlimitedClaim.status, 201); + const unlimitedLease = await unlimitedClaim.json(); + const completionInit = { + method: "POST", + headers: { authorization: `Bearer ${unlimitedLease.token}` }, + }; + assert.equal( + (await request(`/api/drops/${unlimited.id}/complete`, completionInit)) + .status, + 204, + ); + assert.equal( + (await request(`/api/drops/${unlimited.id}/complete`, completionInit)) + .status, + 204, + ); + } finally { + child.kill("SIGTERM"); + await rm(storage, { recursive: true, force: true }); + } +}); diff --git a/tests/test-helpers.mjs b/tests/test-helpers.mjs new file mode 100644 index 0000000..f971d00 --- /dev/null +++ b/tests/test-helpers.mjs @@ -0,0 +1,16 @@ +import { createServer } from "vite"; +import { resolve } from "node:path"; + +export const root = resolve(new URL("..", import.meta.url).pathname); +export async function loadModule(path) { + const vite = await createServer({ + root, + logLevel: "error", + resolve: { alias: { "~": resolve(root, "app") } }, + }); + try { + return await vite.ssrLoadModule(`/${path}`); + } finally { + await vite.close(); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..307b213 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + // https://nuxt.com/docs/guide/concepts/typescript + "files": [], + "references": [ + { + "path": "./.nuxt/tsconfig.app.json" + }, + { + "path": "./.nuxt/tsconfig.server.json" + }, + { + "path": "./.nuxt/tsconfig.shared.json" + }, + { + "path": "./.nuxt/tsconfig.node.json" + } + ] +} diff --git a/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000..c309e92 --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,274 @@ +import { defineConfig, presetUno } from "unocss"; + +const colors = { + bg: "#080d16", + "bg-deep": "#050910", + panel: "#101722", + "panel-raised": "#151e2b", + border: "#263242", + "border-soft": "#1d2836", + text: "#f4f7f5", + muted: "#8f9bab", + "muted-bright": "#b9c2cc", + accent: "#46e69e", + "accent-strong": "#28d985", + "accent-ink": "#062317", + danger: "#ff7f7f", +}; + +export default defineConfig({ + presets: [presetUno({ preflight: false })], + safelist: [ + "site-shell", + "site-header", + "brand", + "brand-mark", + "brand-i", + "status-dot", + "page", + "hero", + "eyebrow", + "hero-copy", + "rail-layout", + "panel", + "panel-main", + "panel-side", + "drop-panel", + "drop-zone", + "drop-icon", + "button", + "button-large", + "button-secondary", + "button-small", + "side-heading", + "feature-list", + "feature", + "feature-icon", + "selected-file", + "selected-card", + "selected-icon", + "selected-meta", + "selected-name", + "selected-detail", + "icon-button", + "selected-actions", + "privacy-note", + "error-message", + "success-title", + "success-copy", + "share-label", + "share-box", + "share-value", + "success-actions", + "qr-panel", + "qr-frame", + "qr-title", + "qr-copy", + "progress-wrap", + "progress-track", + "progress-bar", + "progress-label", + "download-page", + "download-heading", + "download-intro", + "download-card", + "ready-badge", + "download-file", + "download-button", + "preview", + "preview-caption", + "state-box", + "spinner", + "site-footer", + "footer-security", + ], + theme: { + colors, + fontFamily: { + display: "'Instrument Sans', ui-sans-serif, system-ui, sans-serif", + body: "'Instrument Sans', ui-sans-serif, system-ui, sans-serif", + mono: "ui-monospace, SFMono-Regular, Menlo, monospace", + }, + breakpoints: { + // Uno's lt-* variants subtract .1px; offset these to preserve the original inclusive max-width queries. + sm: "560.1px", + md: "800.1px", + }, + transitionProperty: { + drop: "border-color, background, transform", + button: "transform, background, box-shadow", + }, + animation: { + keyframes: { + progress: + "{0%{transform:translateX(-110%)}100%{transform:translateX(290%)}}", + spin: "{to{transform:rotate(360deg)}}", + }, + }, + }, + shortcuts: { + "site-shell": + "w-[min(1180px,calc(100%_-_40px))] min-h-screen mx-auto flex flex-col lt-sm:w-[min(100%_-_26px,1180px)]", + "site-header": "h-16 flex items-center justify-between lt-sm:h-[72px]", + brand: + "inline-flex items-center gap-[11px] text-[var(--text)] font-display text-[21px] font-800 tracking-[-.04em] no-underline", + "brand-mark": + "w-[33px] h-[33px] grid place-items-center border border-[rgba(70,230,158,.3)] rounded-[10px] text-accent bg-[rgba(70,230,158,.08)] [&>svg]:w-[19px] [&>svg]:fill-none [&>svg]:stroke-current [&>svg]:stroke-width-[1.8] [&>svg]:[stroke-linecap:round] [&>svg]:[stroke-linejoin:round]", + "brand-i": + "relative after:absolute after:left-[22%] after:top-[4.5px] after:h-[3.5px] after:w-[3.5px] after:-translate-x-[22%] after:bg-accent after:content-empty", + "status-dot": + "w-[7px] h-[7px] rounded-full bg-accent shadow-[0_0_12px_rgba(70,230,158,.75)]", + page: "pt-4 pb-[64px] lt-md:pt-[50px] lt-sm:pt-[40px] lt-sm:pb-[50px]", + hero: "max-w-[720px] mb-[44px] lt-sm:mb-[30px]", + eyebrow: + "m-0 mb-[15px] text-accent text-[12px] font-700 tracking-[.14em] uppercase", + "hero-copy": + "max-w-[600px] m-0 text-[var(--muted)] text-[18px] leading-[1.65] lt-sm:text-[16px]", + "rail-layout": + "grid grid-cols-[minmax(0,1.18fr)_minmax(320px,.82fr)] gap-[22px] items-stretch lt-md:grid-cols-[minmax(0,1fr)]", + panel: + "min-w-0 border border-[var(--border)] rounded-[20px] bg-[rgba(16,23,34,.9)] shadow-[0_22px_70px_rgba(0,0,0,.18)]", + "panel-main": "min-h-[418px] p-[clamp(25px,4vw,42px)] lt-sm:p-[22px]", + "panel-side": "p-[clamp(25px,3vw,36px)] lt-md:min-h-auto lt-sm:p-[22px]", + "drop-panel": "flex flex-col", + "drop-zone": + "my-auto min-h-[282px] flex flex-col items-center justify-center p-[35px] border border-dashed border-[#35475a] rounded-[15px] text-center cursor-pointer bg-[rgba(8,13,22,.48)] transition-drop duration-200 hover:border-accent hover:bg-[rgba(70,230,158,.04)] hover:translate-y-[-2px] [&.is-dragging]:border-accent [&.is-dragging]:bg-[rgba(70,230,158,.04)] [&.is-dragging]:translate-y-[-2px] [&:has(.file-input:focus-visible)]:border-accent [&:has(.file-input:focus-visible)]:bg-[rgba(70,230,158,.04)] [&:has(.file-input:focus-visible)]:translate-y-[-2px] [&:has(.file-input:focus-visible)]:outline-[3px] [&:has(.file-input:focus-visible)]:outline-[rgba(70,230,158,.35)] [&:has(.file-input:focus-visible)]:outline-offset-[3px] [&>h2]:mb-[8px] [&>h2]:text-[21px] [&>h2]:tracking-[-.025em] [&>p]:mb-[21px] [&>p]:text-[var(--muted)] [&>p]:text-[14px] lt-sm:min-h-[250px] lt-sm:py-[25px] lt-sm:px-[15px]", + "drop-icon": + "w-[54px] h-[54px] grid place-items-center mb-[20px] rounded-[15px] text-accent bg-[rgba(70,230,158,.1)] [&>svg]:w-[27px] [&>svg]:fill-none [&>svg]:stroke-current [&>svg]:stroke-width-[1.7] [&>svg]:[stroke-linecap:round] [&>svg]:[stroke-linejoin:round]", + button: + "min-h-[48px] inline-flex items-center justify-center gap-[10px] px-[20px] rounded-[10px] text-[var(--accent-ink)] bg-accent font-700 no-underline cursor-pointer transition-button duration-180 hover:not-disabled:bg-[#5ef0ae] hover:not-disabled:translate-y-[-2px] hover:not-disabled:shadow-[0_10px_28px_rgba(70,230,158,.16)] disabled:cursor-not-allowed disabled:opacity-55 [&>svg]:w-[20px] [&>svg]:fill-none [&>svg]:stroke-current [&>svg]:stroke-2 [&>svg]:[stroke-linecap:round] [&>svg]:[stroke-linejoin:round]", + "button-large": "min-h-[58px] w-full text-[16px]", + "button-secondary": + "text-[var(--text)] border border-[var(--border)] bg-[var(--panel-raised)] hover:not-disabled:bg-[#1a2533] hover:not-disabled:shadow-none", + "button-small": "min-h-[39px] px-[14px] text-[13px]", + "side-heading": "mb-[24px] text-[17px] tracking-[-.02em]", + "feature-list": "grid gap-[23px] m-0 p-0 list-none", + feature: + "grid grid-cols-[38px_1fr] gap-[14px] [&_h3]:m-[1px_0_4px] [&_h3]:text-[14px] [&_p]:m-0 [&_p]:text-[var(--muted)] [&_p]:text-[13px] [&_p]:leading-[1.5]", + "feature-icon": + "w-[38px] h-[38px] grid place-items-center border border-[rgba(70,230,158,.16)] rounded-[10px] text-accent bg-[rgba(70,230,158,.06)] [&>svg]:w-[18px] [&>svg]:fill-none [&>svg]:stroke-current [&>svg]:stroke-width-[1.7] [&>svg]:[stroke-linecap:round] [&>svg]:[stroke-linejoin:round]", + "selected-file": "h-full flex flex-col justify-center", + "selected-card": + "flex items-center gap-[16px] p-[17px] border border-[var(--border)] rounded-[13px] bg-[var(--bg)]", + "selected-icon": + "w-[49px] h-[49px] flex-none grid place-items-center rounded-[12px] text-accent bg-[rgba(70,230,158,.09)] [&>svg]:w-[24px] [&>svg]:fill-none [&>svg]:stroke-current [&>svg]:stroke-width-[1.7] [&>svg]:[stroke-linecap:round] [&>svg]:[stroke-linejoin:round]", + "selected-meta": "min-w-0 flex-1", + "selected-name": + "m-0 mb-[3px] overflow-hidden text-[var(--text)] font-600 text-ellipsis whitespace-nowrap", + "selected-detail": "m-0 text-[var(--muted)] text-[13px]", + "icon-button": + "w-[38px] h-[38px] flex-none grid place-items-center rounded-[9px] text-[var(--muted)] bg-transparent cursor-pointer hover:text-[var(--text)] hover:bg-[var(--panel-raised)] [&>svg]:w-[18px] [&>svg]:fill-none [&>svg]:stroke-current [&>svg]:stroke-width-[1.8] [&>svg]:[stroke-linecap:round]", + "selected-actions": + "grid grid-cols-[1fr_auto] gap-[10px] mt-[18px] lt-sm:grid-cols-[1fr]", + "privacy-note": + "flex items-start gap-[9px] m-[21px_0_0] text-[var(--muted)] text-[12px] leading-[1.5] [&>svg]:w-[15px] [&>svg]:min-w-[15px] [&>svg]:mt-[1px] [&>svg]:fill-none [&>svg]:stroke-accent [&>svg]:stroke-width-[1.8]", + "error-message": "m-[16px_0_0] text-danger text-[13px]", + "success-title": "mb-[8px] text-[27px] tracking-[-.04em]", + "success-copy": "mb-[27px] text-[var(--muted)] leading-[1.6]", + "share-label": + "block mb-[9px] text-[var(--muted-bright)] text-[12px] font-600", + "share-box": + "flex gap-[9px] p-[8px] border border-[var(--border)] rounded-[12px] bg-[var(--bg)] lt-sm:flex-col", + "share-value": + "min-w-0 flex-1 p-[10px_7px] overflow-hidden border-0 text-accent bg-transparent font-mono text-[13px] text-ellipsis whitespace-nowrap lt-sm:w-full", + "success-actions": "mt-[28px]", + "qr-panel": + "flex flex-col items-center justify-center text-center lt-md:py-[36px]", + "qr-frame": + "w-[min(100%,300px)] aspect-square p-[16px] rounded-[15px] bg-white shadow-[0_16px_45px_rgba(0,0,0,.24)] lt-md:w-[min(260px,80vw)] [&>svg]:block [&>svg]:w-full [&>svg]:h-full", + "qr-title": "mt-[22px] mb-[7px] text-[16px]", + "qr-copy": + "max-w-[260px] m-0 text-[var(--muted)] text-[13px] leading-[1.55]", + "progress-wrap": "mt-[24px]", + "progress-track": "h-[5px] overflow-hidden rounded-full bg-[#263242]", + "progress-bar": + "w-[38%] h-full rounded-inherit bg-accent animate-[progress_1.3s_ease-in-out_infinite]", + "progress-label": "mt-[11px] text-[var(--muted)] text-[13px]", + "download-page": + "max-w-[920px] mx-auto py-[82px] pb-[72px] lt-sm:pt-[50px]", + "download-heading": + "mb-[13px] text-[clamp(34px,5vw,53px)] text-center tracking-[-.05em]", + "download-intro": + "max-w-[580px] mx-auto mb-[35px] text-[var(--muted)] text-[16px] leading-[1.6] text-center", + "download-card": "max-w-[680px] mx-auto p-[clamp(25px,5vw,42px)]", + "ready-badge": + "w-fit flex items-center gap-[8px] mx-auto mb-[25px] py-[7px] px-[11px] rounded-full text-accent bg-[rgba(70,230,158,.08)] text-[12px] font-700", + "download-file": "mb-[22px]", + "download-button": "mt-[18px]", + preview: + "mt-[26px] overflow-hidden border border-[var(--border)] rounded-[14px] bg-[var(--bg-deep)] [&_img]:w-full [&_img]:max-h-[460px] [&_img]:block [&_img]:object-contain [&_video]:w-full [&_video]:max-h-[460px] [&_video]:block [&_video]:object-contain", + "preview-caption": + "p-[10px_14px] border-t border-[var(--border-soft)] text-[var(--muted)] text-[12px] text-center", + "state-box": + "min-h-[330px] flex flex-col items-center justify-center text-center [&>h2]:mb-[8px] [&>h2]:text-[21px] [&>p]:max-w-[420px] [&>p]:mb-[22px] [&>p]:text-[var(--muted)] [&>p]:leading-[1.55]", + spinner: + "w-[32px] h-[32px] mb-[19px] border-[3px] border-[#263242] border-t-accent rounded-full animate-[spin_.8s_linear_infinite]", + "site-footer": + "min-h-[86px] flex items-center justify-between gap-[20px] border-t border-[var(--border-soft)] text-[var(--muted)] text-[12px] lt-sm:py-[23px] lt-sm:flex-col lt-sm:items-start [&>p]:m-0", + "footer-security": + "flex items-center gap-[7px] [&>svg]:w-[15px] [&>svg]:fill-none [&>svg]:stroke-accent [&>svg]:stroke-width-[1.7] [&>svg]:[stroke-linecap:round] [&>svg]:[stroke-linejoin:round]", + }, + preflights: [ + { + layer: "base", + getCSS: () => ` +@font-face { + font-family: 'Instrument Sans'; + src: url('/fonts/InstrumentSans-VariableFont_wdth,wght.woff2') format('woff2'); + font-display: swap; + font-style: normal; + font-weight: 400 800; +} +:root { + --bg: #080d16; + --bg-deep: #050910; + --panel: #101722; + --panel-raised: #151e2b; + --border: #263242; + --border-soft: #1d2836; + --text: #f4f7f5; + --muted: #8f9bab; + --muted-bright: #b9c2cc; + --accent: #46e69e; + --accent-strong: #28d985; + --accent-ink: #062317; + --danger: #ff7f7f; + --font-display: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif; + --font-body: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif; +} +*, *::before, *::after { box-sizing: border-box; border-width: 0; border-style: solid; } +html { min-height: 100%; color-scheme: dark; background: var(--bg); font-family: var(--font-body); } +body { + min-height: 100vh; + margin: 0; + color: var(--text); + background: radial-gradient(circle at 78% 8%, rgba(70, 230, 158, .07), transparent 27rem), radial-gradient(circle at 10% 50%, rgba(58, 126, 250, .05), transparent 30rem), var(--bg); +} +body::before { + position: fixed; + inset: 0; + z-index: -1; + pointer-events: none; + content: ''; + opacity: .22; + background-image: linear-gradient(rgba(255,255,255,.018) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.018) 1px, transparent 1px); + background-size: 42px 42px; + mask-image: linear-gradient(to bottom, black, transparent 72%); +} +button, input { font: inherit; } +button, a { -webkit-tap-highlight-color: transparent; } +a { color: inherit; } +button { border: 0; } +:focus-visible { outline: 3px solid rgba(70,230,158,.5); outline-offset: 3px; } +h1, h2, h3, p { margin-top: 0; } +h1, h2, h3 { font-family: var(--font-display); } +h1 { margin-bottom: 17px; font-size: clamp(40px, 6vw, 68px); line-height: 1.04; letter-spacing: -.055em; } +@keyframes progress { 0% { transform: translateX(-110%); } 100% { transform: translateX(290%); } } +@keyframes spin { to { transform: rotate(360deg); } } +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; } +} +`, + }, + ], +});