diff --git a/verification/.gitignore b/verification/.gitignore new file mode 100644 index 0000000..3ba4fcf --- /dev/null +++ b/verification/.gitignore @@ -0,0 +1,6 @@ +artifacts/ +cache/ +node_modules/ +tmp/ +.regression-*/ +*.log diff --git a/verification/README.md b/verification/README.md new file mode 100644 index 0000000..3aebc00 --- /dev/null +++ b/verification/README.md @@ -0,0 +1,112 @@ +# KVideo strict verification + +There is one complete validation entry point. Run it from the repository root: + +```sh +./verification/run +``` + +The runner installs its pinned tools inside this directory, builds and starts +KVideo locally, exercises APIs and UI, and writes evidence under +`verification/artifacts//`. It does not edit application source. +The Docker stage creates a temporary sanitized context below +`verification/cache/`, excludes this verification tree and generated build +state, and removes that context after use. Root Docker configuration is not +modified by the verifier. + +Primary outputs: + +- `report.html`: browsable report with every finding and evidence link. +- `summary.md`: compact human-readable result and coverage gaps. +- `summary.json`: machine-readable run metadata and totals. +- `findings.json`: every pass, failure, warning, skip, and explanation. +- `junit.xml`: CI-compatible result file. +- `events.ndjson`: chronological structured event log. +- `run.log`: chronological plain-text log. +- `raw/`: complete command output and remote response evidence. +- `screenshots/`: viewport, action, and visual-difference images. +- `traces/`: browser traces for failed flows. + +Test layout: + +- `tests/regression/`: executable project regressions, including direct + `GH-ISSUE` and `GH-PR` trace tags. +- `tests/harness/`: tests for the verification framework itself; these prove + logging, redaction, history normalization, and policy enforcement work. +- `src/run-regression.mjs`: uses the verifier's pinned esbuild to bundle each + TypeScript regression as isolated CommonJS, runs every bundle with Node's + test runner, and removes normal temporary output. Coverage mode retains its + bundle beside the coverage evidence so source-map remapping is auditable. + +The regression subset is an internal stage, not a second validation command. +Only `./verification/run` executes the whole chain: harness self-tests, local +Issue/pull-request contracts, source policy, static analysis, +100% application coverage enforcement, verifier dependency/audit checks, +Android lint/tests/APK build, production builds, Docker, runtime APIs, proxies, +latency, UI actions, video, performance, visual comparison, and deployment +consistency. + +Normal verification does not query GitHub. Known Issue and pull-request +requirements are stored in `history/catalog.json`, review contracts are stored +beside it, and executable `GH-ISSUE` / `GH-PR` tags point to local regression +tests or checks invoked by the runner. The harness fails when evidence is +missing, dead, unknown, or outside the one executable verification graph. +`history/pr-evidence-template.md` contains the self-owned pull-request fields; +the verifier does not require edits to the repository's `.github/` templates. + +Remote history maintenance is explicit rather than a runtime dependency. Run +`./verification/run --audit-github` only when intentionally auditing new or +edited GitHub records. That mode paginates Issues, pull requests, comments, +reviews, and threads and compares them with `history/baseline.json`. + +Useful options: + +```sh +./verification/run --quick +./verification/run --offline +./verification/run --audit-github +./verification/run --candidate +./verification/run --reference-url https://kvideo.pages.dev +./verification/run --keep-server +./verification/run --max-actions 10000 --max-action-depth 10 +``` + +`--candidate` is used by pre-merge/push CI. It runs the full candidate checks +but explicitly skips only the post-publication convergence check, because an +unpublished commit cannot already equal GitHub main, Cloudflare, and Docker. +After release, run the default command without this flag; public consistency is +then mandatory. + +Full mode explores up to 5,000 control-state operations per route and eight +same-route transitions. Every admitted state's controls are executed. New URL +locations and new bounded control signatures enter the recursive frontier; +independent combinations made entirely from already-covered signatures are +recorded as subsumed instead of being expanded into a Cartesian product. The +triggering interaction, resulting state, reason, and subsumption decision stay +in `raw/ui-actions.json`. Within that frontier, the same location and exact +control key/state execute once; later identical instances are retained as +explicit deduplicated entries. Repeated controls preserve the distinction +between one instance and two-or-more instances. Sort order changes are proved +but permutations do not recursively create a factorial frontier. Changed +checked, expanded, pressed, value, and disabled states are separate signatures. +A successful action must +prove an observable DOM, state, storage, URL, media, network, dialog, download, +popup, or clipboard effect. Reaching either limit is a coverage failure, never +a pass. + +Browser page, visual, video, and throttled performance checks cover mobile, +tablet, desktop, and TV viewports. Visual parity requires matching visible +semantic structure and no more than 2% changed pixels. Video checks exercise +MP4, HLS, stall detection, decoded dimensions, playback advance, and dropped +frames. Performance cases use 4x CPU throttling and enforce frame, long-task, +runtime-error, LCP, and CLS budgets. + +Default mode is deliberately strict. Existing source files over 150 lines, +lint/type/build failures, uncaught browser errors, severe accessibility +violations, API contract failures, deployment drift, and threshold breaches +produce a non-zero exit code. Generated reports and third-party files are not +source code and are excluded from the 150-line source policy. + +The suite cannot prove the absence of every defect. It reports exactly what it +enumerated, what it executed, what it skipped, and why. A green result means all +declared checks passed, not that arbitrary undiscovered states are impossible. diff --git a/verification/eslint.config.mjs b/verification/eslint.config.mjs new file mode 100644 index 0000000..c807871 --- /dev/null +++ b/verification/eslint.config.mjs @@ -0,0 +1,23 @@ +import js from '@eslint/js'; +import globals from 'globals'; + +const config = [ + js.configs.recommended, + { + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { ...globals.node, ...globals.browser }, + }, + rules: { + 'no-console': 'error', + 'no-eval': 'error', + 'no-implied-eval': 'error', + 'no-new-func': 'error', + 'no-empty': ['error', { allowEmptyCatch: true }], + 'no-warning-comments': ['warn', { terms: ['todo', 'fixme'], location: 'anywhere' }], + }, + }, +]; + +export default config; diff --git a/verification/history/baseline.json b/verification/history/baseline.json new file mode 100644 index 0000000..2be2311 --- /dev/null +++ b/verification/history/baseline.json @@ -0,0 +1,9 @@ +{ + "issues": {"count": 135, "sha256": "7c40774d474cc865e86962552d1cddcbb0582e29a6f913f2e79eba5f37fdbfc8"}, + "pullRequests": {"count": 59, "sha256": "c00a1141e80aee7d18625b07fe17ad8ad1d8597c7f3843a3b78d58fba4f67eed"}, + "conversationComments": {"count": 394, "sha256": "3965e2d955c58aca173bf607527292530957e12f8ef8b483e382e5a041113978"}, + "reviewComments": {"count": 124, "sha256": "0afb122dba2c5922ce7536364dea19510e275231a4088e8627cb1f57fab9fd9a"}, + "reviews": {"count": 49, "sha256": "de58e38361c13e1e1863f5f49289cc8a93cf9010727bbc5653328e5961e7c299"}, + "reviewThreads": {"count": 103, "sha256": "fc84f3f95a30b3a91ba538e2a084085b658181c98aa7f322eaf366bdd77423ad"}, + "combinedSha256": "4157e3960e30ee110cc3029144d90dfb433422c0f36b20722a395513d959de6e" +} diff --git a/verification/history/catalog.json b/verification/history/catalog.json new file mode 100644 index 0000000..df037b4 --- /dev/null +++ b/verification/history/catalog.json @@ -0,0 +1,23 @@ +{ + "repository": "KuekHaoYang/KVideo", + "auditedAt": "2026-08-01", + "issueCutoff": 228, + "pullRequestCutoff": 236, + "issues": [1,2,3,7,8,9,10,11,12,13,15,16,18,19,20,21,22,23,24,25,26,27,28,32,33,34,35,36,37,40,41,44,45,46,48,50,55,58,60,61,62,64,65,66,68,69,70,72,74,76,77,78,79,80,81,82,86,91,92,95,96,98,99,103,104,105,106,107,108,110,111,114,115,116,117,118,119,122,124,126,127,129,130,132,133,134,135,140,141,142,143,144,146,147,148,149,150,151,152,153,158,159,169,172,173,174,175,176,177,179,182,186,187,188,190,191,193,194,195,199,200,202,203,204,205,206,207,210,215,217,218,220,224,226,228], + "pullRequests": [5,6,14,17,29,38,39,42,43,47,49,51,52,56,59,67,71,75,85,90,113,125,128,131,136,137,138,139,156,157,160,161,162,163,178,189,192,196,197,198,201,209,211,213,214,216,219,221,222,225,227,229,230,231,232,233,234,235,236], + "regressionIssues": [3,7,8,10,11,12,15,16,20,21,24,25,32,34,37,40,41,45,46,50,62,64,66,69,70,78,79,80,81,86,91,104,105,106,110,114,117,118,119,127,130,140,142,143,144,146,147,149,150,152,153,159,172,173,174,176,179,182,186,190,195,199,200,202,203,204,206,207,210,215,217,218,220,224,226,228], + "mergedPullRequests": [5,6,17,29,42,43,47,49,51,59,90,128,136,137,138,139,156,157,160,161,162,192,198,211,216,221,222,225,227,229,230,231,232,233,234,235], + "unavailablePullRequests": [53,123,145,180,181,184], + "regressionIssueOverrides": [10,79,91,195,226,228], + "unverifiableIssues": [{"number":158,"reason":"The title and body contain only the character 1, with no reproducible behavior, logs, or follow-up context."}], + "evidence": { + "auth-sync": ["verification/tests/regression/auth-credentials.test.ts", "verification/tests/regression/auth-session.test.ts", "verification/tests/regression/password-gate-state.test.ts", "verification/tests/regression/sync-records.test.ts"], + "deployment": ["verification/tests/regression/deployment.test.ts", "verification/tests/regression/lan-access.test.ts", "verification/src/checks/deployment.mjs", "verification/src/checks/docker-local.mjs"], + "platform": ["verification/tests/regression/android-pip-utils.test.ts", "verification/tests/regression/webview83-assets.test.ts", "verification/tests/regression/mobile-player-controls.test.ts"], + "player-media": ["verification/tests/regression/m3u8-ad-detector.test.ts", "verification/tests/regression/player-source-list.test.ts", "verification/tests/regression/resolution-probe-utils.test.ts", "verification/src/checks/video.mjs"], + "search-source": ["verification/tests/regression/search-reliability.test.ts", "verification/tests/regression/tag-management-view.test.ts", "verification/src/checks/api-contracts.mjs", "verification/src/checks/ui-actions.mjs"], + "security-proxy": ["verification/src/checks/proxy.mjs", "verification/src/checks/security-headers.mjs", "verification/src/checks/security-scan.mjs", "verification/src/checks/static-tools.mjs"], + "ui": ["verification/tests/regression/account-actions-view.test.ts", "verification/tests/regression/floating-button-position.test.ts", "verification/src/checks/ui-pages.mjs", "verification/src/checks/visual.mjs"], + "general": ["verification/src/checks/api-contracts.mjs", "verification/src/checks/ui-actions.mjs", "verification/src/checks/static-tools.mjs"] + } +} diff --git a/verification/history/pr-evidence-template.md b/verification/history/pr-evidence-template.md new file mode 100644 index 0000000..35e4229 --- /dev/null +++ b/verification/history/pr-evidence-template.md @@ -0,0 +1,9 @@ +## Local verification evidence + +Historical-Refs: none +Regression-Evidence: verification/tests/regression/.test.ts +Regression-Evidence-Reason: Explain why unchanged evidence directly covers this change, when applicable. + +Replace `none` with comma-separated `#` or `PR #` references +when the local history catalog identifies relevant records. Every referenced +record must have a direct `GH-ISSUE` or `GH-PR` tag in an allowed evidence file. diff --git a/verification/history/review-comment-decisions.json b/verification/history/review-comment-decisions.json new file mode 100644 index 0000000..1aaafb7 --- /dev/null +++ b/verification/history/review-comment-decisions.json @@ -0,0 +1,18 @@ +[ + {"id":"PRRC_kwDOQWhk_86kXUFt","pr":53,"priority":"critical","status":"fixed","contract":"typescript-config","reason":"The reviewed PR is unavailable, while current tsconfig.json is a valid compiler configuration and the authoritative TypeScript check guards it."}, + {"id":"PRRC_kwDOQWhk_86wUdVG","pr":123,"priority":"critical","status":"fixed","contract":"next-route","reason":"The reviewed PR is unavailable and the current route declares runtime exactly once; TypeScript and production builds guard duplicate declarations."}, + {"id":"PRRC_kwDOQWhk_861aFoo","pr":145,"priority":"medium","status":"fixed","contract":"navigation","reason":"The current favorites navigation link includes data-focusable and browser UI checks exercise focusable controls."}, + {"id":"PRRC_kwDOQWhk_861aFos","pr":145,"priority":"medium","status":"fixed","contract":"favorites","reason":"FavoritesGrid currently imports useMemo."}, + {"id":"PRRC_kwDOQWhk_861aFo8","pr":145,"priority":"medium","status":"fixed","contract":"favorites","reason":"FavoritesGrid currently memoizes the FavoriteItem-to-Video transformation by favorites identity."}, + {"id":"PRRC_kwDOQWhk_861aFpB","pr":145,"priority":"medium","status":"fixed","contract":"favorites","reason":"Normal and premium favorites routes now delegate to the shared FavoritesPageContent component."}, + {"id":"PRRC_kwDOQWhk_86_GmQI","pr":180,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed PR is unavailable and its 1.json artifact is absent from the current repository, so those mixed-content entries are not shipped."}, + {"id":"PRRC_kwDOQWhk_86_GmQN","pr":180,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed 1.json artifact is absent from the current repository; its identifier naming cannot affect runtime state."}, + {"id":"PRRC_kwDOQWhk_86_GmQS","pr":180,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed 1.json artifact is absent from the current repository; its identifier spelling cannot affect runtime state."}, + {"id":"PRRC_kwDOQWhk_86_GmQX","pr":180,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed 1.json artifact and duplicate source list are absent from the current repository."}, + {"id":"PRRC_kwDOQWhk_86_GmWO","pr":181,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed PR is unavailable and no generic 1.json source catalog is shipped in the current repository."}, + {"id":"PRRC_kwDOQWhk_86_GmWR","pr":181,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed 1.json artifact is absent from the current repository, so its HTTP endpoints are not shipped."}, + {"id":"PRRC_kwDOQWhk_87AFPP1","pr":184,"priority":"high","status":"dismissed","contract":"source-config","reason":"The reviewed PR is unavailable and its 1.json baseUrl definitions are absent from the current repository."}, + {"id":"PRRC_kwDOQWhk_87AFPP5","pr":184,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed generic file is absent from the current repository."}, + {"id":"PRRC_kwDOQWhk_87AFPP8","pr":184,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed 1.json artifact is absent; current source identifiers are explicit application configuration rather than that proposal."}, + {"id":"PRRC_kwDOQWhk_87AFPP_","pr":184,"priority":"medium","status":"dismissed","contract":"source-config","reason":"The reviewed duplicate 1.json entries are absent from the current repository."} +] diff --git a/verification/history/review-decisions.json b/verification/history/review-decisions.json new file mode 100644 index 0000000..7f5edba --- /dev/null +++ b/verification/history/review-decisions.json @@ -0,0 +1,35 @@ +[ + {"id":"PRRT_kwDOQWhk_85nQ-fI","pr":6,"priority":"medium","status":"open","contract":"cards","reason":"Fallback poster still uses a separate rendering branch and lacks the primary image hover behavior."}, + {"id":"PRRT_kwDOQWhk_85na0j1","pr":17,"priority":"medium","status":"open","contract":"cards","reason":"MovieCard title container still has vertical padding only."}, + {"id":"PRRT_kwDOQWhk_85na0j5","pr":17,"priority":"medium","status":"fixed","contract":"cards","reason":"VideoCard information container currently uses p-3."}, + {"id":"PRRT_kwDOQWhk_85na0j6","pr":17,"priority":"medium","status":"fixed","contract":"cards","reason":"VideoCard title currently restores min-h-[2.5rem]."}, + {"id":"PRRT_kwDOQWhk_85nzS0b","pr":29,"priority":"medium","status":"fixed","contract":"branding","reason":"The default site description is now the short 视频聚合平台 string."}, + {"id":"PRRT_kwDOQWhk_85nzS0c","pr":29,"priority":"medium","status":"fixed","contract":"branding","reason":"The unused accessor function and getter-based configuration no longer exist."}, + {"id":"PRRT_kwDOQWhk_85pqYkA","pr":47,"priority":"critical","status":"dismissed","contract":"dependencies","reason":"glob-parent 5.1.2 is the patched boundary for CVE-2021-35065; npm audit remains authoritative."}, + {"id":"PRRT_kwDOQWhk_85wUpDZ","pr":90,"priority":"high","status":"open","contract":"cloud-sync","reason":"Subscriptions are registered without waiting for the initial cloud pull."}, + {"id":"PRRT_kwDOQWhk_85wUpDb","pr":90,"priority":"high","status":"open","contract":"cloud-sync","reason":"Cloud-sync GET parses JSON without first checking response.ok."}, + {"id":"PRRT_kwDOQWhk_85wUpDe","pr":90,"priority":"high","status":"open","contract":"cloud-sync","reason":"Empty remote arrays do not clear existing local history and favorites."}, + {"id":"PRRT_kwDOQWhk_85wUpDi","pr":90,"priority":"high","status":"open","contract":"cloud-sync","reason":"Cloud-sync POST does not check response.ok."}, + {"id":"PRRT_kwDOQWhk_85wUpDj","pr":90,"priority":"medium","status":"open","contract":"cloud-sync","reason":"The sync API persists undefined history or favorites fields without schema defaults."}, + {"id":"PRRT_kwDOQWhk_85wUpDr","pr":90,"priority":"medium","status":"fixed","contract":"cloud-sync","reason":"The debounce helper now uses generics and ReturnType."}, + {"id":"PRRT_kwDOQWhk_8527gmY","pr":128,"priority":"medium","status":"fixed","contract":"runtime-config","reason":"Runtime danmaku configuration now checks hasStoredAppSetting before applying defaults."}, + {"id":"PRRT_kwDOQWhk_854fAdu","pr":136,"priority":"medium","status":"open","contract":"settings","reason":"Settings handlers still repeat read-spread-save operations."}, + {"id":"PRRT_kwDOQWhk_854fAd2","pr":136,"priority":"medium","status":"open","contract":"settings","reason":"The controlled custom seek field still refuses an intermediate empty value."}, + {"id":"PRRT_kwDOQWhk_854fUF3","pr":137,"priority":"medium","status":"fixed","contract":"videotogether","reason":"VideoTogether now assigns window state and injects a script element instead of interpolating inline script text."}, + {"id":"PRRT_kwDOQWhk_854fiht","pr":138,"priority":"medium","status":"open","contract":"fullscreen","reason":"Web-fullscreen stage sizing still hardcodes a 16:9 aspect ratio."}, + {"id":"PRRT_kwDOQWhk_854frlV","pr":139,"priority":"medium","status":"fixed","contract":"android-tv","reason":"The URL field now handles IME confirmation and Enter keys."}, + {"id":"PRRT_kwDOQWhk_854frld","pr":139,"priority":"medium","status":"open","contract":"android-tv","reason":"MainActivity still overrides deprecated onBackPressed instead of using OnBackPressedDispatcher."}, + {"id":"PRRT_kwDOQWhk_854frlg","pr":139,"priority":"medium","status":"open","contract":"android-tv","reason":"android:maxWidth remains on a LinearLayout where it is not an effective width constraint."}, + {"id":"PRRT_kwDOQWhk_857KrxU","pr":157,"priority":"critical","status":"dismissed","contract":"next-route","reason":"For the installed Next.js generation, generated route types require params as a Promise; TypeScript and production build verify it."}, + {"id":"PRRT_kwDOQWhk_857W0Em","pr":160,"priority":"high","status":"open","contract":"resolution","reason":"Resolution probing still accepts a 100-item batch without a documented provider-budget proof."}, + {"id":"PRRT_kwDOQWhk_857W0E0","pr":160,"priority":"medium","status":"open","contract":"resolution","reason":"Manifest hint scanning still walks every media-playlist line."}, + {"id":"PRRT_kwDOQWhk_857W_-W","pr":161,"priority":"medium","status":"open","contract":"resolution","reason":"Numeric resolution regexes still differ and hd720 can match inside longer identifiers."}, + {"id":"PRRT_kwDOQWhk_857W_-l","pr":161,"priority":"medium","status":"open","contract":"resolution","reason":"Resolution keyword tables remain duplicated across two modules."}, + {"id":"PRRT_kwDOQWhk_857Xhh9","pr":162,"priority":"medium","status":"open","contract":"android-tv","reason":"PiP change dispatch still uses lateinit webView without an initialization guard."}, + {"id":"PRRT_kwDOQWhk_857XhiC","pr":162,"priority":"medium","status":"open","contract":"android-tv","reason":"PiP entry does not reject calls while the Activity is finishing."}, + {"id":"PRRT_kwDOQWhk_86NJ3bv","pr":198,"priority":"medium","status":"open","contract":"video-card","reason":"The source badge can still occupy 100% width beneath the favorite action."}, + {"id":"PRRT_kwDOQWhk_86NJ3bx","pr":198,"priority":"medium","status":"open","contract":"video-card","reason":"Latency rendering still checks only undefined and can pass null through."}, + {"id":"PRRT_kwDOQWhk_86QZpa0","pr":211,"priority":"critical","status":"fixed","contract":"latency","reason":"The polling effect now resets mountedRef.current to true whenever it starts."}, + {"id":"PRRT_kwDOQWhk_86QZpa4","pr":211,"priority":"high","status":"open","contract":"latency","reason":"stableSourceUrls still depends on raw array identity instead of source content."}, + {"id":"PRRT_kwDOQWhk_86QZpa9","pr":211,"priority":"medium","status":"open","contract":"latency","reason":"A thrown probe still rejects the entire worker pool."} +] diff --git a/verification/package-lock.json b/verification/package-lock.json new file mode 100644 index 0000000..7b7a10a --- /dev/null +++ b/verification/package-lock.json @@ -0,0 +1 @@ +{"name":"kvideo-strict-verification","version":"1.0.0","lockfileVersion":3,"requires":true,"packages":{"":{"name":"kvideo-strict-verification","version":"1.0.0","dependencies":{"@eslint/js":"10.0.1","@typescript-eslint/typescript-estree":"8.65.0","axe-core":"4.12.1","c8":"12.0.0","esbuild":"0.28.1","eslint":"10.8.0","globals":"17.8.0","jscpd":"5.0.14","pixelmatch":"7.2.0","playwright":"1.62.1","pngjs":"7.0.0","wrangler":"4.118.0"}},"node_modules/@bcoe/v8-coverage":{"version":"1.0.2","resolved":"https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz","integrity":"sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==","license":"MIT","engines":{"node":">=18"}},"node_modules/@cloudflare/kv-asset-handler":{"version":"0.5.0","resolved":"https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz","integrity":"sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==","license":"MIT OR Apache-2.0","engines":{"node":">=22.0.0"}},"node_modules/@cloudflare/unenv-preset":{"version":"2.16.1","resolved":"https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz","integrity":"sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==","license":"MIT OR Apache-2.0","peerDependencies":{"unenv":"2.0.0-rc.24","workerd":">1.20260305.0 <2.0.0-0"},"peerDependenciesMeta":{"workerd":{"optional":true}}},"node_modules/@cloudflare/workerd-darwin-64":{"version":"1.20260730.1","resolved":"https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260730.1.tgz","integrity":"sha512-+MBHmPaiTe2KajryW0T24rZvWFxb41hD3d8anNzQqHzft6vSEb18+sp0znSwxgij7ApPhSM1+vhkNg4f3YMguA==","cpu":["x64"],"license":"Apache-2.0","optional":true,"os":["darwin"],"engines":{"node":">=16"}},"node_modules/@cloudflare/workerd-darwin-arm64":{"version":"1.20260730.1","resolved":"https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260730.1.tgz","integrity":"sha512-SBHKntPkKvNPgaCrTe99xC1CAl8ygJDzlYfK0LbuJ1muKadIw35WnhO0wu894fKBtllsVQdNzDLee+cm0ppLSQ==","cpu":["arm64"],"license":"Apache-2.0","optional":true,"os":["darwin"],"engines":{"node":">=16"}},"node_modules/@cloudflare/workerd-linux-64":{"version":"1.20260730.1","resolved":"https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260730.1.tgz","integrity":"sha512-ouyPOSMbiKPeSwUJUvxtMcxGAXs2J4aPE4T5ABIYX5ClcQx5j5bbHTmnqOQEY8sAuLTPjH7dY+iB6UI5ISlwwA==","cpu":["x64"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=16"}},"node_modules/@cloudflare/workerd-linux-arm64":{"version":"1.20260730.1","resolved":"https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260730.1.tgz","integrity":"sha512-YQ+Mi78U3TPdgBPtwq+Sm6rJU+Ihl2y0pjYtuuKkdmUbYzL7oLR6Xqq9wljhasnuCFICssDJaqhMep5WizYoEQ==","cpu":["arm64"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=16"}},"node_modules/@cloudflare/workerd-windows-64":{"version":"1.20260730.1","resolved":"https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260730.1.tgz","integrity":"sha512-27fAN+vUECW1oYVc1KOcHYpkL8COM2Uxtxql7TL595kxbjoqS5yckw7NLz7bTf2pALFCZWjqXDjZGJ/xbG4ZKQ==","cpu":["x64"],"license":"Apache-2.0","optional":true,"os":["win32"],"engines":{"node":">=16"}},"node_modules/@cspotcode/source-map-support":{"version":"0.8.1","resolved":"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz","integrity":"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==","license":"MIT","dependencies":{"@jridgewell/trace-mapping":"0.3.9"},"engines":{"node":">=12"}},"node_modules/@emnapi/runtime":{"version":"1.11.3","resolved":"https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz","integrity":"sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==","license":"MIT","optional":true,"dependencies":{"tslib":"^2.4.0"}},"node_modules/@esbuild/aix-ppc64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz","integrity":"sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==","cpu":["ppc64"],"license":"MIT","optional":true,"os":["aix"],"engines":{"node":">=18"}},"node_modules/@esbuild/android-arm":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz","integrity":"sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==","cpu":["arm"],"license":"MIT","optional":true,"os":["android"],"engines":{"node":">=18"}},"node_modules/@esbuild/android-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz","integrity":"sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==","cpu":["arm64"],"license":"MIT","optional":true,"os":["android"],"engines":{"node":">=18"}},"node_modules/@esbuild/android-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz","integrity":"sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==","cpu":["x64"],"license":"MIT","optional":true,"os":["android"],"engines":{"node":">=18"}},"node_modules/@esbuild/darwin-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz","integrity":"sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==","cpu":["arm64"],"license":"MIT","optional":true,"os":["darwin"],"engines":{"node":">=18"}},"node_modules/@esbuild/darwin-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz","integrity":"sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==","cpu":["x64"],"license":"MIT","optional":true,"os":["darwin"],"engines":{"node":">=18"}},"node_modules/@esbuild/freebsd-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz","integrity":"sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==","cpu":["arm64"],"license":"MIT","optional":true,"os":["freebsd"],"engines":{"node":">=18"}},"node_modules/@esbuild/freebsd-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz","integrity":"sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==","cpu":["x64"],"license":"MIT","optional":true,"os":["freebsd"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-arm":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz","integrity":"sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==","cpu":["arm"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz","integrity":"sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==","cpu":["arm64"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-ia32":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz","integrity":"sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==","cpu":["ia32"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-loong64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz","integrity":"sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==","cpu":["loong64"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-mips64el":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz","integrity":"sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==","cpu":["mips64el"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-ppc64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz","integrity":"sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==","cpu":["ppc64"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-riscv64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz","integrity":"sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==","cpu":["riscv64"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-s390x":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz","integrity":"sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==","cpu":["s390x"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/linux-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz","integrity":"sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==","cpu":["x64"],"license":"MIT","optional":true,"os":["linux"],"engines":{"node":">=18"}},"node_modules/@esbuild/netbsd-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz","integrity":"sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==","cpu":["arm64"],"license":"MIT","optional":true,"os":["netbsd"],"engines":{"node":">=18"}},"node_modules/@esbuild/netbsd-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz","integrity":"sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==","cpu":["x64"],"license":"MIT","optional":true,"os":["netbsd"],"engines":{"node":">=18"}},"node_modules/@esbuild/openbsd-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz","integrity":"sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==","cpu":["arm64"],"license":"MIT","optional":true,"os":["openbsd"],"engines":{"node":">=18"}},"node_modules/@esbuild/openbsd-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz","integrity":"sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==","cpu":["x64"],"license":"MIT","optional":true,"os":["openbsd"],"engines":{"node":">=18"}},"node_modules/@esbuild/openharmony-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz","integrity":"sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==","cpu":["arm64"],"license":"MIT","optional":true,"os":["openharmony"],"engines":{"node":">=18"}},"node_modules/@esbuild/sunos-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz","integrity":"sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==","cpu":["x64"],"license":"MIT","optional":true,"os":["sunos"],"engines":{"node":">=18"}},"node_modules/@esbuild/win32-arm64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz","integrity":"sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==","cpu":["arm64"],"license":"MIT","optional":true,"os":["win32"],"engines":{"node":">=18"}},"node_modules/@esbuild/win32-ia32":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz","integrity":"sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==","cpu":["ia32"],"license":"MIT","optional":true,"os":["win32"],"engines":{"node":">=18"}},"node_modules/@esbuild/win32-x64":{"version":"0.28.1","resolved":"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz","integrity":"sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==","cpu":["x64"],"license":"MIT","optional":true,"os":["win32"],"engines":{"node":">=18"}},"node_modules/@eslint-community/eslint-utils":{"version":"4.10.1","resolved":"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz","integrity":"sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==","license":"MIT","dependencies":{"eslint-visitor-keys":"^3.4.3"},"engines":{"node":"^12.22.0 || ^14.17.0 || >=16.0.0"},"funding":{"url":"https://opencollective.com/eslint"},"peerDependencies":{"eslint":"^6.0.0 || ^7.0.0 || >=8.0.0"}},"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys":{"version":"3.4.3","resolved":"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz","integrity":"sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==","license":"Apache-2.0","engines":{"node":"^12.22.0 || ^14.17.0 || >=16.0.0"},"funding":{"url":"https://opencollective.com/eslint"}},"node_modules/@eslint-community/regexpp":{"version":"4.12.2","resolved":"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz","integrity":"sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==","license":"MIT","engines":{"node":"^12.0.0 || ^14.0.0 || >=16.0.0"}},"node_modules/@eslint/config-array":{"version":"0.23.5","resolved":"https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz","integrity":"sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==","license":"Apache-2.0","dependencies":{"@eslint/object-schema":"^3.0.5","debug":"^4.3.1","minimatch":"^10.2.4"},"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"}},"node_modules/@eslint/config-helpers":{"version":"0.7.0","resolved":"https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz","integrity":"sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==","license":"Apache-2.0","dependencies":{"@eslint/core":"^1.2.1"},"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"}},"node_modules/@eslint/core":{"version":"1.2.1","resolved":"https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz","integrity":"sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==","license":"Apache-2.0","dependencies":{"@types/json-schema":"^7.0.15"},"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"}},"node_modules/@eslint/js":{"version":"10.0.1","resolved":"https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz","integrity":"sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==","license":"MIT","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"funding":{"url":"https://eslint.org/donate"},"peerDependencies":{"eslint":"^10.0.0"},"peerDependenciesMeta":{"eslint":{"optional":true}}},"node_modules/@eslint/object-schema":{"version":"3.0.5","resolved":"https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz","integrity":"sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==","license":"Apache-2.0","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"}},"node_modules/@eslint/plugin-kit":{"version":"0.7.2","resolved":"https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz","integrity":"sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==","license":"Apache-2.0","dependencies":{"@eslint/core":"^1.2.1","levn":"^0.4.1"},"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"}},"node_modules/@humanfs/core":{"version":"0.19.2","resolved":"https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz","integrity":"sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==","license":"Apache-2.0","dependencies":{"@humanfs/types":"^0.15.0"},"engines":{"node":">=18.18.0"}},"node_modules/@humanfs/node":{"version":"0.16.8","resolved":"https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz","integrity":"sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==","license":"Apache-2.0","dependencies":{"@humanfs/core":"^0.19.2","@humanfs/types":"^0.15.0","@humanwhocodes/retry":"^0.4.0"},"engines":{"node":">=18.18.0"}},"node_modules/@humanfs/types":{"version":"0.15.0","resolved":"https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz","integrity":"sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==","license":"Apache-2.0","engines":{"node":">=18.18.0"}},"node_modules/@humanwhocodes/module-importer":{"version":"1.0.1","resolved":"https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz","integrity":"sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==","license":"Apache-2.0","engines":{"node":">=12.22"},"funding":{"type":"github","url":"https://github.com/sponsors/nzakas"}},"node_modules/@humanwhocodes/retry":{"version":"0.4.3","resolved":"https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz","integrity":"sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==","license":"Apache-2.0","engines":{"node":">=18.18"},"funding":{"type":"github","url":"https://github.com/sponsors/nzakas"}},"node_modules/@img/colour":{"version":"1.1.0","resolved":"https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz","integrity":"sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==","license":"MIT","engines":{"node":">=18"}},"node_modules/@img/sharp-darwin-arm64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.2.tgz","integrity":"sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==","cpu":["arm64"],"license":"Apache-2.0","optional":true,"os":["darwin"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-darwin-arm64":"1.3.1"}},"node_modules/@img/sharp-darwin-x64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.2.tgz","integrity":"sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==","cpu":["x64"],"license":"Apache-2.0","optional":true,"os":["darwin"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-darwin-x64":"1.3.1"}},"node_modules/@img/sharp-freebsd-wasm32":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.2.tgz","integrity":"sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==","license":"Apache-2.0","optional":true,"os":["freebsd"],"dependencies":{"@img/sharp-wasm32":"0.35.2"},"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-darwin-arm64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.1.tgz","integrity":"sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==","cpu":["arm64"],"license":"LGPL-3.0-or-later","optional":true,"os":["darwin"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-darwin-x64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.1.tgz","integrity":"sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==","cpu":["x64"],"license":"LGPL-3.0-or-later","optional":true,"os":["darwin"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linux-arm":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.1.tgz","integrity":"sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==","cpu":["arm"],"libc":["glibc"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linux-arm64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.1.tgz","integrity":"sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==","cpu":["arm64"],"libc":["glibc"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linux-ppc64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.1.tgz","integrity":"sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==","cpu":["ppc64"],"libc":["glibc"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linux-riscv64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.1.tgz","integrity":"sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==","cpu":["riscv64"],"libc":["glibc"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linux-s390x":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.1.tgz","integrity":"sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==","cpu":["s390x"],"libc":["glibc"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linux-x64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.1.tgz","integrity":"sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==","cpu":["x64"],"libc":["glibc"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linuxmusl-arm64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.1.tgz","integrity":"sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==","cpu":["arm64"],"libc":["musl"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-libvips-linuxmusl-x64":{"version":"1.3.1","resolved":"https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.1.tgz","integrity":"sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==","cpu":["x64"],"libc":["musl"],"license":"LGPL-3.0-or-later","optional":true,"os":["linux"],"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-linux-arm":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.2.tgz","integrity":"sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==","cpu":["arm"],"libc":["glibc"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linux-arm":"1.3.1"}},"node_modules/@img/sharp-linux-arm64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.2.tgz","integrity":"sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==","cpu":["arm64"],"libc":["glibc"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linux-arm64":"1.3.1"}},"node_modules/@img/sharp-linux-ppc64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.2.tgz","integrity":"sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==","cpu":["ppc64"],"libc":["glibc"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linux-ppc64":"1.3.1"}},"node_modules/@img/sharp-linux-riscv64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.2.tgz","integrity":"sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==","cpu":["riscv64"],"libc":["glibc"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linux-riscv64":"1.3.1"}},"node_modules/@img/sharp-linux-s390x":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.2.tgz","integrity":"sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==","cpu":["s390x"],"libc":["glibc"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linux-s390x":"1.3.1"}},"node_modules/@img/sharp-linux-x64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.2.tgz","integrity":"sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==","cpu":["x64"],"libc":["glibc"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linux-x64":"1.3.1"}},"node_modules/@img/sharp-linuxmusl-arm64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.2.tgz","integrity":"sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==","cpu":["arm64"],"libc":["musl"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linuxmusl-arm64":"1.3.1"}},"node_modules/@img/sharp-linuxmusl-x64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.2.tgz","integrity":"sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==","cpu":["x64"],"libc":["musl"],"license":"Apache-2.0","optional":true,"os":["linux"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-libvips-linuxmusl-x64":"1.3.1"}},"node_modules/@img/sharp-wasm32":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz","integrity":"sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==","license":"Apache-2.0 AND LGPL-3.0-or-later AND MIT","optional":true,"dependencies":{"@emnapi/runtime":"^1.11.1"},"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-webcontainers-wasm32":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.2.tgz","integrity":"sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==","cpu":["wasm32"],"license":"Apache-2.0","optional":true,"dependencies":{"@img/sharp-wasm32":"0.35.2"},"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-win32-arm64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.2.tgz","integrity":"sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==","cpu":["arm64"],"license":"Apache-2.0 AND LGPL-3.0-or-later","optional":true,"os":["win32"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-win32-ia32":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.2.tgz","integrity":"sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==","cpu":["ia32"],"license":"Apache-2.0 AND LGPL-3.0-or-later","optional":true,"os":["win32"],"engines":{"node":"^20.9.0"},"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@img/sharp-win32-x64":{"version":"0.35.2","resolved":"https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.2.tgz","integrity":"sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==","cpu":["x64"],"license":"Apache-2.0 AND LGPL-3.0-or-later","optional":true,"os":["win32"],"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"}},"node_modules/@istanbuljs/schema":{"version":"0.1.6","resolved":"https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz","integrity":"sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==","license":"MIT","engines":{"node":">=8"}},"node_modules/@jridgewell/resolve-uri":{"version":"3.1.2","resolved":"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz","integrity":"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==","license":"MIT","engines":{"node":">=6.0.0"}},"node_modules/@jridgewell/sourcemap-codec":{"version":"1.5.5","resolved":"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz","integrity":"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==","license":"MIT"},"node_modules/@jridgewell/trace-mapping":{"version":"0.3.9","resolved":"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz","integrity":"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==","license":"MIT","dependencies":{"@jridgewell/resolve-uri":"^3.0.3","@jridgewell/sourcemap-codec":"^1.4.10"}},"node_modules/@poppinss/colors":{"version":"4.1.6","resolved":"https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz","integrity":"sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==","license":"MIT","dependencies":{"kleur":"^4.1.5"}},"node_modules/@poppinss/dumper":{"version":"0.6.5","resolved":"https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz","integrity":"sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==","license":"MIT","dependencies":{"@poppinss/colors":"^4.1.5","@sindresorhus/is":"^7.0.2","supports-color":"^10.0.0"}},"node_modules/@poppinss/exception":{"version":"1.2.3","resolved":"https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz","integrity":"sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==","license":"MIT"},"node_modules/@sindresorhus/is":{"version":"7.2.0","resolved":"https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz","integrity":"sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==","license":"MIT","engines":{"node":">=18"},"funding":{"url":"https://github.com/sindresorhus/is?sponsor=1"}},"node_modules/@speed-highlight/core":{"version":"1.2.17","resolved":"https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz","integrity":"sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==","license":"CC0-1.0"},"node_modules/@types/esrecurse":{"version":"4.3.1","resolved":"https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz","integrity":"sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==","license":"MIT"},"node_modules/@types/estree":{"version":"1.0.9","resolved":"https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz","integrity":"sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==","license":"MIT"},"node_modules/@types/istanbul-lib-coverage":{"version":"2.0.6","resolved":"https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz","integrity":"sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==","license":"MIT"},"node_modules/@types/json-schema":{"version":"7.0.15","resolved":"https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz","integrity":"sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==","license":"MIT"},"node_modules/@typescript-eslint/project-service":{"version":"8.65.0","resolved":"https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz","integrity":"sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==","license":"MIT","dependencies":{"@typescript-eslint/tsconfig-utils":"^8.65.0","@typescript-eslint/types":"^8.65.0","debug":"^4.4.3"},"engines":{"node":"^18.18.0 || ^20.9.0 || >=21.1.0"},"funding":{"type":"opencollective","url":"https://opencollective.com/typescript-eslint"},"peerDependencies":{"typescript":">=4.8.4 <6.1.0"}},"node_modules/@typescript-eslint/tsconfig-utils":{"version":"8.65.0","resolved":"https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz","integrity":"sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==","license":"MIT","engines":{"node":"^18.18.0 || ^20.9.0 || >=21.1.0"},"funding":{"type":"opencollective","url":"https://opencollective.com/typescript-eslint"},"peerDependencies":{"typescript":">=4.8.4 <6.1.0"}},"node_modules/@typescript-eslint/types":{"version":"8.65.0","resolved":"https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz","integrity":"sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==","license":"MIT","engines":{"node":"^18.18.0 || ^20.9.0 || >=21.1.0"},"funding":{"type":"opencollective","url":"https://opencollective.com/typescript-eslint"}},"node_modules/@typescript-eslint/typescript-estree":{"version":"8.65.0","resolved":"https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz","integrity":"sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==","license":"MIT","dependencies":{"@typescript-eslint/project-service":"8.65.0","@typescript-eslint/tsconfig-utils":"8.65.0","@typescript-eslint/types":"8.65.0","@typescript-eslint/visitor-keys":"8.65.0","debug":"^4.4.3","minimatch":"^10.2.2","semver":"^7.7.3","tinyglobby":"^0.2.15","ts-api-utils":"^2.5.0"},"engines":{"node":"^18.18.0 || ^20.9.0 || >=21.1.0"},"funding":{"type":"opencollective","url":"https://opencollective.com/typescript-eslint"},"peerDependencies":{"typescript":">=4.8.4 <6.1.0"}},"node_modules/@typescript-eslint/visitor-keys":{"version":"8.65.0","resolved":"https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz","integrity":"sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==","license":"MIT","dependencies":{"@typescript-eslint/types":"8.65.0","eslint-visitor-keys":"^5.0.0"},"engines":{"node":"^18.18.0 || ^20.9.0 || >=21.1.0"},"funding":{"type":"opencollective","url":"https://opencollective.com/typescript-eslint"}},"node_modules/acorn":{"version":"8.18.0","resolved":"https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz","integrity":"sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==","license":"MIT","bin":{"acorn":"bin/acorn"},"engines":{"node":">=0.4.0"}},"node_modules/acorn-jsx":{"version":"5.3.2","resolved":"https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz","integrity":"sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==","license":"MIT","peerDependencies":{"acorn":"^6.0.0 || ^7.0.0 || ^8.0.0"}},"node_modules/ajv":{"version":"6.15.0","resolved":"https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz","integrity":"sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==","license":"MIT","dependencies":{"fast-deep-equal":"^3.1.1","fast-json-stable-stringify":"^2.0.0","json-schema-traverse":"^0.4.1","uri-js":"^4.2.2"},"funding":{"type":"github","url":"https://github.com/sponsors/epoberezkin"}},"node_modules/ansi-regex":{"version":"6.2.2","resolved":"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz","integrity":"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==","license":"MIT","engines":{"node":">=12"},"funding":{"url":"https://github.com/chalk/ansi-regex?sponsor=1"}},"node_modules/ansi-styles":{"version":"6.2.3","resolved":"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz","integrity":"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==","license":"MIT","engines":{"node":">=12"},"funding":{"url":"https://github.com/chalk/ansi-styles?sponsor=1"}},"node_modules/axe-core":{"version":"4.12.1","resolved":"https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz","integrity":"sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==","license":"MPL-2.0","engines":{"node":">=4"}},"node_modules/balanced-match":{"version":"4.0.4","resolved":"https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz","integrity":"sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==","license":"MIT","engines":{"node":"18 || 20 || >=22"}},"node_modules/blake3-wasm":{"version":"2.1.5","resolved":"https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz","integrity":"sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==","license":"MIT"},"node_modules/brace-expansion":{"version":"5.0.9","resolved":"https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz","integrity":"sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==","license":"MIT","dependencies":{"balanced-match":"^4.0.2"},"engines":{"node":"20 || >=22"}},"node_modules/c8":{"version":"12.0.0","resolved":"https://registry.npmjs.org/c8/-/c8-12.0.0.tgz","integrity":"sha512-4zpJvrd1nKWutnnKC2pXkFmb6iM1l+ffN//o1CzlTNwW7GSOs9a1xrLqkC48nU8oEkjmPZLPiwMsIaOvoF4Pqg==","license":"ISC","dependencies":{"@bcoe/v8-coverage":"^1.0.1","@istanbuljs/schema":"^0.1.3","find-up":"^5.0.0","foreground-child":"^3.1.1","istanbul-lib-coverage":"^3.2.0","istanbul-lib-report":"^3.0.1","istanbul-reports":"^3.1.6","test-exclude":"^8.0.0","v8-to-istanbul":"^9.0.0","yargs":"^18.0.0","yargs-parser":"^21.1.1"},"bin":{"c8":"bin/c8.js"},"engines":{"node":"^20.19.0 || ^22.12.0 || >=23"},"peerDependencies":{"monocart-coverage-reports":"^2"},"peerDependenciesMeta":{"monocart-coverage-reports":{"optional":true}}},"node_modules/cliui":{"version":"9.0.1","resolved":"https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz","integrity":"sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==","license":"ISC","dependencies":{"string-width":"^7.2.0","strip-ansi":"^7.1.0","wrap-ansi":"^9.0.0"},"engines":{"node":">=20"}},"node_modules/cliui/node_modules/string-width":{"version":"7.2.0","resolved":"https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz","integrity":"sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==","license":"MIT","dependencies":{"emoji-regex":"^10.3.0","get-east-asian-width":"^1.0.0","strip-ansi":"^7.1.0"},"engines":{"node":">=18"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/convert-source-map":{"version":"2.0.0","resolved":"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz","integrity":"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==","license":"MIT"},"node_modules/cookie":{"version":"1.1.1","resolved":"https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz","integrity":"sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==","license":"MIT","engines":{"node":">=18"},"funding":{"type":"opencollective","url":"https://opencollective.com/express"}},"node_modules/cross-spawn":{"version":"7.0.6","resolved":"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz","integrity":"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==","license":"MIT","dependencies":{"path-key":"^3.1.0","shebang-command":"^2.0.0","which":"^2.0.1"},"engines":{"node":">= 8"}},"node_modules/debug":{"version":"4.4.3","resolved":"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz","integrity":"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==","license":"MIT","dependencies":{"ms":"^2.1.3"},"engines":{"node":">=6.0"},"peerDependenciesMeta":{"supports-color":{"optional":true}}},"node_modules/deep-is":{"version":"0.1.4","resolved":"https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz","integrity":"sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==","license":"MIT"},"node_modules/detect-libc":{"version":"2.1.2","resolved":"https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz","integrity":"sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==","license":"Apache-2.0","engines":{"node":">=8"}},"node_modules/emoji-regex":{"version":"10.6.0","resolved":"https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz","integrity":"sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==","license":"MIT"},"node_modules/error-stack-parser-es":{"version":"1.0.5","resolved":"https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz","integrity":"sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==","license":"MIT","funding":{"url":"https://github.com/sponsors/antfu"}},"node_modules/esbuild":{"version":"0.28.1","resolved":"https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz","integrity":"sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==","hasInstallScript":true,"license":"MIT","bin":{"esbuild":"bin/esbuild"},"engines":{"node":">=18"},"optionalDependencies":{"@esbuild/aix-ppc64":"0.28.1","@esbuild/android-arm":"0.28.1","@esbuild/android-arm64":"0.28.1","@esbuild/android-x64":"0.28.1","@esbuild/darwin-arm64":"0.28.1","@esbuild/darwin-x64":"0.28.1","@esbuild/freebsd-arm64":"0.28.1","@esbuild/freebsd-x64":"0.28.1","@esbuild/linux-arm":"0.28.1","@esbuild/linux-arm64":"0.28.1","@esbuild/linux-ia32":"0.28.1","@esbuild/linux-loong64":"0.28.1","@esbuild/linux-mips64el":"0.28.1","@esbuild/linux-ppc64":"0.28.1","@esbuild/linux-riscv64":"0.28.1","@esbuild/linux-s390x":"0.28.1","@esbuild/linux-x64":"0.28.1","@esbuild/netbsd-arm64":"0.28.1","@esbuild/netbsd-x64":"0.28.1","@esbuild/openbsd-arm64":"0.28.1","@esbuild/openbsd-x64":"0.28.1","@esbuild/openharmony-arm64":"0.28.1","@esbuild/sunos-x64":"0.28.1","@esbuild/win32-arm64":"0.28.1","@esbuild/win32-ia32":"0.28.1","@esbuild/win32-x64":"0.28.1"}},"node_modules/escalade":{"version":"3.2.0","resolved":"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz","integrity":"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==","license":"MIT","engines":{"node":">=6"}},"node_modules/escape-string-regexp":{"version":"4.0.0","resolved":"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz","integrity":"sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==","license":"MIT","engines":{"node":">=10"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/eslint":{"version":"10.8.0","resolved":"https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz","integrity":"sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==","license":"MIT","workspaces":["packages/*"],"dependencies":{"@eslint-community/eslint-utils":"^4.8.0","@eslint-community/regexpp":"^4.12.2","@eslint/config-array":"^0.23.5","@eslint/config-helpers":"^0.7.0","@eslint/core":"^1.2.1","@eslint/plugin-kit":"^0.7.2","@humanfs/node":"^0.16.6","@humanwhocodes/module-importer":"^1.0.1","@humanwhocodes/retry":"^0.4.2","@types/estree":"^1.0.6","ajv":"^6.14.0","cross-spawn":"^7.0.6","debug":"^4.3.2","escape-string-regexp":"^4.0.0","eslint-scope":"^9.1.2","eslint-visitor-keys":"^5.0.1","espree":"^11.2.0","esquery":"^1.7.0","esutils":"^2.0.2","fast-deep-equal":"^3.1.3","file-entry-cache":"^8.0.0","find-up":"^5.0.0","glob-parent":"^6.0.2","ignore":"^5.2.0","imurmurhash":"^0.1.4","is-glob":"^4.0.0","json-stable-stringify-without-jsonify":"^1.0.1","minimatch":"^10.2.5","natural-compare":"^1.4.0","optionator":"^0.9.3"},"bin":{"eslint":"bin/eslint.js"},"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"funding":{"url":"https://eslint.org/donate"},"peerDependencies":{"jiti":"*"},"peerDependenciesMeta":{"jiti":{"optional":true}}},"node_modules/eslint-scope":{"version":"9.1.2","resolved":"https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz","integrity":"sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==","license":"BSD-2-Clause","dependencies":{"@types/esrecurse":"^4.3.1","@types/estree":"^1.0.8","esrecurse":"^4.3.0","estraverse":"^5.2.0"},"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"funding":{"url":"https://opencollective.com/eslint"}},"node_modules/eslint-visitor-keys":{"version":"5.0.1","resolved":"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz","integrity":"sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==","license":"Apache-2.0","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"funding":{"url":"https://opencollective.com/eslint"}},"node_modules/espree":{"version":"11.2.0","resolved":"https://registry.npmjs.org/espree/-/espree-11.2.0.tgz","integrity":"sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==","license":"BSD-2-Clause","dependencies":{"acorn":"^8.16.0","acorn-jsx":"^5.3.2","eslint-visitor-keys":"^5.0.1"},"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"funding":{"url":"https://opencollective.com/eslint"}},"node_modules/esquery":{"version":"1.7.0","resolved":"https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz","integrity":"sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==","license":"BSD-3-Clause","dependencies":{"estraverse":"^5.1.0"},"engines":{"node":">=0.10"}},"node_modules/esrecurse":{"version":"4.3.0","resolved":"https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz","integrity":"sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==","license":"BSD-2-Clause","dependencies":{"estraverse":"^5.2.0"},"engines":{"node":">=4.0"}},"node_modules/estraverse":{"version":"5.3.0","resolved":"https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz","integrity":"sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==","license":"BSD-2-Clause","engines":{"node":">=4.0"}},"node_modules/esutils":{"version":"2.0.3","resolved":"https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz","integrity":"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==","license":"BSD-2-Clause","engines":{"node":">=0.10.0"}},"node_modules/fast-deep-equal":{"version":"3.1.3","resolved":"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz","integrity":"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==","license":"MIT"},"node_modules/fast-json-stable-stringify":{"version":"2.1.0","resolved":"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz","integrity":"sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==","license":"MIT"},"node_modules/fast-levenshtein":{"version":"2.0.6","resolved":"https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz","integrity":"sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==","license":"MIT"},"node_modules/fdir":{"version":"6.5.0","resolved":"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz","integrity":"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==","license":"MIT","engines":{"node":">=12.0.0"},"peerDependencies":{"picomatch":"^3 || ^4"},"peerDependenciesMeta":{"picomatch":{"optional":true}}},"node_modules/file-entry-cache":{"version":"8.0.0","resolved":"https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz","integrity":"sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==","license":"MIT","dependencies":{"flat-cache":"^4.0.0"},"engines":{"node":">=16.0.0"}},"node_modules/find-up":{"version":"5.0.0","resolved":"https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz","integrity":"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==","license":"MIT","dependencies":{"locate-path":"^6.0.0","path-exists":"^4.0.0"},"engines":{"node":">=10"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/flat-cache":{"version":"4.0.1","resolved":"https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz","integrity":"sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==","license":"MIT","dependencies":{"flatted":"^3.2.9","keyv":"^4.5.4"},"engines":{"node":">=16"}},"node_modules/flatted":{"version":"3.4.4","resolved":"https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz","integrity":"sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==","license":"ISC"},"node_modules/foreground-child":{"version":"3.3.1","resolved":"https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz","integrity":"sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==","license":"ISC","dependencies":{"cross-spawn":"^7.0.6","signal-exit":"^4.0.1"},"engines":{"node":">=14"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/fsevents":{"version":"2.3.2","resolved":"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz","integrity":"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==","hasInstallScript":true,"license":"MIT","optional":true,"os":["darwin"],"engines":{"node":"^8.16.0 || ^10.6.0 || >=11.0.0"}},"node_modules/get-caller-file":{"version":"2.0.5","resolved":"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz","integrity":"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==","license":"ISC","engines":{"node":"6.* || 8.* || >= 10.*"}},"node_modules/get-east-asian-width":{"version":"1.6.0","resolved":"https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz","integrity":"sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==","license":"MIT","engines":{"node":">=18"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/glob":{"version":"13.0.6","resolved":"https://registry.npmjs.org/glob/-/glob-13.0.6.tgz","integrity":"sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==","license":"BlueOak-1.0.0","dependencies":{"minimatch":"^10.2.2","minipass":"^7.1.3","path-scurry":"^2.0.2"},"engines":{"node":"18 || 20 || >=22"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/glob-parent":{"version":"6.0.2","resolved":"https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz","integrity":"sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==","license":"ISC","dependencies":{"is-glob":"^4.0.3"},"engines":{"node":">=10.13.0"}},"node_modules/globals":{"version":"17.8.0","resolved":"https://registry.npmjs.org/globals/-/globals-17.8.0.tgz","integrity":"sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==","license":"MIT","engines":{"node":">=18"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/has-flag":{"version":"4.0.0","resolved":"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz","integrity":"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==","license":"MIT","engines":{"node":">=8"}},"node_modules/html-escaper":{"version":"2.0.2","resolved":"https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz","integrity":"sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==","license":"MIT"},"node_modules/ignore":{"version":"5.3.2","resolved":"https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz","integrity":"sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==","license":"MIT","engines":{"node":">= 4"}},"node_modules/imurmurhash":{"version":"0.1.4","resolved":"https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz","integrity":"sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==","license":"MIT","engines":{"node":">=0.8.19"}},"node_modules/is-extglob":{"version":"2.1.1","resolved":"https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz","integrity":"sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==","license":"MIT","engines":{"node":">=0.10.0"}},"node_modules/is-glob":{"version":"4.0.3","resolved":"https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz","integrity":"sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==","license":"MIT","dependencies":{"is-extglob":"^2.1.1"},"engines":{"node":">=0.10.0"}},"node_modules/isexe":{"version":"2.0.0","resolved":"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz","integrity":"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==","license":"ISC"},"node_modules/istanbul-lib-coverage":{"version":"3.2.2","resolved":"https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz","integrity":"sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==","license":"BSD-3-Clause","engines":{"node":">=8"}},"node_modules/istanbul-lib-report":{"version":"3.0.1","resolved":"https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz","integrity":"sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==","license":"BSD-3-Clause","dependencies":{"istanbul-lib-coverage":"^3.0.0","make-dir":"^4.0.0","supports-color":"^7.1.0"},"engines":{"node":">=10"}},"node_modules/istanbul-lib-report/node_modules/supports-color":{"version":"7.2.0","resolved":"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz","integrity":"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==","license":"MIT","dependencies":{"has-flag":"^4.0.0"},"engines":{"node":">=8"}},"node_modules/istanbul-reports":{"version":"3.2.0","resolved":"https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz","integrity":"sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==","license":"BSD-3-Clause","dependencies":{"html-escaper":"^2.0.0","istanbul-lib-report":"^3.0.0"},"engines":{"node":">=8"}},"node_modules/jscpd":{"version":"5.0.14","resolved":"https://registry.npmjs.org/jscpd/-/jscpd-5.0.14.tgz","integrity":"sha512-zge+FPZZAymt2Do5Z0+QHyIn4/XcUhrO/W7of9HcHZfx2AK8++dYhLA1uWtwXj47ml3Of8PbcUW4wUWvYMCc3w==","license":"MIT","bin":{"jscpd":"run-jscpd.js"},"engines":{"node":">=18"},"optionalDependencies":{"jscpd-darwin-arm64":"5.0.14","jscpd-darwin-x64":"5.0.14","jscpd-linux-arm64-gnu":"5.0.14","jscpd-linux-x64-gnu":"5.0.14","jscpd-linux-x64-musl":"5.0.14","jscpd-windows-x64-msvc":"5.0.14"}},"node_modules/jscpd-darwin-arm64":{"version":"5.0.14","resolved":"https://registry.npmjs.org/jscpd-darwin-arm64/-/jscpd-darwin-arm64-5.0.14.tgz","integrity":"sha512-Ojjl79SBuj9tEW6WbjZ1a/1ZOR89dneH9yLQYQu8WyWaQownttnx7RYFEHU6aGhS4jIvwUEbr+1wxzFTb37cwg==","cpu":["arm64"],"license":"MIT","optional":true,"os":["darwin"]},"node_modules/jscpd-darwin-x64":{"version":"5.0.14","resolved":"https://registry.npmjs.org/jscpd-darwin-x64/-/jscpd-darwin-x64-5.0.14.tgz","integrity":"sha512-DxFg5XvjMZ81iVeqillnM5apqcGCfNTbroNF+mPLr7RkHLGH6mudLgtO+ILL/hfpZXy1bF9oIY5BSudPmN/k9A==","cpu":["x64"],"license":"MIT","optional":true,"os":["darwin"]},"node_modules/jscpd-linux-arm64-gnu":{"version":"5.0.14","resolved":"https://registry.npmjs.org/jscpd-linux-arm64-gnu/-/jscpd-linux-arm64-gnu-5.0.14.tgz","integrity":"sha512-1uw+XBHEt9pONXNICSp5HpaVWPjG6mQ6deDXaq9Yb0xCNJkX4/8gmn0vhzekIyZD2DspRYKPUolbDsqm/HEdYg==","cpu":["arm64"],"libc":["glibc"],"license":"MIT","optional":true,"os":["linux"]},"node_modules/jscpd-linux-x64-gnu":{"version":"5.0.14","resolved":"https://registry.npmjs.org/jscpd-linux-x64-gnu/-/jscpd-linux-x64-gnu-5.0.14.tgz","integrity":"sha512-dFTbyyrm+Z9pcXIVzJQCw8QAgiNqIiO69sm4AfA7/wFdPoizoVzjhaXsYXcSV4bs0aoPiWbNazg0J0HgslT/5A==","cpu":["x64"],"libc":["glibc"],"license":"MIT","optional":true,"os":["linux"]},"node_modules/jscpd-linux-x64-musl":{"version":"5.0.14","resolved":"https://registry.npmjs.org/jscpd-linux-x64-musl/-/jscpd-linux-x64-musl-5.0.14.tgz","integrity":"sha512-SayS7qQJvixyy9eR0+UjepkTsUUwqvlsiuSxfIdHgG2qzqoh/thnkgiu4By8fsiiDpQONsQrRrZDwHRQ3GDrBQ==","cpu":["x64"],"libc":["musl"],"license":"MIT","optional":true,"os":["linux"]},"node_modules/jscpd-windows-x64-msvc":{"version":"5.0.14","resolved":"https://registry.npmjs.org/jscpd-windows-x64-msvc/-/jscpd-windows-x64-msvc-5.0.14.tgz","integrity":"sha512-DqjxlVkUanlahGgY2lY7Zkrau4BUTI+AwWky+bPGK4kSK2AIOaUziY9Q19u8b58idXmJA9FKK98Fuu4ajNXVjQ==","cpu":["x64"],"license":"MIT","optional":true,"os":["win32"]},"node_modules/json-buffer":{"version":"3.0.1","resolved":"https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz","integrity":"sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==","license":"MIT"},"node_modules/json-schema-traverse":{"version":"0.4.1","resolved":"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz","integrity":"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==","license":"MIT"},"node_modules/json-stable-stringify-without-jsonify":{"version":"1.0.1","resolved":"https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz","integrity":"sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==","license":"MIT"},"node_modules/keyv":{"version":"4.5.4","resolved":"https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz","integrity":"sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==","license":"MIT","dependencies":{"json-buffer":"3.0.1"}},"node_modules/kleur":{"version":"4.1.5","resolved":"https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz","integrity":"sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==","license":"MIT","engines":{"node":">=6"}},"node_modules/levn":{"version":"0.4.1","resolved":"https://registry.npmjs.org/levn/-/levn-0.4.1.tgz","integrity":"sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==","license":"MIT","dependencies":{"prelude-ls":"^1.2.1","type-check":"~0.4.0"},"engines":{"node":">= 0.8.0"}},"node_modules/locate-path":{"version":"6.0.0","resolved":"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz","integrity":"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==","license":"MIT","dependencies":{"p-locate":"^5.0.0"},"engines":{"node":">=10"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/lru-cache":{"version":"11.5.2","resolved":"https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz","integrity":"sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==","license":"BlueOak-1.0.0","engines":{"node":"20 || >=22"}},"node_modules/make-dir":{"version":"4.0.0","resolved":"https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz","integrity":"sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==","license":"MIT","dependencies":{"semver":"^7.5.3"},"engines":{"node":">=10"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/miniflare":{"version":"5.20260730.0-alpha","resolved":"https://registry.npmjs.org/miniflare/-/miniflare-5.20260730.0-alpha.tgz","integrity":"sha512-8/dspSXDshP6nSkCpjKO7BYc2qZoYSXm7iM+QxY7qJyJpAB3onnQSaiu0cvKJlfuMGwULl55hG69FJCcCMXU1Q==","license":"MIT","dependencies":{"@cspotcode/source-map-support":"0.8.1","sharp":"0.35.2","undici":"7.28.0","workerd":"1.20260730.1","ws":"8.21.0","youch":"4.1.0-beta.10"},"engines":{"node":">=22.0.0"}},"node_modules/minimatch":{"version":"10.2.6","resolved":"https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz","integrity":"sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==","license":"BlueOak-1.0.0","dependencies":{"brace-expansion":"^5.0.8"},"engines":{"node":"18 || 20 || >=22"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/minipass":{"version":"7.1.3","resolved":"https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz","integrity":"sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==","license":"BlueOak-1.0.0","engines":{"node":">=16 || 14 >=14.17"}},"node_modules/ms":{"version":"2.1.3","resolved":"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz","integrity":"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==","license":"MIT"},"node_modules/natural-compare":{"version":"1.4.0","resolved":"https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz","integrity":"sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==","license":"MIT"},"node_modules/optionator":{"version":"0.9.4","resolved":"https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz","integrity":"sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==","license":"MIT","dependencies":{"deep-is":"^0.1.3","fast-levenshtein":"^2.0.6","levn":"^0.4.1","prelude-ls":"^1.2.1","type-check":"^0.4.0","word-wrap":"^1.2.5"},"engines":{"node":">= 0.8.0"}},"node_modules/p-limit":{"version":"3.1.0","resolved":"https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz","integrity":"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==","license":"MIT","dependencies":{"yocto-queue":"^0.1.0"},"engines":{"node":">=10"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/p-locate":{"version":"5.0.0","resolved":"https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz","integrity":"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==","license":"MIT","dependencies":{"p-limit":"^3.0.2"},"engines":{"node":">=10"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/path-exists":{"version":"4.0.0","resolved":"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz","integrity":"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==","license":"MIT","engines":{"node":">=8"}},"node_modules/path-key":{"version":"3.1.1","resolved":"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz","integrity":"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==","license":"MIT","engines":{"node":">=8"}},"node_modules/path-scurry":{"version":"2.0.2","resolved":"https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz","integrity":"sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==","license":"BlueOak-1.0.0","dependencies":{"lru-cache":"^11.0.0","minipass":"^7.1.2"},"engines":{"node":"18 || 20 || >=22"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/path-to-regexp":{"version":"6.3.0","resolved":"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz","integrity":"sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==","license":"MIT"},"node_modules/pathe":{"version":"2.0.3","resolved":"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz","integrity":"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==","license":"MIT"},"node_modules/picomatch":{"version":"4.0.5","resolved":"https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz","integrity":"sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==","license":"MIT","engines":{"node":">=12"},"funding":{"url":"https://github.com/sponsors/jonschlinkert"}},"node_modules/pixelmatch":{"version":"7.2.0","resolved":"https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.2.0.tgz","integrity":"sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==","license":"ISC","dependencies":{"pngjs":"^7.0.0"},"bin":{"pixelmatch":"bin/pixelmatch"}},"node_modules/playwright":{"version":"1.62.1","resolved":"https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz","integrity":"sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==","license":"Apache-2.0","dependencies":{"playwright-core":"1.62.1"},"bin":{"playwright":"cli.js"},"engines":{"node":">=20"},"optionalDependencies":{"fsevents":"2.3.2"}},"node_modules/playwright-core":{"version":"1.62.1","resolved":"https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz","integrity":"sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==","license":"Apache-2.0","bin":{"playwright-core":"cli.js"},"engines":{"node":">=20"}},"node_modules/pngjs":{"version":"7.0.0","resolved":"https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz","integrity":"sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==","license":"MIT","engines":{"node":">=14.19.0"}},"node_modules/prelude-ls":{"version":"1.2.1","resolved":"https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz","integrity":"sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==","license":"MIT","engines":{"node":">= 0.8.0"}},"node_modules/punycode":{"version":"2.3.1","resolved":"https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz","integrity":"sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==","license":"MIT","engines":{"node":">=6"}},"node_modules/semver":{"version":"7.8.5","resolved":"https://registry.npmjs.org/semver/-/semver-7.8.5.tgz","integrity":"sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==","license":"ISC","bin":{"semver":"bin/semver.js"},"engines":{"node":">=10"}},"node_modules/sharp":{"version":"0.35.2","resolved":"https://registry.npmjs.org/sharp/-/sharp-0.35.2.tgz","integrity":"sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==","license":"Apache-2.0","dependencies":{"@img/colour":"^1.1.0","detect-libc":"^2.1.2","semver":"^7.8.4"},"engines":{"node":">=20.9.0"},"funding":{"url":"https://opencollective.com/libvips"},"optionalDependencies":{"@img/sharp-darwin-arm64":"0.35.2","@img/sharp-darwin-x64":"0.35.2","@img/sharp-freebsd-wasm32":"0.35.2","@img/sharp-libvips-darwin-arm64":"1.3.1","@img/sharp-libvips-darwin-x64":"1.3.1","@img/sharp-libvips-linux-arm":"1.3.1","@img/sharp-libvips-linux-arm64":"1.3.1","@img/sharp-libvips-linux-ppc64":"1.3.1","@img/sharp-libvips-linux-riscv64":"1.3.1","@img/sharp-libvips-linux-s390x":"1.3.1","@img/sharp-libvips-linux-x64":"1.3.1","@img/sharp-libvips-linuxmusl-arm64":"1.3.1","@img/sharp-libvips-linuxmusl-x64":"1.3.1","@img/sharp-linux-arm":"0.35.2","@img/sharp-linux-arm64":"0.35.2","@img/sharp-linux-ppc64":"0.35.2","@img/sharp-linux-riscv64":"0.35.2","@img/sharp-linux-s390x":"0.35.2","@img/sharp-linux-x64":"0.35.2","@img/sharp-linuxmusl-arm64":"0.35.2","@img/sharp-linuxmusl-x64":"0.35.2","@img/sharp-webcontainers-wasm32":"0.35.2","@img/sharp-win32-arm64":"0.35.2","@img/sharp-win32-ia32":"0.35.2","@img/sharp-win32-x64":"0.35.2"}},"node_modules/shebang-command":{"version":"2.0.0","resolved":"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz","integrity":"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==","license":"MIT","dependencies":{"shebang-regex":"^3.0.0"},"engines":{"node":">=8"}},"node_modules/shebang-regex":{"version":"3.0.0","resolved":"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz","integrity":"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==","license":"MIT","engines":{"node":">=8"}},"node_modules/signal-exit":{"version":"4.1.0","resolved":"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz","integrity":"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==","license":"ISC","engines":{"node":">=14"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/string-width":{"version":"8.2.2","resolved":"https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz","integrity":"sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==","license":"MIT","dependencies":{"get-east-asian-width":"^1.5.0","strip-ansi":"^7.1.2"},"engines":{"node":">=20"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/strip-ansi":{"version":"7.2.0","resolved":"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz","integrity":"sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==","license":"MIT","dependencies":{"ansi-regex":"^6.2.2"},"engines":{"node":">=12"},"funding":{"url":"https://github.com/chalk/strip-ansi?sponsor=1"}},"node_modules/supports-color":{"version":"10.2.2","resolved":"https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz","integrity":"sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==","license":"MIT","engines":{"node":">=18"},"funding":{"url":"https://github.com/chalk/supports-color?sponsor=1"}},"node_modules/test-exclude":{"version":"8.0.0","resolved":"https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz","integrity":"sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==","license":"ISC","dependencies":{"@istanbuljs/schema":"^0.1.2","glob":"^13.0.6","minimatch":"^10.2.2"},"engines":{"node":"20 || >=22"}},"node_modules/tinyglobby":{"version":"0.2.17","resolved":"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz","integrity":"sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==","license":"MIT","dependencies":{"fdir":"^6.5.0","picomatch":"^4.0.4"},"engines":{"node":">=12.0.0"},"funding":{"url":"https://github.com/sponsors/SuperchupuDev"}},"node_modules/ts-api-utils":{"version":"2.5.0","resolved":"https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz","integrity":"sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==","license":"MIT","engines":{"node":">=18.12"},"peerDependencies":{"typescript":">=4.8.4"}},"node_modules/tslib":{"version":"2.8.1","resolved":"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz","integrity":"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==","license":"0BSD","optional":true},"node_modules/type-check":{"version":"0.4.0","resolved":"https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz","integrity":"sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==","license":"MIT","dependencies":{"prelude-ls":"^1.2.1"},"engines":{"node":">= 0.8.0"}},"node_modules/typescript":{"version":"6.0.3","resolved":"https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz","integrity":"sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==","license":"Apache-2.0","peer":true,"bin":{"tsc":"bin/tsc","tsserver":"bin/tsserver"},"engines":{"node":">=14.17"}},"node_modules/undici":{"version":"7.28.0","resolved":"https://registry.npmjs.org/undici/-/undici-7.28.0.tgz","integrity":"sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==","license":"MIT","engines":{"node":">=20.18.1"}},"node_modules/unenv":{"version":"2.0.0-rc.24","resolved":"https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz","integrity":"sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==","license":"MIT","dependencies":{"pathe":"^2.0.3"}},"node_modules/uri-js":{"version":"4.4.1","resolved":"https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz","integrity":"sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==","license":"BSD-2-Clause","dependencies":{"punycode":"^2.1.0"}},"node_modules/v8-to-istanbul":{"version":"9.3.0","resolved":"https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz","integrity":"sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==","license":"ISC","dependencies":{"@jridgewell/trace-mapping":"^0.3.12","@types/istanbul-lib-coverage":"^2.0.1","convert-source-map":"^2.0.0"},"engines":{"node":">=10.12.0"}},"node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping":{"version":"0.3.31","resolved":"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz","integrity":"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==","license":"MIT","dependencies":{"@jridgewell/resolve-uri":"^3.1.0","@jridgewell/sourcemap-codec":"^1.4.14"}},"node_modules/which":{"version":"2.0.2","resolved":"https://registry.npmjs.org/which/-/which-2.0.2.tgz","integrity":"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==","license":"ISC","dependencies":{"isexe":"^2.0.0"},"bin":{"node-which":"bin/node-which"},"engines":{"node":">= 8"}},"node_modules/word-wrap":{"version":"1.2.5","resolved":"https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz","integrity":"sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==","license":"MIT","engines":{"node":">=0.10.0"}},"node_modules/workerd":{"version":"1.20260730.1","resolved":"https://registry.npmjs.org/workerd/-/workerd-1.20260730.1.tgz","integrity":"sha512-zmfNIjwYSWFY5chGBOjWtH3xAE7p97FTC6vR4Ep98290ho6AeAR/NVcBD274YCLEUYzqm8yxdtZlxMybU8a3jA==","hasInstallScript":true,"license":"Apache-2.0","bin":{"workerd":"bin/workerd"},"engines":{"node":">=16"},"optionalDependencies":{"@cloudflare/workerd-darwin-64":"1.20260730.1","@cloudflare/workerd-darwin-arm64":"1.20260730.1","@cloudflare/workerd-linux-64":"1.20260730.1","@cloudflare/workerd-linux-arm64":"1.20260730.1","@cloudflare/workerd-windows-64":"1.20260730.1"}},"node_modules/wrangler":{"version":"4.118.0","resolved":"https://registry.npmjs.org/wrangler/-/wrangler-4.118.0.tgz","integrity":"sha512-9pkBw/b8zWqGx2S+oLhgHMR1M/4VOE8SynUFABnGWiSFGlcOQ4xiI/B71Xf66RYP2xzngU37IQFPtUruij3lYw==","license":"MIT OR Apache-2.0","dependencies":{"@cloudflare/kv-asset-handler":"0.5.0","@cloudflare/unenv-preset":"2.16.1","blake3-wasm":"2.1.5","esbuild":"0.28.1","miniflare":"5.20260730.0-alpha","path-to-regexp":"6.3.0","unenv":"2.0.0-rc.24","workerd":"1.20260730.1"},"bin":{"cf-wrangler":"bin/cf-wrangler.js","wrangler":"bin/wrangler.js","wrangler2":"bin/wrangler.js"},"engines":{"node":">=22.0.0"},"optionalDependencies":{"fsevents":"2.3.3"},"peerDependencies":{"@cloudflare/workers-types":"^5.20260730.1"},"peerDependenciesMeta":{"@cloudflare/workers-types":{"optional":true}}},"node_modules/wrangler/node_modules/fsevents":{"version":"2.3.3","resolved":"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz","integrity":"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==","hasInstallScript":true,"license":"MIT","optional":true,"os":["darwin"],"engines":{"node":"^8.16.0 || ^10.6.0 || >=11.0.0"}},"node_modules/wrap-ansi":{"version":"9.0.2","resolved":"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz","integrity":"sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==","license":"MIT","dependencies":{"ansi-styles":"^6.2.1","string-width":"^7.0.0","strip-ansi":"^7.1.0"},"engines":{"node":">=18"},"funding":{"url":"https://github.com/chalk/wrap-ansi?sponsor=1"}},"node_modules/wrap-ansi/node_modules/string-width":{"version":"7.2.0","resolved":"https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz","integrity":"sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==","license":"MIT","dependencies":{"emoji-regex":"^10.3.0","get-east-asian-width":"^1.0.0","strip-ansi":"^7.1.0"},"engines":{"node":">=18"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/ws":{"version":"8.21.0","resolved":"https://registry.npmjs.org/ws/-/ws-8.21.0.tgz","integrity":"sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==","license":"MIT","engines":{"node":">=10.0.0"},"peerDependencies":{"bufferutil":"^4.0.1","utf-8-validate":">=5.0.2"},"peerDependenciesMeta":{"bufferutil":{"optional":true},"utf-8-validate":{"optional":true}}},"node_modules/y18n":{"version":"5.0.8","resolved":"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz","integrity":"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==","license":"ISC","engines":{"node":">=10"}},"node_modules/yargs":{"version":"18.1.0","resolved":"https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz","integrity":"sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==","license":"MIT","dependencies":{"cliui":"^9.0.1","escalade":"^3.1.1","get-caller-file":"^2.0.5","string-width":"^8.2.1","y18n":"^5.0.5","yargs-parser":"^22.0.0"},"engines":{"node":"^20.19.0 || ^22.12.0 || >=23"}},"node_modules/yargs-parser":{"version":"21.1.1","resolved":"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz","integrity":"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==","license":"ISC","engines":{"node":">=12"}},"node_modules/yargs/node_modules/yargs-parser":{"version":"22.0.0","resolved":"https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz","integrity":"sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==","license":"ISC","engines":{"node":"^20.19.0 || ^22.12.0 || >=23"}},"node_modules/yocto-queue":{"version":"0.1.0","resolved":"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz","integrity":"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==","license":"MIT","engines":{"node":">=10"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/youch":{"version":"4.1.0-beta.10","resolved":"https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz","integrity":"sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==","license":"MIT","dependencies":{"@poppinss/colors":"^4.1.5","@poppinss/dumper":"^0.6.4","@speed-highlight/core":"^1.2.7","cookie":"^1.0.2","youch-core":"^0.3.3"}},"node_modules/youch-core":{"version":"0.3.3","resolved":"https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz","integrity":"sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==","license":"MIT","dependencies":{"@poppinss/exception":"^1.2.2","error-stack-parser-es":"^1.0.5"}}}} diff --git a/verification/package.json b/verification/package.json new file mode 100644 index 0000000..d0e996b --- /dev/null +++ b/verification/package.json @@ -0,0 +1,20 @@ +{ + "name": "kvideo-strict-verification", + "version": "1.0.0", + "private": true, + "type": "module", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.65.0", + "@eslint/js": "10.0.1", + "axe-core": "4.12.1", + "c8": "12.0.0", + "esbuild": "0.28.1", + "eslint": "10.8.0", + "globals": "17.8.0", + "jscpd": "5.0.14", + "pixelmatch": "7.2.0", + "playwright": "1.62.1", + "pngjs": "7.0.0", + "wrangler": "4.118.0" + } +} diff --git a/verification/run b/verification/run new file mode 100755 index 0000000..9517429 --- /dev/null +++ b/verification/run @@ -0,0 +1,22 @@ +#!/bin/sh +set -eu + +verify_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +repo_dir=$(CDPATH= cd -- "$verify_dir/.." && pwd) + +if ! command -v node >/dev/null 2>&1; then + printf '%s\n' 'ERROR: Node.js is required.' >&2 + exit 127 +fi + +if ! command -v npm >/dev/null 2>&1; then + printf '%s\n' 'ERROR: npm is required.' >&2 + exit 127 +fi + +export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 +( + cd "$verify_dir" + npm ci --no-audit --no-fund --ignore-scripts +) +exec node "$verify_dir/src/main.mjs" --root "$repo_dir" "$@" diff --git a/verification/src/browser/action-effects.mjs b/verification/src/browser/action-effects.mjs new file mode 100644 index 0000000..c2869b8 --- /dev/null +++ b/verification/src/browser/action-effects.mjs @@ -0,0 +1,130 @@ +import { semanticSnapshot } from './semantic.mjs'; + +const errorFields = ['consoleErrors', 'pageErrors', 'failedRequests', 'httpErrors']; + +function observedCounts(observed) { + return { + requests: observed.requestCount || 0, + responses: observed.responseCount || 0, + dialogs: observed.dialogs.length, + downloads: observed.downloads.length, + fileChoosers: observed.fileChoosers?.length || 0, + popups: observed.popups.length, + abortedRequests: observed.abortedRequests?.length || 0, + ...Object.fromEntries(errorFields.map((name) => [name, observed[name].length])), + }; +} + +export function browserEvidence(scope = globalThis) { + const storage = (name) => { + try { + const target = scope[name]; + return Object.keys(target).sort().map((key) => [key, target.getItem(key)]); + } catch (error) { + return [['', `${error?.name || 'Error'}: ${error?.message || String(error)}`]]; + } + }; + const document = scope.document; + const media = [...document.querySelectorAll('video,audio')].map((element) => ({ + paused: element.paused, + muted: element.muted, + volume: Number(element.volume.toFixed(3)), + playbackRate: Number(element.playbackRate.toFixed(3)), + currentTime: Number(element.currentTime.toFixed(2)), + currentSrc: element.currentSrc, + readyState: element.readyState, + error: element.error?.message || null, + })); + const rootStyle = scope.getComputedStyle(document.documentElement); + const bodyStyle = document.body ? scope.getComputedStyle(document.body) : null; + return { + url: `${scope.location.pathname}${scope.location.search}${scope.location.hash}`, + localStorage: storage('localStorage'), + sessionStorage: storage('sessionStorage'), + clipboard: scope.__kvClipboard || '', + display: { rootClass: document.documentElement.className, theme: document.documentElement.getAttribute('data-theme') || '', + colorScheme: rootStyle.colorScheme, bodyColor: bodyStyle?.color || '', + bodyBackground: bodyStyle?.backgroundColor || '' }, + media, + }; +} + +export async function captureActionEvidence(page, observed, actionState) { + const [pageState, dom] = await Promise.all([page.evaluate(browserEvidence), semanticSnapshot(page)]); + const observedEvents = Object.fromEntries([...errorFields, 'abortedRequests'].map((name) => [name, observed[name] || []])); + return { ...pageState, dom, actionState, observed: observedCounts(observed), observedEvents }; +} + +function changed(before, after, field) { + return JSON.stringify(before[field]) !== JSON.stringify(after[field]); +} + +function mediaLabel(action) { + return `${action.aria || ''} ${action.text || ''}`.trim().toLowerCase(); +} + +function mediaProof(action, before, after) { + const label = mediaLabel(action); + const left = before.media[0]; + const right = after.media[0]; + if (!left || !right) return null; + const transition = { before: { currentTime: left.currentTime, paused: left.paused }, after: { currentTime: right.currentTime, paused: right.paused } }; + if (/(后退|rewind|backward)/.test(label)) return { kind: 'seek-backward', ok: right.currentTime <= left.currentTime - 5, ...transition }; + if (/(前进|forward)/.test(label)) return { kind: 'seek-forward', ok: right.currentTime >= left.currentTime + 5, ...transition }; + if (/(^|\s)(播放|play)(\s|$)/.test(label)) return { kind: 'play', ok: !right.paused, ...transition }; + if (/(^|\s)(暂停|pause)(\s|$)/.test(label)) return { kind: 'pause', ok: right.paused, ...transition }; + return null; +} + +function runtimeDelta(before, after) { + return errorFields.flatMap((field) => { + const count = Math.max(0, after.observed[field] - before.observed[field]); + const events = after.observedEvents?.[field]?.slice(before.observed[field]) || []; + return count ? [{ field, count, events }] : []; + }); +} + +function observableEffects(before, after) { + const effects = []; + if (before.actionState.hash !== after.actionState.hash) effects.push('control-state'); + if (before.dom.hash !== after.dom.hash) effects.push('visible-dom'); + for (const field of ['url', 'localStorage', 'sessionStorage', 'clipboard', 'display']) if (changed(before, after, field)) effects.push(field); + const mediaBefore = before.media.map((item) => [item.paused, item.muted, item.volume, item.playbackRate, item.currentSrc, item.error]); + const mediaAfter = after.media.map((item) => [item.paused, item.muted, item.volume, item.playbackRate, item.currentSrc, item.error]); + if (JSON.stringify(mediaBefore) !== JSON.stringify(mediaAfter)) effects.push('media-state'); + for (const field of ['requests', 'responses', 'dialogs', 'downloads', 'fileChoosers', 'popups']) { + if (after.observed[field] > before.observed[field]) effects.push(field); + } + return effects; +} + +function idempotentReason(action, before, after) { + if (action.selected) return 'control is already the visibly selected choice'; + if (!action.href || before.url !== after.url) return ''; + try { + const base = new URL(before.url, 'https://verification.invalid'); + return new URL(action.href, base).href === base.href ? 'link already targets the current location' : ''; + } catch { return ''; } +} + +export function assessAction(action, interaction, before, after) { + if (!interaction.ok) return { ok: false, failureKind: 'automation', reason: interaction.reason, effects: [], stateChanged: false }; + if (interaction.skipped || interaction.idempotent) { + return { ok: true, idempotent: true, reason: interaction.reason, effects: [], stateChanged: false }; + } + const effects = observableEffects(before, after); + const runtimeErrors = runtimeDelta(before, after); + if (runtimeErrors.length) return { ok: false, failureKind: 'runtime', reason: 'interaction emitted a runtime or network error', effects, runtimeErrors, + stateChanged: before.actionState.hash !== after.actionState.hash }; + const proof = mediaProof(action, before, after); + if (proof && !proof.ok) return { ok: false, failureKind: 'media-proof', reason: `${proof.kind} did not produce the required media transition`, effects, proof, + stateChanged: before.actionState.hash !== after.actionState.hash }; + if (proof?.ok) effects.push(`media-${proof.kind}`); + if (!effects.length) { + const reason = idempotentReason(action, before, after); + if (reason) return { ok: true, idempotent: true, reason, effects, proof, stateChanged: false }; + return { ok: false, failureKind: 'no-effect', reason: 'interaction produced no observable DOM, state, storage, media, network, dialog, download, popup, or navigation effect', + effects, proof, stateChanged: false }; + } + return { ok: true, effects, proof, stateChanged: before.actionState.hash !== after.actionState.hash }; +} diff --git a/verification/src/browser/action-normalize.mjs b/verification/src/browser/action-normalize.mjs new file mode 100644 index 0000000..61e1344 --- /dev/null +++ b/verification/src/browser/action-normalize.mjs @@ -0,0 +1,8 @@ +export const generatedValueRules = { + 'source-id': '^custom-[a-z0-9]+$', +}; + +export function stableGeneratedValue(id, value) { + const pattern = generatedValueRules[id]; + return pattern && new RegExp(pattern).test(value) ? `${id}:` : value; +} diff --git a/verification/src/browser/action-scan.mjs b/verification/src/browser/action-scan.mjs new file mode 100644 index 0000000..5f6003c --- /dev/null +++ b/verification/src/browser/action-scan.mjs @@ -0,0 +1,149 @@ +import crypto from 'node:crypto'; +import { generatedValueRules } from './action-normalize.mjs'; +import { revealActionControls } from './action-state.mjs'; + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 20); +} + +function blockingLayer() { + const layer = (element) => element ? Math.max(Number.parseInt(getComputedStyle(element).zIndex, 10) || 0, + layer(element.parentElement)) : 0; + let floor = 0; + for (const element of document.querySelectorAll('*')) { + const style = getComputedStyle(element); + const box = element.getBoundingClientRect(); + const hidden = style.display === 'none' || style.visibility === 'hidden' + || style.pointerEvents === 'none' || Number(style.opacity) === 0; + const covers = box.width >= innerWidth * 0.9 && box.height >= innerHeight * 0.9; + if (style.position === 'fixed' && !hidden && covers) floor = Math.max(floor, layer(element)); + } + return floor; +} + +function collectActions({ generatedRules, blockingZ }) { + const selector = 'button,a[href],input,select,textarea,[role="button"],[role="link"],[data-focusable],[contenteditable="true"],[onclick]'; + const attr = (element, name) => element.getAttribute(name) || ''; + const normalize = (value) => String(value || '').trim().replace(/\s+/g, ' ') + .replace(/\b\d{1,2}:\d{2}(?::\d{2})?\b/g, '