From a60470015a79ee0a5c855a7d6f722a70c3d84312 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 23 Apr 2025 14:16:41 -0500 Subject: [PATCH 01/12] init --- .gitignore | 2 +- {src/assets => assets}/solid.svg | 0 assets/tailwind.css | 142 ++ bun.lock | 1635 +++++++++++++++++ bun.lockb | Bin 253980 -> 0 bytes components/content/Button.tsx | 69 + components/content/Cue.tsx | 133 ++ components/content/TopBar.tsx | 32 + components/content/Transcription.tsx | 260 +++ .../content/quick-actions/AISummary.tsx | 239 +++ .../content/quick-actions/PlaybackRate.tsx | 112 ++ .../content/quick-actions/QuickActions.tsx | 229 +++ context/AISummaryStore.tsx | 113 ++ context/BookmarkProvider.tsx | 159 ++ context/SearchStore.tsx | 20 + context/SelectedActionStore.tsx | 34 + entrypoints/background.ts | 100 + entrypoints/injected.content/index.ts | 8 + entrypoints/injected.content/injected.css | 10 + entrypoints/main.content/App.tsx | 362 ++++ entrypoints/main.content/hooks/useCueSync.ts | 42 + .../hooks/useTranscriptionScroll.ts | 26 + entrypoints/main.content/index.tsx | 113 ++ entrypoints/main.content/utils.ts | 108 ++ entrypoints/popup/App.tsx | 132 ++ .../popup/index.html | 3 +- .../popup/main.tsx | 1 - eslint.config.js | 25 +- package.json | 40 +- {src/public => public}/icon/128.png | Bin {src/public => public}/icon/16.png | Bin {src/public => public}/icon/32.png | Bin {src/public => public}/icon/48.png | Bin {src/public => public}/icon/96.png | Bin {src/public => public}/wxt.svg | 0 src/entrypoints/background.ts | 86 - src/entrypoints/content/index.ts | 304 --- src/entrypoints/content/style.css | 158 -- src/entrypoints/content/utils.ts | 35 - src/entrypoints/popup/App.css | 27 - src/entrypoints/popup/App.tsx | 34 - src/entrypoints/popup/style.css | 69 - tsconfig.json | 3 +- wxt.config.ts | 11 +- 44 files changed, 4127 insertions(+), 749 deletions(-) rename {src/assets => assets}/solid.svg (100%) create mode 100644 assets/tailwind.css create mode 100644 bun.lock delete mode 100755 bun.lockb create mode 100644 components/content/Button.tsx create mode 100644 components/content/Cue.tsx create mode 100644 components/content/TopBar.tsx create mode 100644 components/content/Transcription.tsx create mode 100644 components/content/quick-actions/AISummary.tsx create mode 100644 components/content/quick-actions/PlaybackRate.tsx create mode 100644 components/content/quick-actions/QuickActions.tsx create mode 100644 context/AISummaryStore.tsx create mode 100644 context/BookmarkProvider.tsx create mode 100644 context/SearchStore.tsx create mode 100644 context/SelectedActionStore.tsx create mode 100644 entrypoints/background.ts create mode 100644 entrypoints/injected.content/index.ts create mode 100644 entrypoints/injected.content/injected.css create mode 100644 entrypoints/main.content/App.tsx create mode 100644 entrypoints/main.content/hooks/useCueSync.ts create mode 100644 entrypoints/main.content/hooks/useTranscriptionScroll.ts create mode 100644 entrypoints/main.content/index.tsx create mode 100644 entrypoints/main.content/utils.ts create mode 100644 entrypoints/popup/App.tsx rename {src/entrypoints => entrypoints}/popup/index.html (82%) rename {src/entrypoints => entrypoints}/popup/main.tsx (84%) rename {src/public => public}/icon/128.png (100%) rename {src/public => public}/icon/16.png (100%) rename {src/public => public}/icon/32.png (100%) rename {src/public => public}/icon/48.png (100%) rename {src/public => public}/icon/96.png (100%) rename {src/public => public}/wxt.svg (100%) delete mode 100644 src/entrypoints/background.ts delete mode 100644 src/entrypoints/content/index.ts delete mode 100644 src/entrypoints/content/style.css delete mode 100644 src/entrypoints/content/utils.ts delete mode 100644 src/entrypoints/popup/App.css delete mode 100644 src/entrypoints/popup/App.tsx delete mode 100644 src/entrypoints/popup/style.css diff --git a/.gitignore b/.gitignore index a256953..0f0d1d1 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,4 @@ web-ext.config.ts *.ntvs* *.njsproj *.sln -*.sw? +*.sw? \ No newline at end of file diff --git a/src/assets/solid.svg b/assets/solid.svg similarity index 100% rename from src/assets/solid.svg rename to assets/solid.svg diff --git a/assets/tailwind.css b/assets/tailwind.css new file mode 100644 index 0000000..e4480af --- /dev/null +++ b/assets/tailwind.css @@ -0,0 +1,142 @@ +@import "tailwindcss"; + +@theme { + --color-ut-burntorange: #bf5700; + --color-ut-black: #333f48; + --color-theme-black: #1a2024; + + --ease-in-out-expo: cubic-bezier(0.46, 0, 0.21, 1); + --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1); + + --animate-scale-in: scale-in 400ms cubic-bezier(0.34, 1.56, 0.64, 1); + --animate-scale-out: scale-out 250ms cubic-bezier(0.5, 0, 0.75, 0) forwards; + + --animate-slide-in: slide-in 500ms var(--ease-in-out-expo) forwards; + --animate-slide-out: slide-out 500ms var(--ease-out-expo) forwards; + --animate-expand: expand 300ms var(--ease-in-out-expo) forwards; + --animate-collapse: collapse 300ms var(--ease-out-expo) forwards; + + --animate-in: enter 150ms ease; + --animate-out: exit 150ms ease; + + @keyframes scale-in { + 0% { + opacity: 0; + transform: scale(0.8); + } + 60% { + opacity: 1; + transform: scale(1.05); + } + 100% { + transform: scale(1); + } + } + + @keyframes scale-out { + 0% { + transform: scale(1); + opacity: 1; + } + 100% { + transform: scale(0.8); + opacity: 0; + } + } + + @keyframes slide-in { + 0% { + transform: translateX(100%); + } + 100% { + transform: translateX(0); + } + } + + @keyframes slide-out { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(100%); + } + } + + @keyframes expand { + 0% { + width: 80px; + opacity: 0.7; + } + 100% { + width: 100%; + opacity: 1; + } + } + + @keyframes collapse { + 0% { + width: 100%; + } + 100% { + width: 24.5px; + } + } + + @keyframes enter { + from { + opacity: var(--tw-enter-opacity, 1); + transform: translate3d( + var(--tw-enter-translate-x, 0), + var(--tw-enter-translate-y, 0), + 0 + ) + scale3d( + var(--tw-enter-scale, 1), + var(--tw-enter-scale, 1), + var(--tw-enter-scale, 1) + ); + } + } + + @keyframes exit { + to { + opacity: var(--tw-exit-opacity, 1); + transform: translate3d( + var(--tw-exit-translate-x, 0), + var(--tw-exit-translate-y, 0), + 0 + ) + scale3d( + var(--tw-exit-scale, 1), + var(--tw-exit-scale, 1), + var(--tw-exit-scale, 1) + ); + } + } +} + +@utility fade-in-* { + --tw-enter-opacity: --value(percentage, ratio); +} +@utility fade-out-* { + --tw-exit-opacity: --value(percentage, ratio); +} + +@utility zoom-in-* { + --tw-enter-scale: --value(percentage, ratio); +} +@utility zoom-out-* { + --tw-exit-scale: --value(percentage, ratio); +} + +@utility slide-in-from-top-* { + --tw-enter-translate-y: calc(--value(percentage) * -1); + --tw-enter-translate-y: calc(--value(ratio) * -100%); + --tw-enter-translate-y: calc(--value(integer) * var(--spacing) * -1); +} + +@utility slide-out-to-top-* { + --tw-exit-translate-y: calc(--value(percentage) * -1); + --tw-exit-translate-y: calc(--value(ratio) * -100%); + --tw-exit-translate-y: calc(--value(integer) * var(--spacing) * -1); +} diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..34b7b3f --- /dev/null +++ b/bun.lock @@ -0,0 +1,1635 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "wxt-solid-starter", + "dependencies": { + "@corvu/dialog": "^0.2.4", + "@corvu/popover": "^0.2.0", + "@tailwindcss/vite": "^4.1.3", + "@typescript-eslint/eslint-plugin": "^8.31.0", + "eslint": "^9.25.1", + "eslint-config-prettier": "^10.1.2", + "eslint-plugin-jsdoc": "^50.6.10", + "eslint-plugin-solid": "^0.14.5", + "lucide-solid": "^0.487.0", + "prettier-plugin-tailwindcss": "^0.6.11", + "remark-breaks": "^4.0.0", + "solid-js": "^1.9.5", + "solid-markdown": "^2.0.14", + "tailwindcss": "^4.1.3", + }, + "devDependencies": { + "@wxt-dev/module-solid": "^1.1.3", + "typescript": "^5.8.3", + "wxt": "^0.20.0", + }, + }, + }, + "trustedDependencies": [ + "spawn-sync", + ], + "packages": { + "@1natsu/wait-element": ["@1natsu/wait-element@4.1.2", "", { "dependencies": { "defu": "^6.1.4", "many-keys-map": "^2.0.1" } }, "sha512-qWxSJD+Q5b8bKOvESFifvfZ92DuMsY+03SBNjTO34ipJLP6mZ9yK4bQz/vlh48aEQXoJfaZBqUwKL5BdI5iiWw=="], + + "@aklinker1/rollup-plugin-visualizer": ["@aklinker1/rollup-plugin-visualizer@5.12.0", "", { "dependencies": { "open": "^8.4.0", "picomatch": "^2.3.1", "source-map": "^0.7.4", "yargs": "^17.5.1" }, "peerDependencies": { "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], + + "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="], + + "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], + + "@babel/generator": ["@babel/generator@7.27.0", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.0", "", { "dependencies": { "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], + + "@babel/helpers": ["@babel/helpers@7.27.0", "", { "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg=="], + + "@babel/parser": ["@babel/parser@7.27.0", "", { "dependencies": { "@babel/types": "^7.27.0" }, "bin": "./bin/babel-parser.js" }, "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="], + + "@babel/runtime": ["@babel/runtime@7.24.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw=="], + + "@babel/template": ["@babel/template@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA=="], + + "@babel/traverse": ["@babel/traverse@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.27.0", "@babel/parser": "^7.27.0", "@babel/template": "^7.27.0", "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA=="], + + "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], + + "@corvu/dialog": ["@corvu/dialog@0.2.4", "", { "dependencies": { "@corvu/utils": "~0.4.2", "solid-dismissible": "~0.1.1", "solid-focus-trap": "~0.1.8", "solid-presence": "~0.2.0", "solid-prevent-scroll": "~0.1.10" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-n54vJq+fOy8GVrnYBdJpD6JXNuyx7LOeMrRxwzAvZnYGpW8+AA12tnb/P/2emJj/HjOO5otheGKb0breshdFlA=="], + + "@corvu/popover": ["@corvu/popover@0.2.0", "", { "dependencies": { "@corvu/dialog": "~0.2.0", "@corvu/utils": "~0.3.0", "@floating-ui/dom": "^1.6.5" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-zynRWyRV7mk2uX7t/COQL4OEa6H6FBgOxxlXLQJ1BV8hTiBJwmfAN/yB/9jy+zlp0G9vp64E8VdsNn6gxUEUEQ=="], + + "@corvu/utils": ["@corvu/utils@0.4.2", "", { "dependencies": { "@floating-ui/dom": "^1.6.11" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA=="], + + "@devicefarmer/adbkit": ["@devicefarmer/adbkit@3.2.6", "", { "dependencies": { "@devicefarmer/adbkit-logcat": "^2.1.2", "@devicefarmer/adbkit-monkey": "~1.2.1", "bluebird": "~3.7", "commander": "^9.1.0", "debug": "~4.3.1", "node-forge": "^1.3.1", "split": "~1.0.1" }, "bin": { "adbkit": "bin/adbkit" } }, "sha512-8lO1hSeTgtxcOHhp4tTWq/JaOysp5KNbbyFoxNEBnwkCDZu/Bji3ZfOaG++Riv9jN6c9bgdLBOZqJTC5VJPRKQ=="], + + "@devicefarmer/adbkit-logcat": ["@devicefarmer/adbkit-logcat@2.1.3", "", {}, "sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw=="], + + "@devicefarmer/adbkit-monkey": ["@devicefarmer/adbkit-monkey@1.2.1", "", {}, "sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg=="], + + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.49.0", "", { "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.1.0" } }, "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.2", "", { "os": "android", "cpu": "x64" }, "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.2", "", { "os": "linux", "cpu": "arm" }, "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.2", "", { "os": "linux", "cpu": "x64" }, "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.2", "", { "os": "none", "cpu": "arm64" }, "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.2", "", { "os": "none", "cpu": "x64" }, "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.6.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.1", "", {}, "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw=="], + + "@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.25.1", "", {}, "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], + + "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], + + "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="], + + "@pnpm/npm-conf": ["@pnpm/npm-conf@2.3.1", "", { "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" } }, "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.40.0", "", { "os": "android", "cpu": "arm" }, "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.40.0", "", { "os": "android", "cpu": "arm64" }, "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.40.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.40.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.40.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.40.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.40.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.40.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.40.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.40.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.0", "", { "os": "win32", "cpu": "x64" }, "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ=="], + + "@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.3", "", { "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.29.2", "tailwindcss": "4.1.3" } }, "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.3", "@tailwindcss/oxide-darwin-arm64": "4.1.3", "@tailwindcss/oxide-darwin-x64": "4.1.3", "@tailwindcss/oxide-freebsd-x64": "4.1.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", "@tailwindcss/oxide-linux-x64-musl": "4.1.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" } }, "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.3", "", { "os": "android", "cpu": "arm64" }, "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3", "", { "os": "linux", "cpu": "arm" }, "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.3", "", { "os": "win32", "cpu": "x64" }, "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.3", "", { "dependencies": { "@tailwindcss/node": "4.1.3", "@tailwindcss/oxide": "4.1.3", "tailwindcss": "4.1.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], + + "@types/filesystem": ["@types/filesystem@0.0.36", "", { "dependencies": { "@types/filewriter": "*" } }, "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA=="], + + "@types/filewriter": ["@types/filewriter@0.0.33", "", {}, "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g=="], + + "@types/har-format": ["@types/har-format@1.2.16", "", {}, "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/minimatch": ["@types/minimatch@3.0.5", "", {}, "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@22.14.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.31.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/type-utils": "8.31.0", "@typescript-eslint/utils": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.31.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/types": "8.31.0", "@typescript-eslint/typescript-estree": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0" } }, "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.31.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.31.0", "@typescript-eslint/utils": "8.31.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.31.0", "", {}, "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/types": "8.31.0", "@typescript-eslint/typescript-estree": "8.31.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@webext-core/fake-browser": ["@webext-core/fake-browser@1.3.2", "", { "dependencies": { "lodash.merge": "^4.6.2" } }, "sha512-jFyPWWz+VkHAC9DRIiIPOyu6X/KlC8dYqSKweHz6tsDb86QawtVgZSpYcM+GOQBlZc5DHFo92jJ7cIq4uBnU0A=="], + + "@webext-core/isolated-element": ["@webext-core/isolated-element@1.1.2", "", { "dependencies": { "is-potential-custom-element-name": "^1.0.1" } }, "sha512-CNHYhsIR8TPkPb+4yqTIuzaGnVn/Fshev5fyoPW+/8Cyc93tJbCjP9PC1XSK6fDWu+xASdPHLZaoa2nWAYoxeQ=="], + + "@webext-core/match-patterns": ["@webext-core/match-patterns@1.0.3", "", {}, "sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A=="], + + "@wxt-dev/browser": ["@wxt-dev/browser@0.0.310", "", { "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" } }, "sha512-0uQlrxUmbEczWFo2KGFTmJlQWpODqMDQOmQmIQGjQiiDs2aE4J6EsVmtmSSCXGMMYQ+jvNR+azf689xOWo0JGw=="], + + "@wxt-dev/module-solid": ["@wxt-dev/module-solid@1.1.3", "", { "dependencies": { "vite-plugin-solid": "^2.10.2" }, "peerDependencies": { "wxt": ">=0.19.16" } }, "sha512-iQthYvhe3OieJTLSq9z6747cYKHZ7XOVX/Cl5Rop/k+gcJ795u0j4lvVs3Tn+55uAC7xEye0eG2sLocaXZDZcg=="], + + "@wxt-dev/storage": ["@wxt-dev/storage@1.1.1", "", { "dependencies": { "async-mutex": "^0.5.0", "dequal": "^2.0.3" } }, "sha512-H1vYWeoWz03INV4r+sLYDFil88b3rgMMfgGp/EXy3bLbveJeiMiFs/G0bsBN2Ra87Iqlf2oVYRb/ABQpAugbew=="], + + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "adm-zip": ["adm-zip@0.5.16", "", {}, "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + + "ansi-escapes": ["ansi-escapes@7.0.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="], + + "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-differ": ["array-differ@4.0.0", "", {}, "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw=="], + + "array-union": ["array-union@3.0.1", "", {}, "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-mutex": ["async-mutex@0.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA=="], + + "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], + + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.39.7", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2", "validate-html-nesting": "^1.2.1" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-8GzVmFla7jaTNWW8W+lTMl9YGva4/06CtwJjySnkYtt8G1v9weCzc2SuF1DfrudcCNb2Doetc1FRg33swBYZCA=="], + + "babel-preset-solid": ["babel-preset-solid@1.9.5", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.39.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-85I3osODJ1LvZbv8wFozROV1vXq32BubqHXAGu73A//TRs3NLI1OFP83AQBUTSQHwgZQmARjHlJciym3we+V+w=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], + + "bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "boxen": ["boxen@7.1.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", "chalk": "^5.2.0", "cli-boxes": "^3.0.0", "string-width": "^5.1.2", "type-fest": "^2.13.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.1.0" } }, "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog=="], + + "bplist-parser": ["bplist-parser@0.2.0", "", { "dependencies": { "big-integer": "^1.6.44" } }, "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw=="], + + "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "bunyan": ["bunyan@1.8.15", "", { "optionalDependencies": { "dtrace-provider": "~0.8", "moment": "^2.19.3", "mv": "~2", "safe-json-stringify": "~1" }, "bin": { "bunyan": "bin/bunyan" } }, "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig=="], + + "c12": ["c12@3.0.3", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^16.4.7", "exsolve": "^1.0.4", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], + + "cacheable-request": ["cacheable-request@10.2.14", "", { "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", "http-cache-semantics": "^4.1.1", "keyv": "^4.5.3", "mimic-response": "^4.0.0", "normalize-url": "^8.0.0", "responselike": "^3.0.0" } }, "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@7.0.1", "", {}, "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001713", "", {}, "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chrome-launcher": ["chrome-launcher@1.1.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^2.0.1" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-rJYWeEAERwWIr3c3mEVXwNiODPEdMRlRxHc47B1qHPOolHZnkj7rMv1QSUfPoG6MgatWj5AxSpnKKR4QEwEQIQ=="], + + "ci-info": ["ci-info@4.2.0", "", {}, "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg=="], + + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-highlight": ["cli-highlight@2.1.11", "", { "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", "mz": "^2.4.0", "parse5": "^5.1.1", "parse5-htmlparser2-tree-adapter": "^6.0.0", "yargs": "^16.0.0" }, "bin": { "highlight": "bin/highlight" } }, "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "comment-parser": ["comment-parser@1.4.1", "", {}, "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="], + + "configstore": ["configstore@6.0.0", "", { "dependencies": { "dot-prop": "^6.0.1", "graceful-fs": "^4.2.6", "unique-string": "^3.0.0", "write-file-atomic": "^3.0.3", "xdg-basedir": "^5.0.1" } }, "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA=="], + + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypto-random-string": ["crypto-random-string@4.0.0", "", { "dependencies": { "type-fest": "^1.0.1" } }, "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA=="], + + "css-select": ["css-select@5.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg=="], + + "css-what": ["css-what@6.1.0", "", {}, "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="], + + "cssom": ["cssom@0.5.0", "", {}, "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "default-browser": ["default-browser@5.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="], + + "default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="], + + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], + + "dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], + + "dotenv-expand": ["dotenv-expand@12.0.1", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ=="], + + "dtrace-provider": ["dtrace-provider@0.8.8", "", { "dependencies": { "nan": "^2.14.0" } }, "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.136", "", {}, "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ=="], + + "emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + + "entities": ["entities@6.0.0", "", {}, "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw=="], + + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-module-lexer": ["es-module-lexer@1.6.0", "", {}, "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="], + + "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + + "esbuild": ["esbuild@0.25.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.2", "@esbuild/android-arm": "0.25.2", "@esbuild/android-arm64": "0.25.2", "@esbuild/android-x64": "0.25.2", "@esbuild/darwin-arm64": "0.25.2", "@esbuild/darwin-x64": "0.25.2", "@esbuild/freebsd-arm64": "0.25.2", "@esbuild/freebsd-x64": "0.25.2", "@esbuild/linux-arm": "0.25.2", "@esbuild/linux-arm64": "0.25.2", "@esbuild/linux-ia32": "0.25.2", "@esbuild/linux-loong64": "0.25.2", "@esbuild/linux-mips64el": "0.25.2", "@esbuild/linux-ppc64": "0.25.2", "@esbuild/linux-riscv64": "0.25.2", "@esbuild/linux-s390x": "0.25.2", "@esbuild/linux-x64": "0.25.2", "@esbuild/netbsd-arm64": "0.25.2", "@esbuild/netbsd-x64": "0.25.2", "@esbuild/openbsd-arm64": "0.25.2", "@esbuild/openbsd-x64": "0.25.2", "@esbuild/sunos-x64": "0.25.2", "@esbuild/win32-arm64": "0.25.2", "@esbuild/win32-ia32": "0.25.2", "@esbuild/win32-x64": "0.25.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-goat": ["escape-goat@4.0.0", "", {}, "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.25.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.25.1", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA=="], + + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@50.6.10", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.49.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports-exports": "^0.2.4", "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-HJRMrRIXjWtDyU6yar8xvdKMc1waSAfE6vRjEWBpws6pYeoVyCFtQQneEBnQkHXOV60idH5ymo/bh1XNBOTQmA=="], + + "eslint-plugin-solid": ["eslint-plugin-solid@0.14.5", "", { "dependencies": { "@typescript-eslint/utils": "^7.13.1 || ^8.0.0", "estraverse": "^5.3.0", "is-html": "^2.0.0", "kebab-case": "^1.0.2", "known-css-properties": "^0.30.0", "style-to-object": "^1.0.6" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "typescript": ">=4.8.4" } }, "sha512-nfuYK09ah5aJG/oEN6P1qziy1zLgW4PDWe75VNPi4CEFYk1x2AEqwFeQfEPR7gNn0F2jOeqKhx2E+5oNCOBYWQ=="], + + "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + + "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + + "exsolve": ["exsolve@1.0.4", "", {}, "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "filesize": ["filesize@10.1.6", "", {}, "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "firefox-profile": ["firefox-profile@4.6.0", "", { "dependencies": { "adm-zip": "~0.5.x", "fs-extra": "~9.0.1", "ini": "~2.0.0", "minimist": "^1.2.5", "xml2js": "^0.5.0" }, "bin": { "firefox-profile": "lib/cli.js" } }, "sha512-I9rAm1w8U3CdhgO4EzTJsCvgcbvynZn9lOySkZf78wUdUIQH2w9QOKf3pAX+THt2XMSSR3kJSuM8P7bYux9j8g=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], + + "formdata-node": ["formdata-node@6.0.3", "", {}, "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg=="], + + "fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "fx-runner": ["fx-runner@1.4.0", "", { "dependencies": { "commander": "2.9.0", "shell-quote": "1.7.3", "spawn-sync": "1.0.15", "when": "3.7.7", "which": "1.2.4", "winreg": "0.0.12" }, "bin": { "fx-runner": "bin/fx-runner" } }, "sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-east-asian-width": ["get-east-asian-width@1.3.0", "", {}, "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ=="], + + "get-port-please": ["get-port-please@3.1.2", "", {}, "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ=="], + + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + + "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], + + "glob": ["glob@6.0.4", "", { "dependencies": { "inflight": "^1.0.4", "inherits": "2", "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="], + + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "got": ["got@12.6.1", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graceful-readlink": ["graceful-readlink@1.0.1", "", {}, "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "growly": ["growly@1.3.0", "", {}, "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-yarn": ["has-yarn@3.0.0", "", {}, "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA=="], + + "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], + + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], + + "html-tags": ["html-tags@3.3.1", "", {}, "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ=="], + + "htmlparser2": ["htmlparser2@10.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.1", "entities": "^6.0.0" } }, "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g=="], + + "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], + + "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], + + "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "import-lazy": ["import-lazy@4.0.0", "", {}, "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw=="], + + "import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], + + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + + "is-absolute": ["is-absolute@0.1.7", "", { "dependencies": { "is-relative": "^0.1.0" } }, "sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-ci": ["is-ci@3.0.1", "", { "dependencies": { "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-html": ["is-html@2.0.0", "", { "dependencies": { "html-tags": "^3.0.0" } }, "sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="], + + "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + + "is-npm": ["is-npm@6.0.0", "", {}, "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], + + "is-primitive": ["is-primitive@3.0.1", "", {}, "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w=="], + + "is-relative": ["is-relative@0.1.3", "", {}, "sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA=="], + + "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "is-yarn-global": ["is-yarn-global@0.4.1", "", {}, "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.1.0", "", {}, "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + + "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], + + "kebab-case": ["kebab-case@1.0.2", "", {}, "sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "known-css-properties": ["known-css-properties@0.30.0", "", {}, "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ=="], + + "latest-version": ["latest-version@7.0.0", "", { "dependencies": { "package-json": "^8.1.0" } }, "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], + + "lighthouse-logger": ["lighthouse-logger@2.0.1", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ=="], + + "lightningcss": ["lightningcss@1.29.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.2", "lightningcss-darwin-x64": "1.29.2", "lightningcss-freebsd-x64": "1.29.2", "lightningcss-linux-arm-gnueabihf": "1.29.2", "lightningcss-linux-arm64-gnu": "1.29.2", "lightningcss-linux-arm64-musl": "1.29.2", "lightningcss-linux-x64-gnu": "1.29.2", "lightningcss-linux-x64-musl": "1.29.2", "lightningcss-win32-arm64-msvc": "1.29.2", "lightningcss-win32-x64-msvc": "1.29.2" } }, "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.2", "", { "os": "linux", "cpu": "arm" }, "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.2", "", { "os": "win32", "cpu": "x64" }, "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA=="], + + "lines-and-columns": ["lines-and-columns@2.0.4", "", {}, "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A=="], + + "linkedom": ["linkedom@0.18.9", "", { "dependencies": { "css-select": "^5.1.0", "cssom": "^0.5.0", "html-escaper": "^3.0.3", "htmlparser2": "^10.0.0", "uhyphen": "^0.2.0" } }, "sha512-Pfvhwjs46nBrcQdauQjMXDJZqj6VwN7KStT84xQqmIgD9bPH6UVJ/ESW8y4VHVF2h7di0/P+f4Iln4U5emRcmg=="], + + "listr2": ["listr2@8.3.2", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g=="], + + "local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="], + + "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], + + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + + "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-solid": ["lucide-solid@0.487.0", "", { "peerDependencies": { "solid-js": "^1.4.7" } }, "sha512-NkmNhrXiHbeihY1kXMFQBlFP2gxdJMI9Jh7/pvrJmX5q1eMgmz+5bLsckwbbnr2RUiCtl2iIk8gRhQ79LRel/Q=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], + + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + + "many-keys-map": ["many-keys-map@2.0.1", "", {}, "sha512-DHnZAD4phTbZ+qnJdjoNEVU1NecYoSdbOOoVmTDH46AuxDkEVh3MxTVpXq10GtcTC6mndN9dkv1rNfpjRcLnOw=="], + + "marky": ["marky@1.2.5", "", {}, "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-newline-to-break": ["mdast-util-newline-to-break@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-find-and-replace": "^3.0.0" } }, "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + + "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], + + "minimatch": ["minimatch@10.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + + "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multimatch": ["multimatch@6.0.0", "", { "dependencies": { "@types/minimatch": "^3.0.5", "array-differ": "^4.0.0", "array-union": "^3.0.1", "minimatch": "^3.0.4" } }, "sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ=="], + + "mv": ["mv@2.1.1", "", { "dependencies": { "mkdirp": "~0.5.1", "ncp": "~2.0.0", "rimraf": "~2.4.0" } }, "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nan": ["nan@2.22.2", "", {}, "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ=="], + + "nano-spawn": ["nano-spawn@0.2.0", "", {}, "sha512-IjZBIOLxSlxu+m/kacg9JuP93oUpRemeV0mEuCy64nzBKKIL9m0aLJHtVPcVuzJDHFhElzjpwbW4a3tMzgKoZQ=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "ncp": ["ncp@2.0.0", "", { "bin": { "ncp": "./bin/ncp" } }, "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA=="], + + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + + "node-notifier": ["node-notifier@10.0.1", "", { "dependencies": { "growly": "^1.3.0", "is-wsl": "^2.2.0", "semver": "^7.3.5", "shellwords": "^0.1.1", "uuid": "^8.3.2", "which": "^2.0.2" } }, "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-url": ["normalize-url@8.0.1", "", {}, "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w=="], + + "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "nypm": ["nypm@0.3.12", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.2.3", "execa": "^8.0.1", "pathe": "^1.1.2", "pkg-types": "^1.2.0", "ufo": "^1.5.4" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], + + "ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "open": ["open@10.1.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw=="], + + "optionator": ["optionator@0.9.4", "", { "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" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], + + "os-shim": ["os-shim@0.1.3", "", {}, "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A=="], + + "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "package-json": ["package-json@8.1.1", "", { "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", "registry-url": "^6.0.0", "semver": "^7.3.7" } }, "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA=="], + + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-imports-exports": ["parse-imports-exports@0.2.4", "", { "dependencies": { "parse-statements": "1.0.11" } }, "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ=="], + + "parse-json": ["parse-json@7.1.1", "", { "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" } }, "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw=="], + + "parse-statements": ["parse-statements@1.0.11", "", {}, "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA=="], + + "parse5": ["parse5@5.1.1", "", {}, "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@6.0.1", "", { "dependencies": { "parse5": "^6.0.1" } }, "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.11", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "promise-toolbox": ["promise-toolbox@0.21.0", "", { "dependencies": { "make-error": "^1.3.2" } }, "sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], + + "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="], + + "publish-browser-extension": ["publish-browser-extension@3.0.0", "", { "dependencies": { "cac": "^6.7.14", "cli-highlight": "^2.1.11", "consola": "^3.2.3", "dotenv": "^16.3.1", "extract-zip": "^2.0.1", "formdata-node": "^6.0.3", "listr2": "^8.0.1", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "ofetch": "^1.3.3", "open": "^9.1.0", "ora": "^6.3.1", "prompts": "^2.4.2", "zod": "^3.22.4" }, "bin": { "publish-extension": "bin/publish-extension.cjs" } }, "sha512-gwjH8mIepNqID2VqKIxzT6lmtvkcc5tcWYzrGSUdkeUFFFSHhGp9xx01EZ7j8wPq50dDe0XU5VNbHMAqr6wWAA=="], + + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "pupa": ["pupa@3.1.0", "", { "dependencies": { "escape-goat": "^4.0.0" } }, "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug=="], + + "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], + + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + + "registry-auth-token": ["registry-auth-token@5.1.0", "", { "dependencies": { "@pnpm/npm-conf": "^2.1.0" } }, "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw=="], + + "registry-url": ["registry-url@6.0.1", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q=="], + + "remark-breaks": ["remark-breaks@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-newline-to-break": "^2.0.0", "unified": "^11.0.0" } }, "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rimraf": ["rimraf@2.4.5", "", { "dependencies": { "glob": "^6.0.1" }, "bin": { "rimraf": "./bin.js" } }, "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ=="], + + "rollup": ["rollup@4.40.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.0", "@rollup/rollup-android-arm64": "4.40.0", "@rollup/rollup-darwin-arm64": "4.40.0", "@rollup/rollup-darwin-x64": "4.40.0", "@rollup/rollup-freebsd-arm64": "4.40.0", "@rollup/rollup-freebsd-x64": "4.40.0", "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", "@rollup/rollup-linux-arm-musleabihf": "4.40.0", "@rollup/rollup-linux-arm64-gnu": "4.40.0", "@rollup/rollup-linux-arm64-musl": "4.40.0", "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-musl": "4.40.0", "@rollup/rollup-linux-s390x-gnu": "4.40.0", "@rollup/rollup-linux-x64-gnu": "4.40.0", "@rollup/rollup-linux-x64-musl": "4.40.0", "@rollup/rollup-win32-arm64-msvc": "4.40.0", "@rollup/rollup-win32-ia32-msvc": "4.40.0", "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w=="], + + "run-applescript": ["run-applescript@7.0.0", "", {}, "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safe-json-stringify": ["safe-json-stringify@1.2.0", "", {}, "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], + + "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "semver-diff": ["semver-diff@4.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA=="], + + "seroval": ["seroval@1.2.1", "", {}, "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw=="], + + "seroval-plugins": ["seroval-plugins@1.2.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw=="], + + "set-value": ["set-value@4.1.0", "", { "dependencies": { "is-plain-object": "^2.0.4", "is-primitive": "^3.0.1" } }, "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.7.3", "", {}, "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw=="], + + "shellwords": ["shellwords@0.1.1", "", {}, "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], + + "solid-dismissible": ["solid-dismissible@0.1.1", "", { "dependencies": { "@corvu/utils": "~0.4.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-9kcKBJIMdS+586cA1g63HYWxKh3h89leeNHbPZ1csYjuni+NvPBtNr11l0iEX2AKKEt6FHk6qNhc/gjoYAW1pA=="], + + "solid-focus-trap": ["solid-focus-trap@0.1.9", "", { "dependencies": { "@corvu/utils": "~0.4.2" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-LTyNki6GUJPRLXV5uMWPkYClB07SUMubbr2EkAddiR0CJCF/I283txilMU9RURSr/P8EewMfXWu2o3aWrK7A5A=="], + + "solid-js": ["solid-js@1.9.5", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", "seroval-plugins": "^1.1.0" } }, "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw=="], + + "solid-markdown": ["solid-markdown@2.0.14", "", { "dependencies": { "comma-separated-tokens": "^2.0.3", "property-information": "^6.3.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "space-separated-tokens": "^2.0.2", "style-to-object": "^0.3.0", "unified": "^11.0.5", "unist-util-visit": "^4.1.2", "vfile": "^6.0.3" }, "peerDependencies": { "solid-js": "^1.6.0" } }, "sha512-Ln8R4TsNWySXvKkS80OHV+CSR/mwjk5XfGvC5UjZo/y/rAbbkBoxt6FXoWsfCkTW6GH9yxYvahSMXsUJU/ov4Q=="], + + "solid-presence": ["solid-presence@0.2.0", "", { "dependencies": { "@corvu/utils": "~0.4.2" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-YM92o+jvpzX3XGaD4rLYmq/Kc2ZVh47GSCLEufHBFQQIurvZTs8SoGJxO8BJGNDxBKdcS8F3dYhW1SDXp4BNjA=="], + + "solid-prevent-scroll": ["solid-prevent-scroll@0.1.10", "", { "dependencies": { "@corvu/utils": "~0.4.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw=="], + + "solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "spawn-sync": ["spawn-sync@1.0.15", "", { "dependencies": { "concat-stream": "^1.4.7", "os-shim": "^0.1.2" } }, "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], + + "split": ["split@1.0.1", "", { "dependencies": { "through": "2" } }, "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg=="], + + "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], + + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-bom": ["strip-bom@5.0.0", "", {}, "sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A=="], + + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "strip-json-comments": ["strip-json-comments@5.0.1", "", {}, "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw=="], + + "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], + + "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "tailwindcss": ["tailwindcss@4.1.3", "", {}, "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g=="], + + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="], + + "titleize": ["titleize@3.0.0", "", {}, "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ=="], + + "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], + + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "uhyphen": ["uhyphen@0.2.0", "", {}, "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unimport": ["unimport@4.2.0", "", { "dependencies": { "acorn": "^8.14.1", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "picomatch": "^4.0.2", "pkg-types": "^2.1.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", "tinyglobby": "^0.2.12", "unplugin": "^2.2.2", "unplugin-utils": "^0.2.4" } }, "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag=="], + + "unique-string": ["unique-string@3.0.0", "", { "dependencies": { "crypto-random-string": "^4.0.0" } }, "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ=="], + + "unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], + + "unplugin-utils": ["unplugin-utils@0.2.4", "", { "dependencies": { "pathe": "^2.0.2", "picomatch": "^4.0.2" } }, "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA=="], + + "untildify": ["untildify@4.0.0", "", {}, "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "update-notifier": ["update-notifier@6.0.2", "", { "dependencies": { "boxen": "^7.0.0", "chalk": "^5.0.1", "configstore": "^6.0.0", "has-yarn": "^3.0.0", "import-lazy": "^4.0.0", "is-ci": "^3.0.1", "is-installed-globally": "^0.4.0", "is-npm": "^6.0.0", "is-yarn-global": "^0.4.0", "latest-version": "^7.0.0", "pupa": "^3.1.0", "semver": "^7.3.7", "semver-diff": "^4.0.0", "xdg-basedir": "^5.1.0" } }, "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "validate-html-nesting": ["validate-html-nesting@1.2.2", "", {}, "sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "vite": ["vite@6.2.6", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw=="], + + "vite-node": ["vite-node@3.1.1", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w=="], + + "vite-plugin-solid": ["vite-plugin-solid@2.11.6", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-Sl5CTqJTGyEeOsmdH6BOgalIZlwH3t4/y0RQuFLMGnvWMBvxb4+lq7x3BSiAw6etf0QexfNJW7HSOO/Qf7pigg=="], + + "vitefu": ["vitefu@1.0.6", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["vite"] }, "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA=="], + + "watchpack": ["watchpack@2.4.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg=="], + + "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + + "web-ext-run": ["web-ext-run@0.2.2", "", { "dependencies": { "@babel/runtime": "7.24.7", "@devicefarmer/adbkit": "3.2.6", "bunyan": "1.8.15", "chrome-launcher": "1.1.0", "debounce": "1.2.1", "es6-error": "4.1.1", "firefox-profile": "4.6.0", "fs-extra": "11.2.0", "fx-runner": "1.4.0", "mkdirp": "3.0.1", "multimatch": "6.0.0", "mz": "2.7.0", "node-notifier": "10.0.1", "parse-json": "7.1.1", "promise-toolbox": "0.21.0", "set-value": "4.1.0", "source-map-support": "0.5.21", "strip-bom": "5.0.0", "strip-json-comments": "5.0.1", "tmp": "0.2.3", "update-notifier": "6.0.2", "watchpack": "2.4.1", "ws": "8.18.0", "zip-dir": "2.0.0" } }, "sha512-GD59q5/1wYQJXTHrljMZaBa3cCz+Jj3FMDLYgKyAa34TPcHSuMaGqp7TcLJ66PCe43C3hmbEAZd8QCpAB34eiw=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "when": ["when@3.7.7", "", {}, "sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="], + + "winreg": ["winreg@0.0.12", "", {}, "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@9.0.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "wxt": ["wxt@0.20.0", "", { "dependencies": { "@1natsu/wait-element": "^4.1.2", "@aklinker1/rollup-plugin-visualizer": "5.12.0", "@webext-core/fake-browser": "^1.3.1", "@webext-core/isolated-element": "^1.1.2", "@webext-core/match-patterns": "^1.0.3", "@wxt-dev/browser": "0.0.310", "@wxt-dev/storage": "^1.0.0", "async-mutex": "^0.5.0", "c12": "^3.0.2", "cac": "^6.7.14", "chokidar": "^4.0.3", "ci-info": "^4.1.0", "consola": "^3.2.3", "defu": "^6.1.4", "dotenv": "^16.4.5", "dotenv-expand": "^12.0.1", "esbuild": "^0.25.0", "fast-glob": "^3.3.2", "filesize": "^10.1.6", "fs-extra": "^11.2.0", "get-port-please": "^3.1.2", "giget": "^1.2.3 || ^2.0.0", "hookable": "^5.5.3", "import-meta-resolve": "^4.1.0", "is-wsl": "^3.1.0", "json5": "^2.2.3", "jszip": "^3.10.1", "linkedom": "^0.18.5", "magicast": "^0.3.5", "minimatch": "^10.0.1", "nano-spawn": "^0.2.0", "normalize-path": "^3.0.0", "nypm": "^0.3.12", "ohash": "^1.1.4", "open": "^10.1.0", "ora": "^8.1.1", "perfect-debounce": "^1.0.0", "picocolors": "^1.1.1", "prompts": "^2.4.2", "publish-browser-extension": "^2.3.0 || ^3.0.0", "scule": "^1.3.0", "unimport": "^3.13.1 || ^4.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "^2.1.4 || ^3.0.0", "web-ext-run": "^0.2.1" }, "bin": { "wxt": "bin/wxt.mjs", "wxt-publish-extension": "bin/wxt-publish-extension.cjs" } }, "sha512-mu7zP/WlDwBfJ1ys9SPhgbu2vTdd0ulSXpHrkOPJR+Crx5MFFMFh1e3SeyzYt0N2AwFnkFUBlja7wqUUL6JPdQ=="], + + "xdg-basedir": ["xdg-basedir@5.1.0", "", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="], + + "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], + + "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zip-dir": ["zip-dir@2.0.0", "", { "dependencies": { "async": "^3.2.0", "jszip": "^3.2.2" } }, "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg=="], + + "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], + + "@aklinker1/rollup-plugin-visualizer/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@corvu/popover/@corvu/utils": ["@corvu/utils@0.3.2", "", { "dependencies": { "@floating-ui/dom": "^1.6.7" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-ZWlyWEE8qV9+CB9OAyo2bTrZGXQN9ZeM+JfYv89zoR+lRACKTDuoOZEdiyL8Uc7U5dUSH1uTqKhTTnaHWb+wZA=="], + + "@devicefarmer/adbkit/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + + "babel-plugin-jsx-dom-expressions/parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "boxen/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "boxen/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "boxen/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "boxen/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "c12/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "cacheable-request/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "cli-highlight/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "config-chain/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], + + "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "eslint/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "firefox-profile/fs-extra": ["fs-extra@9.0.1", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^1.0.0" } }, "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ=="], + + "fx-runner/commander": ["commander@2.9.0", "", { "dependencies": { "graceful-readlink": ">= 1.0.0" } }, "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A=="], + + "fx-runner/which": ["which@1.2.4", "", { "dependencies": { "is-absolute": "^0.1.7", "isexe": "^1.1.1" }, "bin": { "which": "./bin/which" } }, "sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA=="], + + "giget/nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="], + + "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "got/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "is-ci/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "log-symbols/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], + + "log-update/slice-ansi": ["slice-ansi@7.1.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg=="], + + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "mdast-util-find-and-replace/unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "mdast-util-find-and-replace/unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "mdast-util-to-hast/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "multimatch/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "mv/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "node-notifier/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "nypm/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "nypm/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "ora/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], + + "publish-browser-extension/open": ["open@9.1.0", "", { "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^2.2.0" } }, "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg=="], + + "publish-browser-extension/ora": ["ora@6.3.1", "", { "dependencies": { "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" } }, "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ=="], + + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], + + "solid-markdown/style-to-object": ["style-to-object@0.3.0", "", { "dependencies": { "inline-style-parser": "0.1.1" } }, "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "unimport/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "unimport/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "unist-util-is/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "unist-util-visit-parents/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "unplugin/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "unplugin-utils/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "update-notifier/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "web-ext-run/fs-extra": ["fs-extra@11.2.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw=="], + + "widest-line/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@aklinker1/rollup-plugin-visualizer/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "@aklinker1/rollup-plugin-visualizer/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "babel-plugin-jsx-dom-expressions/parse5/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "boxen/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "boxen/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "cli-highlight/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "cli-highlight/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cli-highlight/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "firefox-profile/fs-extra/universalify": ["universalify@1.0.0", "", {}, "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug=="], + + "fx-runner/which/isexe": ["isexe@1.1.2", "", {}, "sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw=="], + + "glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.0.0", "", { "dependencies": { "get-east-asian-width": "^1.0.0" } }, "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA=="], + + "mdast-util-to-hast/unist-util-visit/unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "mdast-util-to-hast/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "multimatch/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "nypm/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "nypm/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "publish-browser-extension/open/default-browser": ["default-browser@4.0.0", "", { "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", "execa": "^7.1.1", "titleize": "^3.0.0" } }, "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA=="], + + "publish-browser-extension/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "publish-browser-extension/ora/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "publish-browser-extension/ora/cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], + + "publish-browser-extension/ora/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], + + "publish-browser-extension/ora/log-symbols": ["log-symbols@5.1.0", "", { "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" } }, "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA=="], + + "publish-browser-extension/ora/stdin-discarder": ["stdin-discarder@0.1.0", "", { "dependencies": { "bl": "^5.0.0" } }, "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="], + + "solid-markdown/style-to-object/inline-style-parser": ["inline-style-parser@0.1.1", "", {}, "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="], + + "widest-line/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cli-highlight/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cli-highlight/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "cli-highlight/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cli-highlight/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "publish-browser-extension/open/default-browser/bundle-name": ["bundle-name@3.0.0", "", { "dependencies": { "run-applescript": "^5.0.0" } }, "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw=="], + + "publish-browser-extension/open/default-browser/default-browser-id": ["default-browser-id@3.0.0", "", { "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" } }, "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA=="], + + "publish-browser-extension/open/default-browser/execa": ["execa@7.2.0", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" } }, "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cli-highlight/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cli-highlight/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript": ["run-applescript@5.0.0", "", { "dependencies": { "execa": "^5.0.0" } }, "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg=="], + + "publish-browser-extension/open/default-browser/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "publish-browser-extension/open/default-browser/execa/human-signals": ["human-signals@4.3.1", "", {}, "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ=="], + + "publish-browser-extension/open/default-browser/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 8f79da9b5d6f70eaab738d67d08d3b2600ca42f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253980 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 { + label?: string; + icon: LucideIcon; + active: boolean; +} + +/** + * Button component + * + * @param props - The button properties + * @param props.label - The label for the button + * @param props.icon - The icon component for the button + * @param props.active - Whether the button is active + * + * @returns The button component + */ +const Button = (props: ButtonProps): JSX.Element => { + const [isHovered, setIsHovered] = createSignal(false); + + // Consider a button to be in expanded state when either hovered or active + const isExpanded = () => isHovered() || props.active; + + return ( + + ); +}; + +export default Button; diff --git a/components/content/Cue.tsx b/components/content/Cue.tsx new file mode 100644 index 0000000..28091a7 --- /dev/null +++ b/components/content/Cue.tsx @@ -0,0 +1,133 @@ +import { formatTime, VttCue } from '@/entrypoints/main.content/utils'; +import { Bookmark } from 'lucide-solid'; +import { Index, JSX, Show, createMemo } from 'solid-js'; +import { useBookmarks } from '@/context/BookmarkProvider'; + +interface CueProps extends VttCue { + onClick: () => void; + highlight: () => string; +} + +/** + * Cue component displays a single VTT cue with a timestamp and text. + * + * @param props - The props object. + * @returns The Cue component. + */ +const Cue = (props: CueProps): JSX.Element => { + const { addBookmark, removeBookmark, isBookmarked } = useBookmarks(); + + const getParts = createMemo(() => { + if (!props.highlight() || props.highlight().trim() === '') { + return [{ text: props.text, isMatch: false }]; + } + + try { + const trimmedHighlight = props.highlight().trim(); + const lowercaseText = props.text.toLowerCase(); + const lowercaseHighlight = trimmedHighlight.toLowerCase(); + + const parts = []; + let lastIndex = 0; + + let index = lowercaseText.indexOf(lowercaseHighlight, lastIndex); + + while (index !== -1) { + // Add non-matching part before the match + if (index > lastIndex) { + parts.push({ + text: props.text.substring(lastIndex, index), + isMatch: false, + }); + } + + // Add matching part + parts.push({ + text: props.text.substring(index, index + trimmedHighlight.length), + isMatch: true, + }); + + lastIndex = index + trimmedHighlight.length; + index = lowercaseText.indexOf(lowercaseHighlight, lastIndex); + } + + // Add remaining text after the last match + if (lastIndex < props.text.length) { + parts.push({ + text: props.text.substring(lastIndex), + isMatch: false, + }); + } + + return parts; + } catch (e) { + console.error('Error parsing highlight:', e); + // In case of error, return the full text + return [{ text: props.text, isMatch: false }]; + } + }); + + const onBookmarkClick = (e: MouseEvent) => { + e.stopPropagation(); + + if (isBookmarked(props.id)) { + removeBookmark(props.id); + } else { + addBookmark({ id: props.id, start: props.start, text: props.text }); + } + }; + + const bookmarkState = () => isBookmarked(props.id); + + return ( +
{ + props.onClick(); + }} + onKeyDown={e => { + if (e.key === 'Enter' || e.key === ' ') { + props.onClick(); + } + }} + data-cue-id={props.id} + > +
+

{formatTime(props.start)}

+ + +
+
+ + {part => ( + + {part().text} + + )} + +
+
+ ); +}; + +export default Cue; diff --git a/components/content/TopBar.tsx b/components/content/TopBar.tsx new file mode 100644 index 0000000..707150c --- /dev/null +++ b/components/content/TopBar.tsx @@ -0,0 +1,32 @@ +import { ChevronsRight } from 'lucide-solid'; +import { JSX } from 'solid-js/jsx-runtime'; + +interface TopBarProps { + toggleSidebar: () => void; +} +/** + * TopBar component displays the title and a button to toggle the sidebar. + * + * @param props - The props object. + * @returns The TopBar component. + */ +const TopBar = (props: TopBarProps): JSX.Element => { + return ( +
+

+ UT Lectures+ +

+ + +
+ ); +}; + +export default TopBar; diff --git a/components/content/Transcription.tsx b/components/content/Transcription.tsx new file mode 100644 index 0000000..a952b1e --- /dev/null +++ b/components/content/Transcription.tsx @@ -0,0 +1,260 @@ +import { VttCue } from '@/entrypoints/main.content/utils'; +import Cue from './Cue'; +import { RotateCw } from 'lucide-solid'; +import { createMemo, For, Show, createEffect, Accessor, JSX } from 'solid-js'; +import { useBookmarks } from '@/context/BookmarkProvider'; +import { clearSelectedAction, state } from '@/context/SelectedActionStore'; +import SearchStore from '@/context/SearchStore'; +import AISummaryStore from '@/context/AISummaryStore'; +import { SolidMarkdown } from 'solid-markdown'; +import remarkBreaks from 'remark-breaks'; + +type TranscriptionProps = { + ref?: HTMLDivElement; + videoElement: () => HTMLVideoElement | undefined; + cues: () => VttCue[]; + overlayStyles: () => { + top: number; + height: number; + opacity: number; + }; + autoScroll: () => boolean; + setAutoScroll: (value: boolean) => void; + isScrolledToBottom: () => boolean; + isAnimatingOut: () => boolean; + handleSyncClick: () => void; + onWheel: (e: WheelEvent) => void; + vttUrl: Accessor; +}; + +/** + * Transcription component displays a list of VTT cues (subtitles) and provides functionality for searching, bookmarking, and syncing with video playback. + * + * @param props - The props object containing various properties and functions. + * @returns The Transcription component. + */ +const Transcription = (props: TranscriptionProps): JSX.Element => { + const { setCurrentUrl, isBookmarked } = useBookmarks(); + + // Make trimmedQuery a memo to ensure reactivity + const trimmedQuery = () => SearchStore.query.trim(); + + // When vttUrl is set, update bookmarks current url + createEffect(() => { + const url = props.vttUrl(); + + if (url != null) { + setCurrentUrl(url); + } + }); + + // Track search state changes + createEffect(() => { + if (state.selectedAction === 'search') { + props.setAutoScroll(false); // Disable auto-scroll when search is active + } + }); + + // Create a filtered list of cues based on search query or bookmark + const filteredCues = createMemo(() => { + if (state.selectedAction === 'bookmarks') { + return props.cues().filter(cue => isBookmarked(cue.id)); + } + + if (!trimmedQuery()) return props.cues(); + + return props.cues().filter(cue => cue.text.toLowerCase().includes(trimmedQuery().toLowerCase())); + }); + + return ( + 0} + fallback={
Loading transcript...
} + > +
+ + + + + ); +}; + +export default PlaybackRate; diff --git a/components/content/quick-actions/QuickActions.tsx b/components/content/quick-actions/QuickActions.tsx new file mode 100644 index 0000000..53cc5a5 --- /dev/null +++ b/components/content/quick-actions/QuickActions.tsx @@ -0,0 +1,229 @@ +import { Bookmark, Download, Search, X } from 'lucide-solid'; +import Button from '../Button'; +import { Accessor, createSignal, JSX, Show } from 'solid-js'; +import SearchStore from '@/context/SearchStore'; +import PlaybackRate from './PlaybackRate'; +import { QuickActionType, state, setSelectedAction } from '@/context/SelectedActionStore'; +import AISummary from './AISummary'; + +interface QuickActionProps { + uiContainer: HTMLElement; + setAutoScroll: (value: boolean) => void; + vttUrl: Accessor; +} + +/** + * QuickActions component provides a set of quick action buttons for the user interface. + * + * @param props - The props object. + * @returns The QuickActions component. + */ +const QuickActions = (props: QuickActionProps): JSX.Element => { + const [isClosing, setIsClosing] = createSignal(false); + const { setQuery, clear } = SearchStore; + + let searchContainerRef: HTMLDivElement | undefined; + + const openSearch = () => { + setIsClosing(false); + setSelectedAction('search'); + + // Wait for animation to complete before focusing + setTimeout(() => { + const input = props.uiContainer.querySelector('#search-input') as HTMLInputElement; + if (input) input.focus(); + }, 300); + }; + + const closeSearch = () => { + if (searchContainerRef) { + setIsClosing(true); + + // Force a style recalculation to ensure animation runs + searchContainerRef.style.animation = 'none'; + searchContainerRef.style.animation = 'var(--animate-collapse)'; + + // Wait for the closing animation to finish before actually hiding + setTimeout(() => { + setSelectedAction(null); + clear(); + setIsClosing(false); + props.setAutoScroll(true); + }, 300); + } + }; + + const handleButtonClick = (buttonType: QuickActionType) => { + // Save the current scroll position + + if (state.selectedAction === buttonType) { + setSelectedAction(null); + } else { + setSelectedAction(buttonType); + } + }; + + const convertVttToTxt = (vttContent: string): string => { + // Split by lines + const lines = vttContent.split('\n'); + let textOutput = ''; + let isHeader = true; + let lastLineWasEmpty = false; + + for (const line of lines) { + const trimmedLine = line.trim(); + + // Skip WebVTT header + if (isHeader && line.includes('WEBVTT')) { + isHeader = false; + continue; + } + + // Skip timestamp lines (they contain --> or are just numbers) + if (line.includes('-->') || /^\d+$/.test(trimmedLine)) { + continue; + } + + // Handle empty lines - preserve paragraph breaks + if (trimmedLine === '') { + // Only add one empty line to avoid multiple consecutive empty lines + if (!lastLineWasEmpty) { + textOutput += '\n'; + lastLineWasEmpty = true; + } + continue; + } + + // Add actual text content + if (trimmedLine.length > 0) { + textOutput += trimmedLine + '\n'; + lastLineWasEmpty = false; + } + } + + return textOutput; + }; + + return ( +
+ +
+
+ +
+
+
+ } + > +
+
+ + { + setQuery((e.target as HTMLInputElement).value); + if (e.target.value === '') { + setSelectedAction(null); + } + }} + placeholder='Search transcript...' + class='w-full flex-1 border-none bg-transparent text-sm outline-none' + /> +
+ + + + +
+ + + ); +}; + +export default QuickActions; diff --git a/context/AISummaryStore.tsx b/context/AISummaryStore.tsx new file mode 100644 index 0000000..b85c5ad --- /dev/null +++ b/context/AISummaryStore.tsx @@ -0,0 +1,113 @@ +import { createStore } from 'solid-js/store'; +import { storage } from '#imports'; + +// Define a storage item for AI summaries with versioning support +const summaryStorage = storage.defineItem>('local:ai-summaries', { + fallback: {}, // Default to empty object if not found + version: 1, // Start with version 1 for future-proofing +}); + +// Create the store with url-to-summary mapping and current summary +const [state, setState] = createStore<{ + summaries: Record; + currentUrl: string; + currentSummary: string; + open: boolean; +}>({ + summaries: {}, + currentUrl: '', + currentSummary: '', + open: false, +}); + +// Load summaries from storage on initialization +async function loadSummaries() { + try { + const storedSummaries = await summaryStorage.getValue(); + if (storedSummaries) { + setState('summaries', storedSummaries); + } + } catch (error) { + console.error('Failed to load AI summaries:', error); + } +} + +// Save summaries to storage +async function saveSummaries() { + try { + await summaryStorage.setValue(state.summaries); + } catch (error) { + console.error('Failed to save AI summaries:', error); + } +} + +// Initialize by loading summaries +loadSummaries(); + +const AISummaryStore = { + // Getters + get currentSummary(): string { + return state.currentSummary; + }, + + get currentUrl(): string { + return state.currentUrl; + }, + + get summaries(): Record { + return state.summaries; + }, + + // Methods + setCurrentUrl(url: string): void { + setState('currentUrl', url); + + // Update current summary based on URL + const existingSummary = state.summaries[url] || ''; + setState('currentSummary', existingSummary); + }, + + setSummary(summary: string): void { + if (!state.currentUrl) { + console.warn('Cannot save summary: No current URL set'); + return; + } + + setState('currentSummary', summary); + setState('summaries', prev => ({ + ...prev, + [state.currentUrl]: summary, + })); + + // Persist to storage + saveSummaries(); + }, + + getSummaryForUrl(url: string): string { + return state.summaries[url] || ''; + }, + + clearCurrentSummary(): void { + setState('currentSummary', ''); + }, + + clearAllSummaries(): void { + setState('summaries', {}); + setState('currentSummary', ''); + saveSummaries(); + }, + + toggleOpen(): void { + setState('open', prev => !prev); + }, + + setOpen(value: boolean): void { + setState('open', value); + }, + + isOpen(): boolean { + return state.open; + }, +}; + +export default AISummaryStore; diff --git a/context/BookmarkProvider.tsx b/context/BookmarkProvider.tsx new file mode 100644 index 0000000..d8012e4 --- /dev/null +++ b/context/BookmarkProvider.tsx @@ -0,0 +1,159 @@ +import { createContext, useContext, JSX, createEffect, onMount, onCleanup } from 'solid-js'; +import { createStore } from 'solid-js/store'; +import { storage } from '#imports'; + +interface Bookmark { + id: string; + start: number; + text: string; +} + +interface BookmarksByUrl { + [url: string]: Bookmark[]; +} + +interface BookmarkContextValue { + bookmarks: Bookmark[]; + currentUrl: string; + setCurrentUrl: (url: string) => void; + addBookmark: (bookmark: Bookmark) => void; + removeBookmark: (id: string) => void; + isBookmarked: (id: string) => boolean; +} + +// Define a storage item for bookmarks with versioning support +const bookmarksStorage = storage.defineItem('local:bookmarks-by-url', { + fallback: {}, // Default to empty object if not found + version: 1, // Start with version 1 for future-proofing +}); + +const BookmarkContext = createContext({ + bookmarks: [], + currentUrl: '', + setCurrentUrl: () => {}, + addBookmark: () => {}, + removeBookmark: () => {}, + isBookmarked: () => false, +}); + +/** + * This provider manages bookmarks for the current URL. + * + * @param props - The props object. + * @param props.children - The child components to be rendered within the provider. + * @returns The BookmarkProvider component. + */ +export function BookmarkProvider(props: { children: JSX.Element }): JSX.Element { + // Store all bookmarks organized by URL + const [allBookmarks, setAllBookmarks] = createStore({}); + + // Store the current URL and its bookmarks + const [state, setState] = createStore({ + currentUrl: '', + bookmarks: [] as Bookmark[], + }); + + // Save bookmarks to storage + const saveBookmarks = async () => { + if (state.bookmarks.length === 0) { + console.warn('No bookmarks to save'); + return; + } + + // Add bookmarks for the current URL to the allBookmarks object + const currentUrl = state.currentUrl; + if (currentUrl) { + const currentBookmarks = state.bookmarks; + setAllBookmarks(prev => ({ + ...prev, + [currentUrl]: currentBookmarks, + })); + } + + try { + await bookmarksStorage.setValue(allBookmarks); + console.warn('Bookmarks saved to storage'); + } catch (error) { + console.error('Failed to save bookmarks:', error); + } + }; + + // Load all bookmarks from storage on mount + onMount(async () => { + const storedBookmarks = await bookmarksStorage.getValue(); + console.warn('Loaded bookmarks from storage:', storedBookmarks); + if (storedBookmarks) { + setAllBookmarks(storedBookmarks); + } + + // Add event listener for when the user is about to close the tab or navigate away + window.addEventListener('beforeunload', saveBookmarks); + + // Add event listener for when the page becomes hidden (user switches tabs) + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'hidden') { + saveBookmarks(); + } + }); + }); + + // Clean up event listeners when component unmounts + onCleanup(() => { + window.removeEventListener('beforeunload', saveBookmarks); + document.removeEventListener('visibilitychange', saveBookmarks); + + // Final save when component unmounts + saveBookmarks(); + }); + + // Update current bookmarks whenever the URL changes + createEffect(() => { + const url = state.currentUrl; + if (url) { + const urlBookmarks = allBookmarks[url] || []; + setState('bookmarks', urlBookmarks); + } + }); + + const setCurrentUrl = (url: string) => { + setState('currentUrl', url); + }; + + const addBookmark = (bookmark: Bookmark) => { + setState('bookmarks', prev => [...prev, bookmark]); + }; + + const removeBookmark = (id: string) => { + setState('bookmarks', prev => prev.filter(b => b.id !== id)); + }; + + const isBookmarked = (id: string) => { + return state.bookmarks.some(bookmark => bookmark.id === id); + }; + + return ( + + {props.children} + + ); +} + +/** + * This hook provides access to the bookmark context. + * + * @returns The bookmark context value. + */ +export const useBookmarks = (): BookmarkContextValue => useContext(BookmarkContext); diff --git a/context/SearchStore.tsx b/context/SearchStore.tsx new file mode 100644 index 0000000..52cadae --- /dev/null +++ b/context/SearchStore.tsx @@ -0,0 +1,20 @@ +import { createStore } from 'solid-js/store'; + +// Create the store +const [state, setState] = createStore({ + query: '', +}); + +const SearchStore = { + get query(): string { + return state.query; + }, + setQuery(newQuery: string): void { + setState({ query: newQuery }); + }, + clear(): void { + setState({ query: '' }); + }, +}; + +export default SearchStore; diff --git a/context/SelectedActionStore.tsx b/context/SelectedActionStore.tsx new file mode 100644 index 0000000..b5b66e4 --- /dev/null +++ b/context/SelectedActionStore.tsx @@ -0,0 +1,34 @@ +import { createStore } from 'solid-js/store'; + +export type QuickActionType = 'search' | 'playback' | 'bookmarks' | 'ai-summary' | null; + +const [state, setState] = createStore({ + selectedAction: null as QuickActionType, +}); + +/** + * This store manages the selected action for the quick action menu. + * + * @param action - The action to set. + */ +function setSelectedAction(action: QuickActionType): void { + setState('selectedAction', action); +} + +/** + * This function clears the selected action. + */ +function clearSelectedAction(): void { + setState('selectedAction', null); +} + +/** + * This function toggles the selected action. + * + * @param action - The action to toggle. + */ +function toggleSelectedAction(action: QuickActionType): void { + setState('selectedAction', prev => (prev === action ? null : action)); +} + +export { state, setSelectedAction, clearSelectedAction, toggleSelectedAction }; diff --git a/entrypoints/background.ts b/entrypoints/background.ts new file mode 100644 index 0000000..98ccac0 --- /dev/null +++ b/entrypoints/background.ts @@ -0,0 +1,100 @@ +import { defineBackground, Browser, browser } from '#imports'; + +export default defineBackground(() => { + // Store active connections from content scripts + const connections: Record = {}; + // Track if the listener is currently active + let isListenerActive = false; + + // Define the listener function separately so we can reference it for removal + const requestListener = (details: Browser.webRequest.WebRequestBodyDetails) => { + if (details.url.endsWith('.vtt')) { + const url = new URL(details.url); + getVTTFile(url.toString()) + .then(async text => { + // Remove the listener after successfully getting the VTT file + browser.webRequest.onBeforeRequest.removeListener(requestListener); + isListenerActive = false; + + const message = { + type: 'vtt-file', + data: text, + url: details.url, + }; + + // Send the message to the newly connected content script as it will have a separate transcript from the other tabs + const currentTab = await browser.tabs.query({ + active: true, + currentWindow: true, + }); + const currentTabId = currentTab[0]?.id; + + if (currentTabId && connections[currentTabId]) { + connections[currentTabId].postMessage(message); + } + }) + .catch(error => { + console.error('Error fetching VTT file:', error); + }); + } + }; + + const addVTTListener = () => { + if (!isListenerActive) { + browser.webRequest.onBeforeRequest.addListener(requestListener, { urls: ['*://*.la.utexas.edu/*'] }, [ + 'requestBody', + ]); + isListenerActive = true; + console.warn('VTT file listener added'); + } + }; + + // Listen for connection attempts from content scripts + browser.runtime.onConnect.addListener(port => { + const sender = port.sender; + const tabId = sender?.tab?.id; + + if (!tabId) { + return; + } + + // Store the connection + connections[tabId] = port; + console.warn(`Connected to tab ${tabId}`); + + // Ensure the VTT listener is active when a new connection is made + addVTTListener(); + + // Remove connection when it's disconnected + port.onDisconnect.addListener(() => { + delete connections[tabId]; + console.warn(`Disconnected from tab ${tabId}`); + }); + + // Listen for messages from this port + port.onMessage.addListener(message => { + console.warn(`Message from tab ${tabId}:`, message); + // Handle any messages from content script if needed + }); + }); + + const getVTTFile = async (url: string) => { + const response = await fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'text/vtt', + }, + }); + + if (response.ok) { + const vttText = await response.text(); + return vttText; + } else { + console.error('Failed to fetch VTT file:', response.status); + throw new Error('Failed to fetch VTT file'); + } + }; + + // Initialize the listener + addVTTListener(); +}); diff --git a/entrypoints/injected.content/index.ts b/entrypoints/injected.content/index.ts new file mode 100644 index 0000000..e9e7a22 --- /dev/null +++ b/entrypoints/injected.content/index.ts @@ -0,0 +1,8 @@ +import { defineContentScript } from '#imports'; +import './injected.css'; + +export default defineContentScript({ + matches: ['*://*.la.utexas.edu/*'], + cssInjectionMode: 'manifest', + async main() {}, +}); diff --git a/entrypoints/injected.content/injected.css b/entrypoints/injected.content/injected.css new file mode 100644 index 0000000..3a5a2e0 --- /dev/null +++ b/entrypoints/injected.content/injected.css @@ -0,0 +1,10 @@ +body { + display: flex; + flex-direction: row; + gap: 1rem; + background-color: oklch(98.4% 0.003 247.858); +} + +#video_app { + flex-grow: 1; +} diff --git a/entrypoints/main.content/App.tsx b/entrypoints/main.content/App.tsx new file mode 100644 index 0000000..18a6566 --- /dev/null +++ b/entrypoints/main.content/App.tsx @@ -0,0 +1,362 @@ +import { ChevronLeft } from 'lucide-solid'; +import { createEffect, Show, Accessor, createSignal, onCleanup, onMount, JSX } from 'solid-js'; +import { parseVtt } from './utils'; +import { useCueSync } from './hooks/useCueSync'; +import { useTranscriptionScroll } from './hooks/useTranscriptionScroll'; +import TopBar from '@/components/content/TopBar'; +import Transcription from '@/components/content/Transcription'; +import QuickActions from '@/components/content/quick-actions/QuickActions'; +import { BookmarkProvider } from '@/context/BookmarkProvider'; +import { state, setSelectedAction } from '@/context/SelectedActionStore'; +import SearchStore from '@/context/SearchStore'; + +interface AppProps { + vttData: Accessor; + vttUrl: Accessor; + videoElement: Accessor; + uiContainer: HTMLElement; +} + +/** + * Main application component for the UT Lectures Plus content script. + * Manages video playback synchronization with transcription and provides UI for interaction. + * + * @param props - Component properties including VTT data, URL, video element, and UI container + * @returns The rendered application component + */ +const App = (props: AppProps): JSX.Element => { + const { + cues, + setCues, + playing, + setPlaying, + currentTime, + setCurrentTime, + activeCueId, + setActiveCueId, + activeCueElement, + setActiveCueElement, + } = useCueSync(); + + const { autoScroll, setAutoScroll, isScrolledToBottom, setIsScrolledToBottom } = useTranscriptionScroll(); + + const [sidebarOpen, setSidebarOpen] = createSignal(true); + const [animating, setAnimating] = createSignal(false); + const [isAnimatingOut, setIsAnimatingOut] = createSignal(false); + const [sidebarWidth, setSidebarWidth] = createSignal(320); + const [isDragging, setIsDragging] = createSignal(false); + + const [overlayStyles, setOverlayStyles] = createSignal({ + top: 0, + height: 0, + opacity: 0, + }); + + const { clear } = SearchStore; + + let transcriptContainerRef!: HTMLDivElement; + let sidebarRef!: HTMLDivElement; + let overlayUpdateInterval: number; + + const updateOverlayPosition = () => { + const element = activeCueElement(); + if (element) { + const cueRect = element.getBoundingClientRect(); + const top = element.offsetTop; + const height = cueRect.height; + + setOverlayStyles({ + top, + height, + opacity: 1, + }); + } + }; + + const scrollToActiveCue = () => { + const element = activeCueElement(); + if (element) { + const container = transcriptContainerRef; + const cueTop = element.getBoundingClientRect().top; + const containerTop = container.getBoundingClientRect().top; + + const padding = 8; // Adjust this value as needed + + // Scroll to the active element + container.scrollTo({ + top: cueTop - containerTop + container.scrollTop - padding, + behavior: 'smooth', + }); + } + }; + + const autoScrollHandler = (interval: number) => { + return setInterval(() => { + if (state.selectedAction === 'search' || !autoScroll() || !playing()) { + return; + } + + scrollToActiveCue(); + }, interval); + }; + + const handleDragStart = (e: MouseEvent) => { + e.preventDefault(); + setIsDragging(true); + document.body.style.userSelect = 'none'; + document.body.style.cursor = 'ew-resize'; + }; + + const handleDrag = (e: MouseEvent) => { + if (!isDragging()) return; + + // Calculate width based on the distance from the right edge of the screen + const newWidth = window.innerWidth - e.clientX; + + // Set minimum and maximum width constraints + const minWidth = 275; + const maxWidth = window.innerWidth * 0.3; // 30% of the screen width + + if (newWidth >= minWidth && newWidth <= maxWidth) { + setSidebarWidth(newWidth); + } + }; + + const handleDragEnd = () => { + setIsDragging(false); + document.body.style.userSelect = ''; + document.body.style.cursor = ''; + }; + + // Set up event listeners for video time updates and play/pause events + createEffect(() => { + const video = props.videoElement(); + if (!video) return; + + const handleTimeUpdate = (): void => { + setCurrentTime(video.currentTime); + }; + + video.addEventListener('timeupdate', handleTimeUpdate); + + video.addEventListener('play', () => { + setPlaying(true); + }); + + video.addEventListener('pause', () => { + setPlaying(false); + }); + }); + + // Parse VTT data and set cues + createEffect(() => { + const data = props.vttData(); + if (data) { + const parsedCues = parseVtt(data); + setCues(parsedCues); + } + }); + + // Determine the active cue based on current time + createEffect(() => { + const time = currentTime(); + const allCues = cues(); + + const activeCue = allCues.find(cue => time >= cue.start && time <= cue.end); + + if (activeCue) { + setActiveCueId(activeCue.id); + } else { + setActiveCueId(null); + } + }); + + // Add event listeners for drag operations + createEffect(() => { + if (sidebarOpen()) { + document.addEventListener('mousemove', handleDrag); + document.addEventListener('mouseup', handleDragEnd); + + onCleanup(() => { + document.removeEventListener('mousemove', handleDrag); + document.removeEventListener('mouseup', handleDragEnd); + }); + } + }); + + // Set up auto-scrolling with interval + onMount(() => { + const scrollInterval = autoScrollHandler(500); + + // Set up interval for updating overlay position every 100ms + overlayUpdateInterval = window.setInterval(updateOverlayPosition, 100); + + // Use createEffect for reactive tracking instead of setInterval + createEffect(() => { + const id = activeCueId(); + if (id) { + const element = props.uiContainer.querySelector(`[data-cue-id="${id}"]`) as HTMLDivElement; + setActiveCueElement(element); + } else { + setActiveCueElement(null); + setOverlayStyles(prev => ({ ...prev, opacity: 0 })); + } + }); + + // Set initial sidebar state with animation + if (sidebarRef) { + // Start with opacity 0 to prevent flash + sidebarRef.style.opacity = '0'; + + // Apply animation after a short delay to ensure DOM is ready + setTimeout(() => { + sidebarRef.style.opacity = '1'; + sidebarRef.style.animation = 'var(--animate-slide-in)'; + }, 100); + } + + onCleanup(() => { + clearInterval(scrollInterval); + clearInterval(overlayUpdateInterval); + }); + }); + + onCleanup(() => { + const video = props.videoElement(); + if (video) { + video.removeEventListener('timeupdate', () => {}); + video.removeEventListener('play', () => {}); + video.removeEventListener('pause', () => {}); + } + }); + + const handleManualScroll = () => { + if (autoScroll() && playing()) { + setAutoScroll(false); + } + + // Check if scrolled to bottom + if (transcriptContainerRef) { + const { scrollTop, scrollHeight, clientHeight } = transcriptContainerRef; + setIsScrolledToBottom(scrollTop + clientHeight >= scrollHeight - 1); + } + }; + + const handleSyncClick = () => { + // First set animating state to trigger animation + setIsAnimatingOut(true); + + // Scroll to the active cue element + const activeElement = activeCueElement(); + if (activeElement) { + const container = transcriptContainerRef; + const cueTop = activeElement.getBoundingClientRect().top; + const containerTop = container.getBoundingClientRect().top; + + const padding = 8; // Adjust this value as needed + + // Scroll to the active element + container.scrollTo({ + top: cueTop - containerTop + container.scrollTop - padding, + behavior: 'smooth', + }); + } + + // Then set autoScroll after animation completes + setTimeout(() => { + setAutoScroll(true); + setIsAnimatingOut(false); + }, 300); // Match to animation duration + }; + + const toggleSidebar = () => { + if (animating()) return; + + setAnimating(true); + + if (sidebarOpen()) { + sidebarRef.style.animation = 'var(--animate-slide-out)'; + setTimeout(() => { + setSidebarOpen(false); + setAnimating(false); + setSelectedAction(null); + clear(); + }, 300); + } else { + setSidebarOpen(true); + sidebarRef.style.opacity = '0'; // Hide immediately to prevent flash + + // We need to wait for the next render cycle before applying the animation + setTimeout(() => { + if (sidebarRef) { + sidebarRef.style.opacity = '1'; + sidebarRef.style.animation = 'var(--animate-slide-in)'; + setTimeout(() => setAnimating(false), 300); + } + }, 10); + } + }; + + return ( + <> + +
+ {/* Add drag handle to left side */} +
+ + + + + + + + +
+ + + +
+ +
+
+ + {/* Optional overlay for smooth dragging */} + +
+ + + ); +}; + +export default App; diff --git a/entrypoints/main.content/hooks/useCueSync.ts b/entrypoints/main.content/hooks/useCueSync.ts new file mode 100644 index 0000000..d7dbc3a --- /dev/null +++ b/entrypoints/main.content/hooks/useCueSync.ts @@ -0,0 +1,42 @@ +import { Accessor, Setter, createSignal } from 'solid-js'; +import { VttCue } from '../utils'; + +interface CueSync { + cues: Accessor; + setCues: Setter; + currentTime: Accessor; + setCurrentTime: Setter; + playing: Accessor; + setPlaying: Setter; + activeCueId: Accessor; + setActiveCueId: Setter; + activeCueElement: Accessor; + setActiveCueElement: Setter; +} + +/** + * Hook that manages VTT cue synchronization with video playback. + * Provides signals for cues, current time, playback status, and active cue tracking. + * + * @returns Object containing signals for cues management and their setters. + */ +export function useCueSync(): CueSync { + const [cues, setCues] = createSignal([]); + const [currentTime, setCurrentTime] = createSignal(0); + const [playing, setPlaying] = createSignal(false); + const [activeCueId, setActiveCueId] = createSignal(null); + const [activeCueElement, setActiveCueElement] = createSignal(null); + + return { + cues, + setCues, + currentTime, + setCurrentTime, + playing, + setPlaying, + activeCueId, + setActiveCueId, + activeCueElement, + setActiveCueElement, + }; +} diff --git a/entrypoints/main.content/hooks/useTranscriptionScroll.ts b/entrypoints/main.content/hooks/useTranscriptionScroll.ts new file mode 100644 index 0000000..5c2ad7b --- /dev/null +++ b/entrypoints/main.content/hooks/useTranscriptionScroll.ts @@ -0,0 +1,26 @@ +import { Accessor, createSignal, Setter } from 'solid-js'; + +interface TranscriptionScroll { + autoScroll: Accessor; + setAutoScroll: Setter; + isScrolledToBottom: Accessor; + setIsScrolledToBottom: Setter; +} + +/** + * Hook that manages transcription auto-scrolling state. + * Provides signals for controlling automatic scrolling behavior and tracking scroll position. + * + * @returns Object containing autoScroll and isScrolledToBottom signals and their setters. + */ +export function useTranscriptionScroll(): TranscriptionScroll { + const [autoScroll, setAutoScroll] = createSignal(true); + const [isScrolledToBottom, setIsScrolledToBottom] = createSignal(false); + + return { + autoScroll, + setAutoScroll, + isScrolledToBottom, + setIsScrolledToBottom, + }; +} diff --git a/entrypoints/main.content/index.tsx b/entrypoints/main.content/index.tsx new file mode 100644 index 0000000..6a66604 --- /dev/null +++ b/entrypoints/main.content/index.tsx @@ -0,0 +1,113 @@ +import '~/assets/tailwind.css'; +import { render } from 'solid-js/web'; +import App from './App.tsx'; +import { createSignal } from 'solid-js'; +import { createShadowRootUi } from 'wxt/utils/content-script-ui/shadow-root'; +import { browser, defineContentScript } from '#imports'; +export default defineContentScript({ + matches: ['*://*.la.utexas.edu/*'], + cssInjectionMode: 'ui', + async main(ctx) { + // Create a signal to store the VTT data + const [vttData, setVttData] = createSignal(null); + const [vttUrl, setVttUrl] = createSignal(null); + const [videoElement, setVideoElement] = createSignal(); + + // Create a connection to the background script + const port = browser.runtime.connect({ name: 'content-script-connection' }); + + // Listen for messages on the port + port.onMessage.addListener(message => { + if (message.type === 'vtt-file') { + setVttData(message.data); + setVttUrl(message.url); + } + }); + + // Clean up when the content script is invalidated + ctx.onInvalidated(() => { + port.disconnect(); + }); + + const waitForVideoAndSetup = (): void => { + const observer = new MutationObserver((mutations, obs) => { + const videoContainer = document.querySelector('.video-js') as HTMLElement; + const progressBar = document.querySelector('.progress-bar') as HTMLElement; + + if (videoContainer) { + const videoElement = videoContainer.querySelector('video'); + + if (!videoElement) { + console.error('Video element not found'); + return; + } + + console.warn('🎥 Video found!'); + + // Stop observing since we found the video + obs.disconnect(); + + videoContainer.style.borderRadius = '1rem'; + videoContainer.style.backgroundColor = 'oklch(98.4% 0.003 247.858)'; + videoContainer.style.overflow = 'hidden'; + + videoElement.style.borderRadius = '1rem'; + + videoContainer.style.boxShadow = '0 25px 50px -12px rgb(0 0 0 / 0.25)'; + + setVideoElement(videoElement); + } + + if (progressBar) { + console.warn('🎥 Progress bar found!'); + progressBar.style.backgroundColor = 'oklch(98.4% 0.003 247.858)'; + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + }); + + setTimeout(() => { + const container = document.querySelector('video-js') as HTMLElement; + if (container) { + const video = container.querySelector('video'); + + if (!video) { + console.error('Video element not found'); + return; + } + + console.warn('🎥 Video found on fallback!'); + observer.disconnect(); + + container.style.borderRadius = '1rem'; + container.style.backgroundColor = 'oklch(98.4% 0.003 247.858)'; + container.style.overflow = 'hidden'; + + video.style.borderRadius = '1rem'; + + setVideoElement(video); + } + }, 5000); // fallback after 5 seconds + }; + + waitForVideoAndSetup(); + + const ui = await createShadowRootUi(ctx, { + name: 'utlp-sidebar', + position: 'inline', + onMount: uiContainer => { + render( + () => ( + + ), + uiContainer + ); + }, + }); + + ui.mount(); + }, +}); diff --git a/entrypoints/main.content/utils.ts b/entrypoints/main.content/utils.ts new file mode 100644 index 0000000..00c09e3 --- /dev/null +++ b/entrypoints/main.content/utils.ts @@ -0,0 +1,108 @@ +export interface VttCue { + id: string; + start: number; + end: number; + text: string; +} + +/** + * Parses a WebVTT (Web Video Text Tracks) file + * + * @param vttContent - The content of the WebVTT file as a string. + * @returns An array of VttCue objects, each representing a cue in the WebVTT file. + */ +const parseVtt = (vttContent: string): VttCue[] => { + if (!vttContent) return []; + + const lines = vttContent.trim().split(/\n\s*\n/); + + // Remove first line if it's the WEBVTT header + if (lines[0].startsWith('WEBVTT')) { + lines.splice(0, 1); + } + + const cues: VttCue[] = []; + + for (let i = 0; i < lines.length; i++) { + // Each "line" is now a full cue block + const cueBlock = lines[i].trim(); + if (!cueBlock) continue; + + const cueLines = cueBlock.split('\n'); + let id = ''; + let start = 0; + let end = 0; + let text = ''; + + // First determine if the first line is an ID or timestamp + let currentLineIndex = 0; + + // If first line doesn't contain "-->" it's an ID + if (!cueLines[0].includes('-->')) { + id = cueLines[0].trim(); + currentLineIndex++; + } else { + // Generate a default ID if none provided + id = `cue-${i + 1}`; + } + + // Parse timestamp line (should be current line or next line) + if (currentLineIndex < cueLines.length && cueLines[currentLineIndex].includes('-->')) { + const timestamps = cueLines[currentLineIndex].split('-->').map(t => t.trim()); + start = timestampToSeconds(timestamps[0]); + end = timestampToSeconds(timestamps[1]); + currentLineIndex++; + } + + // Remaining lines are the text content + const textLines = cueLines.slice(currentLineIndex); + text = textLines.join(' '); + + // Add the cue if we have all required fields + if (id && start !== undefined && end !== undefined && text) { + cues.push({ + id, + start, + end, + text, + }); + } + } + + return cues; +}; + +const timestampToSeconds = (timestamp: string): number => { + const parts = timestamp.split(':'); + let seconds = 0; + + if (parts.length === 3) { + // HH:MM:SS.mmm format + seconds += parseInt(parts[0]) * 3600; + seconds += parseInt(parts[1]) * 60; + seconds += parseFloat(parts[2]); + } else if (parts.length === 2) { + // MM:SS.mmm format + seconds += parseInt(parts[0]) * 60; + seconds += parseFloat(parts[1]); + } else { + // SS.mmm format + seconds += parseFloat(parts[0]); + } + + return seconds; +}; + +/** + * Formats a time in seconds to a string in MM:SS format + * + * @param seconds - The time in seconds to format. + * @returns A string representing the time in MM:SS format. + */ +const formatTime = (seconds: number): string => { + const minutes = Math.floor(seconds / 60); + const remainingSeconds = Math.floor(seconds % 60); + return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; +}; + +export { parseVtt, formatTime }; diff --git a/entrypoints/popup/App.tsx b/entrypoints/popup/App.tsx new file mode 100644 index 0000000..f97fe26 --- /dev/null +++ b/entrypoints/popup/App.tsx @@ -0,0 +1,132 @@ +import { createSignal, JSX, Show } from 'solid-js'; +import { Sparkles, Book, Github, ExternalLink } from 'lucide-solid'; + +/** + * Popup component for UT Lectures Plus extension + * + * @returns The rendered popup UI + */ +function App(): JSX.Element { + const [activeTab, setActiveTab] = createSignal<'about' | 'help'>('about'); + + return ( +
+
+

+ UT Lectures+ +

+ v1.0 +
+ +
+ + +
+ + +
+

+ Enhance your UT Austin Lectures experience with transcripts, search, bookmarks, and AI + summaries. +

+ +
+

+ + Key Features +

+
    +
  • Interactive transcript with search
  • +
  • Bookmark important moments
  • +
  • AI-powered lecture summaries
  • +
  • Adjustable playback speed
  • +
  • Download transcripts as text
  • +
+
+ + +
+
+ + +
+
+
+

How to use:

+

+ Visit any LectureOnline or TowerLA lecture from UT Austin. The sidebar will + automatically appear. +

+
+ +
+

Troubleshooting:

+

+ If the sidebar doesn't appear, try refreshing the page or opening the video in a new + tab. +

+
+ +
+

+ + AI Summary Feature +

+

+ The AI summary requires an{' '} + + OpenAI API key + + . You'll be prompted to enter it when you use this feature. +

+
+ + + Report an issue + +
+
+
+
+ ); +} + +export default App; diff --git a/src/entrypoints/popup/index.html b/entrypoints/popup/index.html similarity index 82% rename from src/entrypoints/popup/index.html rename to entrypoints/popup/index.html index ed4cb94..73e3e5b 100644 --- a/src/entrypoints/popup/index.html +++ b/entrypoints/popup/index.html @@ -1,10 +1,11 @@ - + Default Popup Title +
diff --git a/src/entrypoints/popup/main.tsx b/entrypoints/popup/main.tsx similarity index 84% rename from src/entrypoints/popup/main.tsx rename to entrypoints/popup/main.tsx index 8079ef8..54e6ed7 100644 --- a/src/entrypoints/popup/main.tsx +++ b/entrypoints/popup/main.tsx @@ -1,6 +1,5 @@ import { render } from 'solid-js/web'; -import './style.css'; import App from './App'; render(() => , document.getElementById('root')!); diff --git a/eslint.config.js b/eslint.config.js index 1b9b386..8e829d9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -40,13 +40,13 @@ export default [ varsIgnorePattern: '^_', }, ], - '@typescript-eslint/explicit-function-return-type': [ - 'error', - { - allowExpressions: true, - allowTypedFunctionExpressions: true, - }, - ], + // '@typescript-eslint/explicit-function-return-type': [ + // 'error', + // { + // allowExpressions: true, + // allowTypedFunctionExpressions: true, + // }, + // ], '@typescript-eslint/explicit-module-boundary-types': 'error', '@typescript-eslint/no-empty-interface': 'error', '@typescript-eslint/no-explicit-any': 'error', @@ -134,7 +134,16 @@ export default [ // }, // Files to ignore { - ignores: ['dist/**', 'build/**', '.output/**', 'coverage/**', 'node_modules/**', '*.config.js', '*.config.ts'], + ignores: [ + 'dist/**', + 'build/**', + '.output/**', + 'coverage/**', + 'node_modules/**', + '*.config.js', + '*.config.ts', + '.wxt/**', + ], }, // Prettier configuration (must be last) prettier, diff --git a/package.json b/package.json index ad7d094..97eba5c 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,8 @@ { - "name": "ut-lectures-plus", - "description": "This plugin adds a transcript box (with search) to all LectureOnline and TowerLA lectures from UT Austin! Studying has never been easier.", + "name": "wxt-solid-starter", + "description": "manifest.json description", "private": true, - "version": "5.0.0", - "homepage": "https://github.com/Longhorn-Developers/UT-Lectures-Plus", - "license": "MIT", + "version": "0.0.0", "type": "module", "scripts": { "dev": "wxt", @@ -21,23 +19,25 @@ "format:fix": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"" }, "dependencies": { - "solid-js": "^1.9.3" + "@corvu/dialog": "^0.2.4", + "@corvu/popover": "^0.2.0", + "@tailwindcss/vite": "^4.1.3", + "@typescript-eslint/eslint-plugin": "^8.31.0", + "eslint": "^9.25.1", + "eslint-config-prettier": "^10.1.2", + "eslint-plugin-jsdoc": "^50.6.10", + "eslint-plugin-solid": "^0.14.5", + "lucide-solid": "^0.487.0", + "prettier-plugin-tailwindcss": "^0.6.11", + "remark-breaks": "^4.0.0", + "solid-js": "^1.9.5", + "solid-markdown": "^2.0.14", + "tailwindcss": "^4.1.3" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@types/chrome": "^0.0.280", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", - "@wxt-dev/module-solid": "^1.1.2", - "eslint": "^9.16.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-jsdoc": "^50.6.0", - "eslint-plugin-solid": "^0.14.4", - "globals": "^15.13.0", - "prettier": "3.4.1", - "typescript": "^5.7.2", - "typescript-eslint": "^8.17.0", - "wxt": "^0.19.13" + "@wxt-dev/module-solid": "^1.1.3", + "typescript": "^5.8.3", + "wxt": "^0.20.0" }, "trustedDependencies": [ "spawn-sync" diff --git a/src/public/icon/128.png b/public/icon/128.png similarity index 100% rename from src/public/icon/128.png rename to public/icon/128.png diff --git a/src/public/icon/16.png b/public/icon/16.png similarity index 100% rename from src/public/icon/16.png rename to public/icon/16.png diff --git a/src/public/icon/32.png b/public/icon/32.png similarity index 100% rename from src/public/icon/32.png rename to public/icon/32.png diff --git a/src/public/icon/48.png b/public/icon/48.png similarity index 100% rename from src/public/icon/48.png rename to public/icon/48.png diff --git a/src/public/icon/96.png b/public/icon/96.png similarity index 100% rename from src/public/icon/96.png rename to public/icon/96.png diff --git a/src/public/wxt.svg b/public/wxt.svg similarity index 100% rename from src/public/wxt.svg rename to public/wxt.svg diff --git a/src/entrypoints/background.ts b/src/entrypoints/background.ts deleted file mode 100644 index dda01f6..0000000 --- a/src/entrypoints/background.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { defineBackground } from 'wxt/sandbox'; - -export default defineBackground(() => { - function list(e: chrome.webRequest.WebResponseCacheDetails): void { - // console.log("what is e?") - // console.log(e) - const searchTerm = 'utexas'; - if (e.initiator && e.initiator.includes(searchTerm)) { - // recieved = true; - const caption_url = e.url; - // console.log("captions found") - // console.log(caption_url) - - fetch(caption_url) - .then(r => r.text()) - .then(result => { - console.log(result); - chrome.tabs.query( - { - active: true, - currentWindow: true, - }, - function (tabs) { - if (tabs[0].id) { - chrome.tabs.sendMessage(tabs[0].id, { - captions: result, - source: e.initiator, - }); - } - } - ); - }); - } - } - - function iframeworkaround(e: chrome.webRequest.WebRequestHeadersDetails): void { - if (e.method === 'GET') { - // console.log("what is e?") - // console.log(e.requestHeaders[10]) - if (e.requestHeaders && e.requestHeaders[10]) { - if (e.requestHeaders[10].name === 'Referer') { - const video_url = e.requestHeaders[10].value; - // console.log(video_url) - chrome.tabs.query( - { - active: true, - currentWindow: true, - }, - function (tabs) { - if (tabs[0].id) { - chrome.tabs.sendMessage(tabs[0].id, { - video_url: video_url, - }); - } - } - ); - } - } - } - } - chrome.webRequest.onCompleted.addListener( - function (e: chrome.webRequest.WebResponseCacheDetails) { - { - list(e); - } - }, - { - urls: ['*://*/*.vtt'], - types: ['xmlhttprequest'], - }, - ['responseHeaders'] - ); - - chrome.webRequest.onBeforeSendHeaders.addListener( - function (e: chrome.webRequest.WebRequestHeadersDetails) { - { - iframeworkaround(e); - } - }, - { - urls: ['*://*/*.edu'], - types: ['xmlhttprequest'], - }, - ['extraHeaders', 'requestHeaders'] - ); -}); diff --git a/src/entrypoints/content/index.ts b/src/entrypoints/content/index.ts deleted file mode 100644 index 4b8cc78..0000000 --- a/src/entrypoints/content/index.ts +++ /dev/null @@ -1,304 +0,0 @@ -import './style.css'; -import { defineContentScript } from 'wxt/sandbox'; -import { timestampToMilliseconds } from './utils'; - -export default defineContentScript({ - matches: [''], // TODO: Use a more specific pattern - main() { - var IFRAME = document.createElement('IFRAME'); - - function isNumeric(input: string) { - var isValid = /^\d+$/.test(input); - return isValid; - } - - let scroll = true; - let video_url = null; - var vid = null; - - function auto_scroll() { - const existingDiv = document.getElementsByClassName('caption-box')[0]; - if (existingDiv) { - const children = existingDiv.childNodes; - // console.log(children) - let mindif = 10000; - let cur = {}; - seekedTime = vid.currentTime; - for (cap of children) { - const dif = seekedTime - cap.dataset.time; - if (dif >= 0 && dif <= mindif) { - mindif = dif; - cur = cap; - } - cap.style.backgroundColor = 'white'; - } - if (cur) { - // console.log(cur) - cur.scrollIntoView({ - block: 'center', - behavior: 'smooth', - }); - cur.style.backgroundColor = 'LightGray'; - } - } - } - - var delayInMilliseconds = 1000; //1 second - - setTimeout(function () { - vid = document.getElementsByTagName('video')[0]; - if (vid) { - vid.ontimeupdate = auto_scroll; - vid.onseeked = function () { - const existingDiv = document.getElementsByClassName('caption-box')[0]; - if (existingDiv) { - const children = existingDiv.childNodes; - //console.log(children) - let mindif = 10000; - let cur = {}; - seekedTime = vid.currentTime; - for (cap of children) { - const dif = seekedTime - cap.dataset.time; - if (dif >= 0 && dif <= mindif) { - mindif = dif; - cur = cap; - } - } - if (cur) - //console.log(cur) - cur.scrollIntoView({ - block: 'center', - }); - } - }; - } - }, delayInMilliseconds); - - chrome.runtime.onMessage.addListener(async function (msg, sender, sendResponse) { - // console.log(msg) - const loadCheck = document.getElementsByClassName('flex-container')[0]; - if (msg.captions && !loadCheck) { - //modified_captions = addNewlineBeforeTimestamps(msg.captions) - cur_url = window.document.location.href; - //console.log(cur_url) - - if (msg.source.includes('utexas')) { - const caption_divs = []; - const captions = msg.captions; - let pattern = /^\d+\s*\n/gm; - - // Use replace() to remove those lines (replace them with an empty string) - let cleanedText = captions.replace(pattern, ''); - - pattern = /^ +/gm; - - // Use replace() to remove the leading whitespace - cleanedText = cleanedText.replace(pattern, ''); - let caption_chunks = cleanedText.split('\n\n'); - caption_chunks.shift(); - - // caption_chunks = caption_chunks[1]; - if (caption_chunks.length == 1) caption_chunks = caption_chunks[0].split('\n\r\n'); - // console.log(caption_chunks) - for (chunk of caption_chunks) { - const s = chunk.split('\n'); - if (s.length > 1) { - var isValid = /^\d+$/.test('' + s[0]); - if (isNumeric(s[0].trim())) { - s.shift(); - } - const timestamp = s[0].split(' ')[0]; - const cap = s.slice(1).join(' '); - let milliseconds = ''; - if (timestamp) { - milliseconds = timestampToMilliseconds(timestamp); - } else { - milliseconds = ''; - } - caption_divs.push({ - timestamp: timestamp, - caption: cap, - milliseconds: milliseconds, - }); - } - } - - let existingDiv = null; - if (msg.source.includes('lecturecapture')) { - existingDiv = document.getElementsByClassName('videorow')[0]; - } else if (msg.source.includes('tower')) { - existingDiv = document.getElementById('video_app'); //getElementsByClassName('videorow')[0]; - // document.getElementById('video_app').classList.add("video_style_addon"); - document.getElementsByClassName('container')[0].classList.add('container_addon'); - document.querySelector('#video_app > div > div').classList.add('container_addon'); - document.querySelector('#video_app > div > div').style.marginTop = '30px'; - document - .querySelector('#video_app > div > div > div:nth-child(2)') - .classList.add('container_addon'); - document - .querySelector('#video_app > div > div > div.container_addon > div:nth-child(2)') - .classList.add('container_addon'); - document - .querySelector('#video_app > div > div > div.container_addon > div:nth-child(2)') - .classList.add('cascade_addon'); - document.querySelector('#fullscreen_element').classList.add('big_video_addon'); - } - existingDiv.classList.add('video_style'); - //document.getElementById('video_app');//getElementsByClassName('videorow')[0]; - const flexContainer = document.createElement('div'); - flexContainer.classList.add('flex-container'); - - flexContainer.appendChild(existingDiv); - - const injectElementOutside = document.createElement('div'); - injectElementOutside.classList.add('captionBlob'); - const injectElement = document.createElement('div'); - injectElement.className = 'caption-box'; - for (obj of caption_divs) { - const preElement = document.createElement('pre'); - //preElement.className = "hover"; - preElement.innerHTML = obj.timestamp + '\n' + obj.caption; - preElement.dataset.time = obj.milliseconds; - preElement.addEventListener('click', function (e) { - const video = document.getElementsByTagName('video')[0]; - video.currentTime = e.srcElement.dataset.time; - }); - injectElement.appendChild(preElement); - } - injectElementOutside.appendChild(injectElement); - const buttonDiv = document.createElement('div'); - buttonDiv.classList.add('right'); - const button = document.createElement('button'); - button.innerHTML = 'Auto-Scroll: On'; - button.onclick = function () { - if (!scroll) { - if (vid) vid.ontimeupdate = auto_scroll; - scroll = true; - button.style.background = 'white'; - button.innerHTML = 'Auto-Scroll: On'; - } else { - if (vid) { - vid.ontimeupdate = function () { - const existingDiv = document.getElementsByClassName('caption-box')[0]; - const children = existingDiv.childNodes; - // console.log(children) - let mindif = 10000; - let cur = {}; - seekedTime = vid.currentTime; - for (cap of children) { - const dif = seekedTime - cap.dataset.time; - if (dif >= 0 && dif <= mindif) { - mindif = dif; - cur = cap; - } - cap.style.backgroundColor = 'white'; - } - //cur.scrollIntoView({ block: 'center', behavior: 'smooth' }); - cur.style.backgroundColor = 'LightGray'; - }; - } - - scroll = false; - button.style.backgroundColor = '#DCDCDC'; - button.innerHTML = 'Auto-Scroll: Off'; - } - }; - button.classList.add('button-4'); - buttonDiv.appendChild(button); - injectElementOutside.appendChild(buttonDiv); - flexContainer.appendChild(injectElementOutside); - - document.body.appendChild(flexContainer); - //document.body.appendChild(button); - - // Function to handle search functionality - function handleSearch() { - const searchInput = document.getElementById('searchInput').value.toLowerCase(); - if (searchInput != '') { - const captions = document.querySelectorAll('.caption-box pre'); - - captions.forEach(caption => { - const text = caption.textContent.toLowerCase(); - if (text.includes(searchInput)) { - caption.style.display = 'block'; - const highlightedText = caption.textContent.replace( - new RegExp(searchInput, 'gi'), - match => `${match}` - ); - caption.innerHTML = highlightedText; - } else { - caption.style.display = 'none'; - } - }); - } else { - const captions = document.querySelectorAll('.caption-box pre'); - captions.forEach(caption => { - const text = caption.textContent.toLowerCase(); - if (text.includes(searchInput)) { - caption.style.display = 'block'; - const highlightedText = caption.textContent; - caption.innerHTML = highlightedText; - } else { - caption.style.display = 'none'; - } - }); - } - } - - // Create search bar element - const searchBar = document.createElement('input'); - searchBar.setAttribute('type', 'text'); - searchBar.setAttribute('id', 'searchInput'); - searchBar.setAttribute('placeholder', 'Search captions...'); - searchBar.addEventListener('input', handleSearch); - - // Create container div to hold search bar and captionBlob - const containerDiv = document.createElement('div'); - if (msg.source.includes('lecturecapture')) { - containerDiv.classList.add('search-container'); - } else if (msg.source.includes('tower')) { - containerDiv.classList.add('search-container-tower'); - containerDiv.classList.add('top_padding'); - } - containerDiv.appendChild(searchBar); - - // Get reference to existing captionBlob div - const captionBlob = document.querySelector('.captionBlob'); - - // Insert container div before the captionBlob div - captionBlob.parentNode.insertBefore(containerDiv, captionBlob); - - // Move the captionBlob inside the container div - containerDiv.appendChild(captionBlob); - - // Adjust styles if needed - containerDiv.style.display = 'flex'; - containerDiv.style.flexDirection = 'column'; - } - } else { - if (video_url == null) { - video_url = msg.video_url; - //console.log(video_url) - const button = document.createElement('button'); - const frameDiv = document.getElementsByClassName('tool_content_wrapper')[0]; - // Set the button's text content - button.textContent = 'Click here to open video in new tab with transcript!'; - - // Define the callback function - function handleClick() { - window.open(video_url); - // Add any functionality you want here - } - - // Attach the callback function to the button's click event - button.addEventListener('click', handleClick); - - // Append the button to the document body (or any other container) - if (frameDiv) { - frameDiv.appendChild(button); - } - } - } - }); - }, -}); diff --git a/src/entrypoints/content/style.css b/src/entrypoints/content/style.css deleted file mode 100644 index 585f011..0000000 --- a/src/entrypoints/content/style.css +++ /dev/null @@ -1,158 +0,0 @@ -.caption-box { - width: 100%; - height: 95%; - border: 1px solid #ccc; - font: 16px/26px Georgia, Garamond, Serif; - overflow: auto; - resize: horizontal; -} - -.top_padding { - margin-top: 30px; -} - -.cascade_addon * { - width: 100%; - height: 100%; -} - -.container_addon { - width: 100% !important; - height: 100%; - max-width: 100% !important; -} - -.big_video_addon { - width: 100% !important; - height: 100% !important; -} - -.captionBlob { - padding: 10px; - height: 95%; -} - -.search-container { - padding-top: 10px; - width: 20%; -} - -.search-container-tower { - width: 20%; - height: 100%; -} - -#searchInput { - width: 90%; - margin: auto; -} - -.highlight { - background-color: yellow; - font-weight: bold; -} - -.right { - margin-top: 1em; - float: right; -} - -/* Flex container */ -.flex-container { - height: 85%; - display: flex; - flex-direction: row; - width: 100%; -} - -.video_style { - width: 85%; -} - -.ic-Layout-contentWrapper { - height: 90%; -} - -pre:hover { - color: #6495ed; - cursor: pointer; - /* text-decoration: underline; */ -} - -pre { - transition: background-color 0.5s ease; - /* Transition for smooth highlighting */ - width: 90%; - overflow-x: auto; - white-space: pre-wrap; - font-size: 1vw; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - padding: 2.5%; - margin: 2.5%; - line-height: 1; - overflow-y: hidden; -} - -html { - scroll-behavior: smooth !important; -} - -/* CSS */ -.button-4 { - appearance: none; - background-color: #fafbfc; - border: 1px solid rgba(27, 31, 35, 0.15); - border-radius: 6px; - box-shadow: rgba(27, 31, 35, 0.04) 0 1px 0, - rgba(255, 255, 255, 0.25) 0 1px 0 inset; - box-sizing: border-box; - color: #24292e; - cursor: pointer; - display: inline-block; - font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, - sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - font-size: 14px; - font-weight: 500; - line-height: 20px; - list-style: none; - padding: 6px 16px; - position: relative; - transition: background-color 0.2s cubic-bezier(0.3, 0, 0.5, 1); - user-select: none; - -webkit-user-select: none; - touch-action: manipulation; - vertical-align: middle; - white-space: nowrap; - word-wrap: break-word; -} - -/* .button-4:hover { - background-color: #f3f4f6; - text-decoration: none; - transition-duration: 0.1s; -} */ - -.button-4:disabled { - background-color: #fafbfc; - border-color: rgba(27, 31, 35, 0.15); - color: #959da5; - cursor: default; -} - -.button-4:active { - background-color: #edeff2; - box-shadow: rgba(225, 228, 232, 0.2) 0 1px 0 inset; - transition: none 0s; -} - -.button-4:focus { - outline: 1px transparent; -} - -.button-4:before { - display: none; -} - -.button-4:-webkit-details-marker { - display: none; -} diff --git a/src/entrypoints/content/utils.ts b/src/entrypoints/content/utils.ts deleted file mode 100644 index a2fe97d..0000000 --- a/src/entrypoints/content/utils.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Converts a timestamp string in the format "HH:MM:SS.sss" or "MM:SS.sss" to milliseconds. - * - * @param timestamp - The timestamp string to convert. It can be in the format "HH:MM:SS.sss" or "MM:SS.sss". - * @returns The total milliseconds represented by the timestamp. - */ -export function timestampToMilliseconds(timestamp: string): number { - const splitted_time = timestamp.split(':'); - - let hours = '0'; - let minutes = '0'; - let secondsWithMillis = '00.000'; - - if (splitted_time.length === 3) { - hours = splitted_time[0]; - minutes = splitted_time[1]; - secondsWithMillis = splitted_time[2]; - } else if (splitted_time.length === 2) { - minutes = splitted_time[0]; - secondsWithMillis = splitted_time[1]; - } - - // console.log(secondsWithMillis) - // Split secondsWithMillis into seconds and seconds - const [seconds, milliseconds] = secondsWithMillis.split('.'); - - // Calculate the total milliseconds - const totalMilliseconds = - parseInt(hours, 10) * 60 * 60 * 1000 + // hours to milliseconds - parseInt(minutes, 10) * 60 * 1000 + // minutes to milliseconds - parseInt(seconds, 10) * 1000 + // seconds to milliseconds - parseInt(milliseconds, 10); // milliseconds - - return totalMilliseconds / 1000; -} diff --git a/src/entrypoints/popup/App.css b/src/entrypoints/popup/App.css deleted file mode 100644 index 8bb1b3b..0000000 --- a/src/entrypoints/popup/App.css +++ /dev/null @@ -1,27 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #54bc4ae0); -} -.logo.solid:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/entrypoints/popup/App.tsx b/src/entrypoints/popup/App.tsx deleted file mode 100644 index 09c97a1..0000000 --- a/src/entrypoints/popup/App.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { createSignal } from 'solid-js'; -import solidLogo from '@/assets/solid.svg'; -import wxtLogo from '/wxt.svg'; -import './App.css'; - -/** - * - */ -function App() { - const [count, setCount] = createSignal(0); - - return ( - <> - -

WXT + Solid

-
- -

- Edit popup/App.tsx and save to test HMR -

-
-

Click on the WXT and Solid logos to learn more

- - ); -} - -export default App; diff --git a/src/entrypoints/popup/style.css b/src/entrypoints/popup/style.css deleted file mode 100644 index 2c3fac6..0000000 --- a/src/entrypoints/popup/style.css +++ /dev/null @@ -1,69 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/tsconfig.json b/tsconfig.json index 385a56a..a033807 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "extends": "./.wxt/tsconfig.json", "compilerOptions": { "jsx": "preserve", - "jsxImportSource": "solid-js" + "jsxImportSource": "solid-js", + "allowImportingTsExtensions": true } } diff --git a/wxt.config.ts b/wxt.config.ts index ac675af..75922a6 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -1,13 +1,16 @@ +import tailwindcss from '@tailwindcss/vite'; import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html export default defineConfig({ - srcDir: 'src', - extensionApi: 'chrome', modules: ['@wxt-dev/module-solid'], - imports: false, // Disable auto-imports + vite: () => ({ + plugins: [tailwindcss()], + }), manifest: { - permissions: ['webRequest', 'tabs'], + name: 'UT Lectures Plus', + description: 'Enhance your UT Austin Lectures experience.', + permissions: ['webRequest', 'tabs', 'storage'], host_permissions: ['*://*.la.utexas.edu/*'], }, }); From e885d363c4a4a7b4e720d2e1cc1da73b615e1367 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 23 Apr 2025 16:53:02 -0500 Subject: [PATCH 02/12] feat: update package name and description for clarity --- package.json | 6 +++--- wxt.config.ts | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 97eba5c..5e233fa 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "wxt-solid-starter", - "description": "manifest.json description", + "name": "ut-lectures-plus", + "description": "This plugin adds a transcript box (with search) to all LectureOnline and TowerLA lectures from UT Austin! Studying has never been easier.", "private": true, - "version": "0.0.0", + "version": "6.0.0", "type": "module", "scripts": { "dev": "wxt", diff --git a/wxt.config.ts b/wxt.config.ts index 75922a6..cd6dcf9 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -9,7 +9,8 @@ export default defineConfig({ }), manifest: { name: 'UT Lectures Plus', - description: 'Enhance your UT Austin Lectures experience.', + description: + 'This plugin adds a transcript box (with search) to all LectureOnline and TowerLA lectures from UT Austin! Studying has never been easier.', permissions: ['webRequest', 'tabs', 'storage'], host_permissions: ['*://*.la.utexas.edu/*'], }, From b2664734d414d9cb8f1060cc87a2b24347e43ae7 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 23 Apr 2025 16:53:08 -0500 Subject: [PATCH 03/12] fix: remove commented-out rule for explicit function return type in ESLint config --- eslint.config.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 8e829d9..9718325 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -40,13 +40,6 @@ export default [ varsIgnorePattern: '^_', }, ], - // '@typescript-eslint/explicit-function-return-type': [ - // 'error', - // { - // allowExpressions: true, - // allowTypedFunctionExpressions: true, - // }, - // ], '@typescript-eslint/explicit-module-boundary-types': 'error', '@typescript-eslint/no-empty-interface': 'error', '@typescript-eslint/no-explicit-any': 'error', From 99fd9d12c6a816071368c8a89e4cac377486b51d Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 23 Apr 2025 16:53:36 -0500 Subject: [PATCH 04/12] fix: ensure proper formatting in .gitignore by adding newline at end of file --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0f0d1d1..a256953 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,4 @@ web-ext.config.ts *.ntvs* *.njsproj *.sln -*.sw? \ No newline at end of file +*.sw? From e9ea5ac22e7fb2f6a35964c98ba5329a0a813992 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 23 Apr 2025 16:55:37 -0500 Subject: [PATCH 05/12] fix: remove redundant comment on auto-imports in wxt.config.ts --- wxt.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/wxt.config.ts b/wxt.config.ts index cd6dcf9..e332bbf 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -4,6 +4,7 @@ import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html export default defineConfig({ modules: ['@wxt-dev/module-solid'], + imports: false, // Disable auto-imports vite: () => ({ plugins: [tailwindcss()], }), From c1daf792d56be15400b9f8d59edaea4e305d04dd Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 23 Apr 2025 17:10:26 -0500 Subject: [PATCH 06/12] feat: switch to src directory --- {assets => src/assets}/solid.svg | 0 {assets => src/assets}/tailwind.css | 0 {components => src/components}/content/Button.tsx | 0 {components => src/components}/content/Cue.tsx | 0 {components => src/components}/content/TopBar.tsx | 0 {components => src/components}/content/Transcription.tsx | 6 +++--- .../components}/content/quick-actions/AISummary.tsx | 2 +- .../components}/content/quick-actions/PlaybackRate.tsx | 2 +- .../components}/content/quick-actions/QuickActions.tsx | 4 ++-- {context => src/context}/BookmarkProvider.tsx | 0 {entrypoints => src/entrypoints}/background.ts | 0 .../entrypoints}/injected.content/index.ts | 0 .../entrypoints}/injected.content/injected.css | 0 {entrypoints => src/entrypoints}/main.content/App.tsx | 8 ++++---- {entrypoints => src/entrypoints}/main.content/index.tsx | 0 {entrypoints => src/entrypoints}/main.content/utils.ts | 0 {entrypoints => src/entrypoints}/popup/App.tsx | 0 {entrypoints => src/entrypoints}/popup/index.html | 0 {entrypoints => src/entrypoints}/popup/main.tsx | 0 {entrypoints/main.content => src}/hooks/useCueSync.ts | 0 .../main.content => src}/hooks/useTranscriptionScroll.ts | 0 {context => src/stores}/AISummaryStore.tsx | 0 {context => src/stores}/SearchStore.tsx | 0 {context => src/stores}/SelectedActionStore.tsx | 0 wxt.config.ts | 1 + 25 files changed, 12 insertions(+), 11 deletions(-) rename {assets => src/assets}/solid.svg (100%) rename {assets => src/assets}/tailwind.css (100%) rename {components => src/components}/content/Button.tsx (100%) rename {components => src/components}/content/Cue.tsx (100%) rename {components => src/components}/content/TopBar.tsx (100%) rename {components => src/components}/content/Transcription.tsx (98%) rename {components => src/components}/content/quick-actions/AISummary.tsx (99%) rename {components => src/components}/content/quick-actions/PlaybackRate.tsx (98%) rename {components => src/components}/content/quick-actions/QuickActions.tsx (98%) rename {context => src/context}/BookmarkProvider.tsx (100%) rename {entrypoints => src/entrypoints}/background.ts (100%) rename {entrypoints => src/entrypoints}/injected.content/index.ts (100%) rename {entrypoints => src/entrypoints}/injected.content/injected.css (100%) rename {entrypoints => src/entrypoints}/main.content/App.tsx (98%) rename {entrypoints => src/entrypoints}/main.content/index.tsx (100%) rename {entrypoints => src/entrypoints}/main.content/utils.ts (100%) rename {entrypoints => src/entrypoints}/popup/App.tsx (100%) rename {entrypoints => src/entrypoints}/popup/index.html (100%) rename {entrypoints => src/entrypoints}/popup/main.tsx (100%) rename {entrypoints/main.content => src}/hooks/useCueSync.ts (100%) rename {entrypoints/main.content => src}/hooks/useTranscriptionScroll.ts (100%) rename {context => src/stores}/AISummaryStore.tsx (100%) rename {context => src/stores}/SearchStore.tsx (100%) rename {context => src/stores}/SelectedActionStore.tsx (100%) diff --git a/assets/solid.svg b/src/assets/solid.svg similarity index 100% rename from assets/solid.svg rename to src/assets/solid.svg diff --git a/assets/tailwind.css b/src/assets/tailwind.css similarity index 100% rename from assets/tailwind.css rename to src/assets/tailwind.css diff --git a/components/content/Button.tsx b/src/components/content/Button.tsx similarity index 100% rename from components/content/Button.tsx rename to src/components/content/Button.tsx diff --git a/components/content/Cue.tsx b/src/components/content/Cue.tsx similarity index 100% rename from components/content/Cue.tsx rename to src/components/content/Cue.tsx diff --git a/components/content/TopBar.tsx b/src/components/content/TopBar.tsx similarity index 100% rename from components/content/TopBar.tsx rename to src/components/content/TopBar.tsx diff --git a/components/content/Transcription.tsx b/src/components/content/Transcription.tsx similarity index 98% rename from components/content/Transcription.tsx rename to src/components/content/Transcription.tsx index a952b1e..8a5c9aa 100644 --- a/components/content/Transcription.tsx +++ b/src/components/content/Transcription.tsx @@ -3,9 +3,9 @@ import Cue from './Cue'; import { RotateCw } from 'lucide-solid'; import { createMemo, For, Show, createEffect, Accessor, JSX } from 'solid-js'; import { useBookmarks } from '@/context/BookmarkProvider'; -import { clearSelectedAction, state } from '@/context/SelectedActionStore'; -import SearchStore from '@/context/SearchStore'; -import AISummaryStore from '@/context/AISummaryStore'; +import { clearSelectedAction, state } from '@/stores/SelectedActionStore'; +import SearchStore from '@/stores/SearchStore'; +import AISummaryStore from '@/stores/AISummaryStore'; import { SolidMarkdown } from 'solid-markdown'; import remarkBreaks from 'remark-breaks'; diff --git a/components/content/quick-actions/AISummary.tsx b/src/components/content/quick-actions/AISummary.tsx similarity index 99% rename from components/content/quick-actions/AISummary.tsx rename to src/components/content/quick-actions/AISummary.tsx index 6b2e55e..0be0791 100644 --- a/components/content/quick-actions/AISummary.tsx +++ b/src/components/content/quick-actions/AISummary.tsx @@ -2,7 +2,7 @@ import { Accessor, createSignal, createEffect, JSX } from 'solid-js'; import Button from '../Button'; import { Sparkles, X } from 'lucide-solid'; import Dialog from '@corvu/dialog'; -import AISummaryStore from '@/context/AISummaryStore'; +import AISummaryStore from '@/stores/AISummaryStore'; const generateAISummary = async (apiKey: string, text: string): Promise => { const prompt = `You’re great at turning spoken content into clear summaries. diff --git a/components/content/quick-actions/PlaybackRate.tsx b/src/components/content/quick-actions/PlaybackRate.tsx similarity index 98% rename from components/content/quick-actions/PlaybackRate.tsx rename to src/components/content/quick-actions/PlaybackRate.tsx index c0c5bf3..b84386f 100644 --- a/components/content/quick-actions/PlaybackRate.tsx +++ b/src/components/content/quick-actions/PlaybackRate.tsx @@ -2,7 +2,7 @@ import Popover from '@corvu/popover'; import Button from '../Button'; import { createSignal, JSX, For } from 'solid-js'; import { Gauge, XIcon } from 'lucide-solid'; -import { setSelectedAction, state } from '@/context/SelectedActionStore'; +import { setSelectedAction, state } from '@/stores/SelectedActionStore'; interface PlaybackRateProps { uiContainer: HTMLElement; diff --git a/components/content/quick-actions/QuickActions.tsx b/src/components/content/quick-actions/QuickActions.tsx similarity index 98% rename from components/content/quick-actions/QuickActions.tsx rename to src/components/content/quick-actions/QuickActions.tsx index 53cc5a5..299abe0 100644 --- a/components/content/quick-actions/QuickActions.tsx +++ b/src/components/content/quick-actions/QuickActions.tsx @@ -1,9 +1,9 @@ import { Bookmark, Download, Search, X } from 'lucide-solid'; import Button from '../Button'; import { Accessor, createSignal, JSX, Show } from 'solid-js'; -import SearchStore from '@/context/SearchStore'; +import SearchStore from '@/stores/SearchStore'; import PlaybackRate from './PlaybackRate'; -import { QuickActionType, state, setSelectedAction } from '@/context/SelectedActionStore'; +import { QuickActionType, state, setSelectedAction } from '@/stores/SelectedActionStore'; import AISummary from './AISummary'; interface QuickActionProps { diff --git a/context/BookmarkProvider.tsx b/src/context/BookmarkProvider.tsx similarity index 100% rename from context/BookmarkProvider.tsx rename to src/context/BookmarkProvider.tsx diff --git a/entrypoints/background.ts b/src/entrypoints/background.ts similarity index 100% rename from entrypoints/background.ts rename to src/entrypoints/background.ts diff --git a/entrypoints/injected.content/index.ts b/src/entrypoints/injected.content/index.ts similarity index 100% rename from entrypoints/injected.content/index.ts rename to src/entrypoints/injected.content/index.ts diff --git a/entrypoints/injected.content/injected.css b/src/entrypoints/injected.content/injected.css similarity index 100% rename from entrypoints/injected.content/injected.css rename to src/entrypoints/injected.content/injected.css diff --git a/entrypoints/main.content/App.tsx b/src/entrypoints/main.content/App.tsx similarity index 98% rename from entrypoints/main.content/App.tsx rename to src/entrypoints/main.content/App.tsx index 18a6566..d670996 100644 --- a/entrypoints/main.content/App.tsx +++ b/src/entrypoints/main.content/App.tsx @@ -1,14 +1,14 @@ import { ChevronLeft } from 'lucide-solid'; import { createEffect, Show, Accessor, createSignal, onCleanup, onMount, JSX } from 'solid-js'; import { parseVtt } from './utils'; -import { useCueSync } from './hooks/useCueSync'; -import { useTranscriptionScroll } from './hooks/useTranscriptionScroll'; +import { useCueSync } from '@/hooks/useCueSync'; +import { useTranscriptionScroll } from '@/hooks/useTranscriptionScroll'; import TopBar from '@/components/content/TopBar'; import Transcription from '@/components/content/Transcription'; import QuickActions from '@/components/content/quick-actions/QuickActions'; import { BookmarkProvider } from '@/context/BookmarkProvider'; -import { state, setSelectedAction } from '@/context/SelectedActionStore'; -import SearchStore from '@/context/SearchStore'; +import { state, setSelectedAction } from '@/stores/SelectedActionStore'; +import SearchStore from '@/stores/SearchStore'; interface AppProps { vttData: Accessor; diff --git a/entrypoints/main.content/index.tsx b/src/entrypoints/main.content/index.tsx similarity index 100% rename from entrypoints/main.content/index.tsx rename to src/entrypoints/main.content/index.tsx diff --git a/entrypoints/main.content/utils.ts b/src/entrypoints/main.content/utils.ts similarity index 100% rename from entrypoints/main.content/utils.ts rename to src/entrypoints/main.content/utils.ts diff --git a/entrypoints/popup/App.tsx b/src/entrypoints/popup/App.tsx similarity index 100% rename from entrypoints/popup/App.tsx rename to src/entrypoints/popup/App.tsx diff --git a/entrypoints/popup/index.html b/src/entrypoints/popup/index.html similarity index 100% rename from entrypoints/popup/index.html rename to src/entrypoints/popup/index.html diff --git a/entrypoints/popup/main.tsx b/src/entrypoints/popup/main.tsx similarity index 100% rename from entrypoints/popup/main.tsx rename to src/entrypoints/popup/main.tsx diff --git a/entrypoints/main.content/hooks/useCueSync.ts b/src/hooks/useCueSync.ts similarity index 100% rename from entrypoints/main.content/hooks/useCueSync.ts rename to src/hooks/useCueSync.ts diff --git a/entrypoints/main.content/hooks/useTranscriptionScroll.ts b/src/hooks/useTranscriptionScroll.ts similarity index 100% rename from entrypoints/main.content/hooks/useTranscriptionScroll.ts rename to src/hooks/useTranscriptionScroll.ts diff --git a/context/AISummaryStore.tsx b/src/stores/AISummaryStore.tsx similarity index 100% rename from context/AISummaryStore.tsx rename to src/stores/AISummaryStore.tsx diff --git a/context/SearchStore.tsx b/src/stores/SearchStore.tsx similarity index 100% rename from context/SearchStore.tsx rename to src/stores/SearchStore.tsx diff --git a/context/SelectedActionStore.tsx b/src/stores/SelectedActionStore.tsx similarity index 100% rename from context/SelectedActionStore.tsx rename to src/stores/SelectedActionStore.tsx diff --git a/wxt.config.ts b/wxt.config.ts index e332bbf..a30e632 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -3,6 +3,7 @@ import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html export default defineConfig({ + srcDir: 'src', modules: ['@wxt-dev/module-solid'], imports: false, // Disable auto-imports vite: () => ({ From bc0e21ad9b6b8aa5c425e070697c72c7659af5e6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 23 Apr 2025 17:21:01 -0500 Subject: [PATCH 07/12] fix: update connection handling and permissions in background script and config --- src/entrypoints/background.ts | 27 +++++++++++++++------------ wxt.config.ts | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/entrypoints/background.ts b/src/entrypoints/background.ts index 98ccac0..5990fc4 100644 --- a/src/entrypoints/background.ts +++ b/src/entrypoints/background.ts @@ -2,7 +2,7 @@ import { defineBackground, Browser, browser } from '#imports'; export default defineBackground(() => { // Store active connections from content scripts - const connections: Record = {}; + const connections: Record = {}; // Track if the listener is currently active let isListenerActive = false; @@ -11,7 +11,7 @@ export default defineBackground(() => { if (details.url.endsWith('.vtt')) { const url = new URL(details.url); getVTTFile(url.toString()) - .then(async text => { + .then(text => { // Remove the listener after successfully getting the VTT file browser.webRequest.onBeforeRequest.removeListener(requestListener); isListenerActive = false; @@ -22,15 +22,18 @@ export default defineBackground(() => { url: details.url, }; - // Send the message to the newly connected content script as it will have a separate transcript from the other tabs - const currentTab = await browser.tabs.query({ - active: true, - currentWindow: true, - }); - const currentTabId = currentTab[0]?.id; + // Instead of querying for the tab, use the details.tabId + // from the request to know which tab made the request + const requestTabId = details.tabId?.toString(); - if (currentTabId && connections[currentTabId]) { - connections[currentTabId].postMessage(message); + if (requestTabId && connections[requestTabId]) { + connections[requestTabId].postMessage(message); + } else { + // If we can't determine the tab or don't have a connection, + // broadcast to all connected tabs + Object.values(connections).forEach(port => { + port.postMessage(message); + }); } }) .catch(error => { @@ -52,13 +55,13 @@ export default defineBackground(() => { // Listen for connection attempts from content scripts browser.runtime.onConnect.addListener(port => { const sender = port.sender; - const tabId = sender?.tab?.id; + const tabId = sender?.tab?.id?.toString(); if (!tabId) { return; } - // Store the connection + // Store the connection using tabId as a string key connections[tabId] = port; console.warn(`Connected to tab ${tabId}`); diff --git a/wxt.config.ts b/wxt.config.ts index a30e632..894870f 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ name: 'UT Lectures Plus', description: 'This plugin adds a transcript box (with search) to all LectureOnline and TowerLA lectures from UT Austin! Studying has never been easier.', - permissions: ['webRequest', 'tabs', 'storage'], + permissions: ['webRequest', 'storage'], host_permissions: ['*://*.la.utexas.edu/*'], }, }); From 0f3ed347976eb70d5ce04f51e5bad4c125a9306f Mon Sep 17 00:00:00 2001 From: Ethan Date: Sat, 26 Apr 2025 01:06:38 -0500 Subject: [PATCH 08/12] fix: update content script match patterns for specific routes --- src/entrypoints/injected.content/index.ts | 2 +- src/entrypoints/main.content/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/entrypoints/injected.content/index.ts b/src/entrypoints/injected.content/index.ts index e9e7a22..c50c44a 100644 --- a/src/entrypoints/injected.content/index.ts +++ b/src/entrypoints/injected.content/index.ts @@ -2,7 +2,7 @@ import { defineContentScript } from '#imports'; import './injected.css'; export default defineContentScript({ - matches: ['*://*.la.utexas.edu/*'], + matches: ['*://*.la.utexas.edu/app_home/*', '*://*.la.utexas.edu/player/episode/*'], cssInjectionMode: 'manifest', async main() {}, }); diff --git a/src/entrypoints/main.content/index.tsx b/src/entrypoints/main.content/index.tsx index 6a66604..e7c1436 100644 --- a/src/entrypoints/main.content/index.tsx +++ b/src/entrypoints/main.content/index.tsx @@ -5,7 +5,7 @@ import { createSignal } from 'solid-js'; import { createShadowRootUi } from 'wxt/utils/content-script-ui/shadow-root'; import { browser, defineContentScript } from '#imports'; export default defineContentScript({ - matches: ['*://*.la.utexas.edu/*'], + matches: ['*://*.la.utexas.edu/app_home/*', '*://*.la.utexas.edu/player/episode/*'], cssInjectionMode: 'ui', async main(ctx) { // Create a signal to store the VTT data @@ -70,7 +70,7 @@ export default defineContentScript({ }); setTimeout(() => { - const container = document.querySelector('video-js') as HTMLElement; + const container = document.querySelector('.video-js') as HTMLElement; if (container) { const video = container.querySelector('video'); From 6aff910f8f9bd6f7665e7c2334ab022b73f8279a Mon Sep 17 00:00:00 2001 From: Ethan Date: Sat, 26 Apr 2025 01:06:47 -0500 Subject: [PATCH 09/12] fix: enhance styling and add sidebar state management in App component --- src/entrypoints/injected.content/injected.css | 37 ++++++++++++++++--- src/entrypoints/main.content/App.tsx | 9 +++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/entrypoints/injected.content/injected.css b/src/entrypoints/injected.content/injected.css index 3a5a2e0..176c0bc 100644 --- a/src/entrypoints/injected.content/injected.css +++ b/src/entrypoints/injected.content/injected.css @@ -1,10 +1,37 @@ body { - display: flex; - flex-direction: row; - gap: 1rem; - background-color: oklch(98.4% 0.003 247.858); + display: flex !important; + flex-direction: row !important; + gap: 1rem !important; + background-color: oklch(98.4% 0.003 247.858); + margin: 0 !important; } #video_app { - flex-grow: 1; + flex-grow: 1; +} + +/* Lecture Capture styling */ +#loplayer { + display: absolute; + top: 50%; + transform: translateY(-50%); + height: fit-content !important; +} + +body[data-sidebar-open='false'] #loplayer { + margin-top: 4rem; +} + +#loplayer_html5_api { + position: relative; +} + +.headerrow { + display: none !important; + position: absolute; + top: 0; + left: 0; + right: 0; + pointer-events: none; + z-index: 9999; } diff --git a/src/entrypoints/main.content/App.tsx b/src/entrypoints/main.content/App.tsx index d670996..f6c404b 100644 --- a/src/entrypoints/main.content/App.tsx +++ b/src/entrypoints/main.content/App.tsx @@ -184,6 +184,15 @@ const App = (props: AppProps): JSX.Element => { } }); + createEffect(() => { + // Add data-sidebar-open attribute to the body element + if (sidebarOpen()) { + document.body.setAttribute('data-sidebar-open', 'true'); + } else { + document.body.setAttribute('data-sidebar-open', 'false'); + } + }); + // Set up auto-scrolling with interval onMount(() => { const scrollInterval = autoScrollHandler(500); From b5385e3b5b96c8fedf710972a1e56d8e3e6d5563 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sat, 26 Apr 2025 01:06:52 -0500 Subject: [PATCH 10/12] feat: add clipboard functionality to copy transcript from VTT --- .../content/quick-actions/QuickActions.tsx | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/components/content/quick-actions/QuickActions.tsx b/src/components/content/quick-actions/QuickActions.tsx index 299abe0..e81b798 100644 --- a/src/components/content/quick-actions/QuickActions.tsx +++ b/src/components/content/quick-actions/QuickActions.tsx @@ -1,4 +1,4 @@ -import { Bookmark, Download, Search, X } from 'lucide-solid'; +import { Bookmark, Clipboard, Download, Search, X } from 'lucide-solid'; import Button from '../Button'; import { Accessor, createSignal, JSX, Show } from 'solid-js'; import SearchStore from '@/stores/SearchStore'; @@ -143,7 +143,7 @@ const QuickActions = (props: QuickActionProps): JSX.Element => { />
-
+
} From d811eb3ecd879f579911dd64bab7af424b6f15eb Mon Sep 17 00:00:00 2001 From: Ethan Date: Sat, 26 Apr 2025 01:11:32 -0500 Subject: [PATCH 11/12] fix: remove autofill password for api key input --- src/components/content/quick-actions/AISummary.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/content/quick-actions/AISummary.tsx b/src/components/content/quick-actions/AISummary.tsx index 0be0791..a4bce16 100644 --- a/src/components/content/quick-actions/AISummary.tsx +++ b/src/components/content/quick-actions/AISummary.tsx @@ -165,6 +165,7 @@ const AISummary = (props: {
setApiKey(e.target.value)} From 6a092bb6ad57d5facf19464f93434c34f74c8465 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sat, 26 Apr 2025 21:36:26 -0500 Subject: [PATCH 12/12] fix: same transcript appears on multiple lectures by reverting background script with tabs permission --- src/entrypoints/background.ts | 27 ++++++++++++--------------- wxt.config.ts | 7 ++++++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/entrypoints/background.ts b/src/entrypoints/background.ts index 5990fc4..98ccac0 100644 --- a/src/entrypoints/background.ts +++ b/src/entrypoints/background.ts @@ -2,7 +2,7 @@ import { defineBackground, Browser, browser } from '#imports'; export default defineBackground(() => { // Store active connections from content scripts - const connections: Record = {}; + const connections: Record = {}; // Track if the listener is currently active let isListenerActive = false; @@ -11,7 +11,7 @@ export default defineBackground(() => { if (details.url.endsWith('.vtt')) { const url = new URL(details.url); getVTTFile(url.toString()) - .then(text => { + .then(async text => { // Remove the listener after successfully getting the VTT file browser.webRequest.onBeforeRequest.removeListener(requestListener); isListenerActive = false; @@ -22,18 +22,15 @@ export default defineBackground(() => { url: details.url, }; - // Instead of querying for the tab, use the details.tabId - // from the request to know which tab made the request - const requestTabId = details.tabId?.toString(); + // Send the message to the newly connected content script as it will have a separate transcript from the other tabs + const currentTab = await browser.tabs.query({ + active: true, + currentWindow: true, + }); + const currentTabId = currentTab[0]?.id; - if (requestTabId && connections[requestTabId]) { - connections[requestTabId].postMessage(message); - } else { - // If we can't determine the tab or don't have a connection, - // broadcast to all connected tabs - Object.values(connections).forEach(port => { - port.postMessage(message); - }); + if (currentTabId && connections[currentTabId]) { + connections[currentTabId].postMessage(message); } }) .catch(error => { @@ -55,13 +52,13 @@ export default defineBackground(() => { // Listen for connection attempts from content scripts browser.runtime.onConnect.addListener(port => { const sender = port.sender; - const tabId = sender?.tab?.id?.toString(); + const tabId = sender?.tab?.id; if (!tabId) { return; } - // Store the connection using tabId as a string key + // Store the connection connections[tabId] = port; console.warn(`Connected to tab ${tabId}`); diff --git a/wxt.config.ts b/wxt.config.ts index 894870f..c72a88b 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -13,7 +13,12 @@ export default defineConfig({ name: 'UT Lectures Plus', description: 'This plugin adds a transcript box (with search) to all LectureOnline and TowerLA lectures from UT Austin! Studying has never been easier.', - permissions: ['webRequest', 'storage'], + permissions: ['webRequest', 'storage', 'tabs'], host_permissions: ['*://*.la.utexas.edu/*'], + browser_specific_settings: { + gecko: { + id: 'ut-lectures-plus@ut.com', + }, + }, }, });
+
{ + if (state.selectedAction != 'search') { + props.onWheel(e); + } + }} + class='relative h-full overflow-y-auto px-4 pt-2 pb-16' + > + {/* Search results indicator */} + +
+ + {filteredCues().length} {filteredCues().length === 1 ? 'result' : 'results'} for " + {trimmedQuery()}" + +
+
+ + {/* Animated overlay */} + +
+ + + {/* Cues */} + + + {cue => ( + { + const video = props.videoElement(); + if (video) { + video.currentTime = cue.start + 0.1; // Add a small offset to avoid skipping + } + }} + highlight={trimmedQuery} + /> + )} + + + + +
You've reached the end!
+
+ + +
+ No bookmarks found.{' '} + +
+
+ + +
+
+
+ + +
+
+ +
+ +
+
+
+ + +
+ No summary generated.{' '} + +
+
+
+ +
+ + +
+ +
+
+
+
+ ); +}; + +export default Transcription; diff --git a/components/content/quick-actions/AISummary.tsx b/components/content/quick-actions/AISummary.tsx new file mode 100644 index 0000000..6b2e55e --- /dev/null +++ b/components/content/quick-actions/AISummary.tsx @@ -0,0 +1,239 @@ +import { Accessor, createSignal, createEffect, JSX } from 'solid-js'; +import Button from '../Button'; +import { Sparkles, X } from 'lucide-solid'; +import Dialog from '@corvu/dialog'; +import AISummaryStore from '@/context/AISummaryStore'; + +const generateAISummary = async (apiKey: string, text: string): Promise => { + const prompt = `You’re great at turning spoken content into clear summaries. +Please read the following video content and write a short, easy-to-follow summary that includes: + • The main points + • Important ideas + • Any final takeaways + +Make it clear and natural, like you’re explaining it to someone else. +Don’t say it’s a transcript or mention that it came from one. + + Content: + ${text} + `; + + const response = await fetch('https://api.openai.com/v1/responses', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + body: JSON.stringify({ + model: 'gpt-4.1-nano', + input: prompt, + }), + }); + + if (!response.ok) { + throw new Error('Failed to generate summary'); + } + + const data = await response.json(); + + const summary = data.output[0]?.content[0]?.text || 'No summary could be generated. Please try again.'; + + return summary; +}; + +/** + * AISummary component provides a dialog for generating AI summaries of video content. + * + * @param props - The props object. + * @param props.active - Indicates if the button is active. + * @param props.vttUrl - The URL of the VTT file to summarize. + * @param props.onClick - Function to call when the button is clicked. + * @param props.uiContainer - The container element for the UI. + */ +const AISummary = (props: { + active: boolean; + vttUrl: Accessor; + onClick: () => void; + uiContainer: HTMLElement; +}): JSX.Element => { + const [isLoading, setIsLoading] = createSignal(false); + const [apiKey, setApiKey] = createSignal(''); + + createEffect(() => { + const url = props.vttUrl(); + if (url) { + AISummaryStore.setCurrentUrl(url); + } + }); + + const handleAISummary = async () => { + if (!apiKey()) { + return; + } + + setIsLoading(true); + const url = props.vttUrl(); + + if (!url) { + alert('AI Summary is not available for this video.'); + setIsLoading(false); + return; + } + + const textToSummarize = await fetch(url) + .then(async response => { + const text = response.text(); + + return text + .then(text => { + const cleanedText = text + .replace(/WEBVTT[\s\S]*?\n\n/g, '') // Remove WEBVTT header + .replace(/\d{2}:\d{2}:\d{2}\.\d{3} --> \d{2}:\d{2}:\d{2}\.\d{3}/g, '') // Remove timestamps + .replace(/\n/g, ' ') // Replace newlines with spaces + .replace(/<[^>]+>/g, '') // Remove HTML tags + .replace(/\s{2,}/g, ' ') // Replace multiple spaces with a single space + .trim(); // Trim leading and trailing spaces + return cleanedText; + }) + .catch(error => { + console.error('Error parsing VTT file:', error); + return ''; + }); + }) + .catch(error => { + console.error('Error fetching VTT file:', error); + return ''; + }); + + if (!textToSummarize) { + alert('AI Summary is not available for this video.'); + setIsLoading(false); + return; + } + + try { + const generatedSummary = await generateAISummary(apiKey(), textToSummarize); + + const formattedSummary = generatedSummary.replace(/\n/g, '  \n'); + + AISummaryStore.setSummary(formattedSummary); + AISummaryStore.setOpen(false); + setIsLoading(false); + } catch (error) { + console.error(error); + alert('Failed to generate summary. Please check your API key and try again.'); + setIsLoading(false); + } + }; + + return ( + + { + if (!props.active || AISummaryStore.currentSummary != '') { + e.stopPropagation(); + e.preventDefault(); + } else { + AISummaryStore.setOpen(true); + } + }} + > +
+
+ + + + ); +}; + +export default AISummary; diff --git a/components/content/quick-actions/PlaybackRate.tsx b/components/content/quick-actions/PlaybackRate.tsx new file mode 100644 index 0000000..c0c5bf3 --- /dev/null +++ b/components/content/quick-actions/PlaybackRate.tsx @@ -0,0 +1,112 @@ +import Popover from '@corvu/popover'; +import Button from '../Button'; +import { createSignal, JSX, For } from 'solid-js'; +import { Gauge, XIcon } from 'lucide-solid'; +import { setSelectedAction, state } from '@/context/SelectedActionStore'; + +interface PlaybackRateProps { + uiContainer: HTMLElement; + onClick?: () => void; +} + +/** + * PlaybackRate component allows users to adjust the playback rate of a video. + * + * @param props - The props object. + * @returns The PlaybackRate component. + */ +const PlaybackRate = (props: PlaybackRateProps): JSX.Element => { + const [playbackRate, setPlaybackRate] = createSignal(1); + + const updatePlaybackRate = (newRate: number) => { + // Ensure rate is between 0.25 and 3 + const clampedRate = Math.max(0.25, Math.min(10, newRate)); + setPlaybackRate(parseFloat(clampedRate.toFixed(2))); + + // Update the video playback rate + const video = document.querySelector('video'); + if (video) { + video.playbackRate = clampedRate; + } + }; + + return ( + { + if (!isOpen) { + setSelectedAction(null); + } + }} + floatingOptions={{ + offset: 8, + flip: true, + shift: true, + }} + closeOnOutsidePointer={false} + > + + + ); + }} + +