diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f347d84a..b698d543 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: node-version: ${{ matrix.node-version }} - name: Install 🔧 shell: bash - run: npm install --legacy-peer-deps + run: npm install - name: Build 🔧 run: npm run build - name: Upload Artifact 🚀 diff --git a/.gitignore b/.gitignore index 13b8d1c1..86af6ce1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +tests/utils.test.js + dist/test-ui.user.js dist/*.txt diff --git a/.webpack/config.shared.js b/.webpack/config.shared.js index 71e13c50..680f3ec3 100644 --- a/.webpack/config.shared.js +++ b/.webpack/config.shared.js @@ -6,7 +6,7 @@ const __dirname = path.resolve(path.dirname(__filename)); export default { resolve: { - extensions: [".js"], + extensions: [".js", ".ts"], }, performance: { hints: "error", @@ -25,6 +25,11 @@ export default { // use: ["style-loader", "css-loader", "sass-loader"], use: ["lightning-loader"], }, + { + test: /\.ts$/, + use: "ts-loader", + exclude: /node_modules/, + }, ], }, }; diff --git a/.webpack/webpack.config.js b/.webpack/webpack.config.js index d02f78bc..63483617 100644 --- a/.webpack/webpack.config.js +++ b/.webpack/webpack.config.js @@ -15,6 +15,7 @@ import { sitesProxiTok, sitesPeertube, sitesPoketube, + sitesCoursehunterLike, } from "vot.js/alternativeUrls"; import configShared from "./config.shared.js"; @@ -78,6 +79,7 @@ export default (env) => { sitesProxiTok, sitesPeertube, sitesPoketube, + sitesCoursehunterLike, ] .map((sites) => sites.map((site) => { @@ -144,6 +146,7 @@ export default (env) => { }), new webpack.DefinePlugin({ DEBUG_MODE: dev, + // DEBUG_MODE: true, IS_BETA_VERSION: isBeta, AVAILABLE_LOCALES: JSON.stringify(availableLocales), ...(() => { diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..43296c9c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,48 @@ +## voice-over-translation contributing guide + +### Updating vot.js package + +Casual: + +1. Install new version of vot.js with + +```bash +npm install vot.js@x.x.x +``` + +If patches broken after casual: + +1. Remove "postinstall" script from package.json +2. Remove vot.js package with + +```bash +npm uninstall vot.js +``` + +3. Install new version of vot.js with + +```bash +npm install vot.js +``` + +4. Restore "postinstall" script in package.json +5. Run patch-package + +```bash +npx patch-package +``` + +6. If it ended with an error run + +```bash +npx patch-package --partial +``` + +7. Fix errors from patch-package-errors.log +8. Run patch-package update + +```bash +npx patch-package vot.js +``` + +9. Repeat 5-7 steps before success applying patches diff --git a/README-EN.md b/README-EN.md index f5b8f5aa..6da04380 100644 --- a/README-EN.md +++ b/README-EN.md @@ -44,54 +44,7 @@ The voice-over translation of the video is now available not only in YandexBrows ## List of supported sites: -You can see all the restrictions related to site support in [wiki](https://github.com/ilyhalight/voice-over-translation/wiki/%5BEN%5D-Supported-sites). - -- **[YouTube](https://www.youtube.com)** -- **[Twitch](https://www.twitch.tv)** -- **[VK](https://vk.com)** -- **[OK](https://ok.ru/)** -- **[Twitter](https://twitter.com/)** -- **[9GAG](https://9gag.com/gag/)** -- **[Rutube](https://rutube.ru/)** -- **[Bilibili](https://bilibili.com/)** -- **[Video Mail.ru](https://my.mail.ru/video)** -- **[Vimeo](https://vimeo.com/)** -- **[XVideos](https://xvideos.com/)** -- **[PornHub](https://rt.pornhub.com/)** -- **[Bitchute](https://www.bitchute.com/)** -- **[Coursera](https://www.coursera.org/)** -- **[[⚠️] Udemy](https://www.udemy.com/)** -- **[Facebook\*](https://facebook.com/)** -- **[TikTok](https://tiktok.com/)** -- **[Rumble](https://rumble.com/)** -- **[EPorner](https://www.eporner.com/)** -- **[Peertube](https://tube.shanti.cafe/)** -- **[Dailymotion](https://www.dailymotion.com/)** -- **[Trovo](https://trovo.live/)** -- **[Yandex Disk](https://disk.yandex.ru/)** -- **[Google Drive](https://drive.google.com/)** -- **[Banned Video](https://banned.video/)** -- **[Weverse](https://weverse.io/)** -- **[Egghead](https://egghead.io)** -- **[Youku](https://youku.com)** -- **[Archive.org](https://archive.org)** -- **[Newgrounds](https://newgrounds.com)** -- **[ProxiTok](https://proxitok.pabloferreiro.es/)** -- **[Invidious](https://yewtu.be)** -- **[Piped](https://piped.video)** -- **[Kodik (player)](https://kodik.cc)** -- **[Patreon](https://patreon.com)** -- **[Reddit](https://reddit.com)** -- **[Kick](https://kick.com)** -- **[Apple Developer](https://developer.apple.com)** -- **[EpicGames Developers](https://dev.epicgames.com)** -- **[9AnimeTV](https://9animetv.to/)** -- **[Sap learning](https://learning.sap.com/)** -- **[Watchporn.to](https://watchporn.to/)** -- **[Linkedin learning](https://www.linkedin.com/)** -- **Any direct web links to `.mp4` or `.webm`** - -⚠️ - Requires additional actions, more in **[Wiki](https://github.com/ilyhalight/voice-over-translation/wiki/%5BEN%5D-Supported-sites)** +You can see the full list of supported websites and all restrictions related to their support in **[wiki](https://github.com/ilyhalight/voice-over-translation/wiki/%5BEN%5D-Supported-sites)** ### Our domains: @@ -263,5 +216,3 @@ To activate the script in Tampermonkey (MV3), you must [enable "Developer Mode"] | ⠀[Install guide](https://github.com/ilyhalight/voice-over-translation/wiki/%5BEN%5D-FAQ#how-to-use-the-extension-with-user-js-and-css) | Any | User Javascript and CSS | ![example btn](https://github.com/ilyhalight/voice-over-translation/blob/master/img/example_en.png "btn") - -\*: Banned on the territory of the Russian Federation diff --git a/README.md b/README.md index 4cb892e4..858ab768 100644 --- a/README.md +++ b/README.md @@ -45,54 +45,7 @@ ## Список поддерживаемых сайтов: -Все ограничения, связанные с поддержкой сайтов вы можете увидеть в [вики](https://github.com/ilyhalight/voice-over-translation/wiki/%5BRU%5D-Supported-sites). - -- **[YouTube](https://www.youtube.com)** -- **[Twitch](https://www.twitch.tv)** -- **[VK](https://vk.com)** -- **[OK](https://ok.ru/)** -- **[Twitter](https://twitter.com/)** -- **[9GAG](https://9gag.com/gag/)** -- **[Rutube](https://rutube.ru/)** -- **[Bilibili](https://bilibili.com/)** -- **[Видео Mail.ru](https://my.mail.ru/video)** -- **[Vimeo](https://vimeo.com/)** -- **[XVideos](https://xvideos.com/)** -- **[PornHub](https://rt.pornhub.com/)** -- **[Bitchute](https://www.bitchute.com/)** -- **[Coursera](https://www.coursera.org/)** -- **[[⚠️] Udemy](https://www.udemy.com/)** -- **[Facebook\*](https://facebook.com/)** -- **[TikTok](https://tiktok.com/)** -- **[Rumble](https://rumble.com/)** -- **[EPorner](https://www.eporner.com/)** -- **[Peertube](https://tube.shanti.cafe/)** -- **[Dailymotion](https://www.dailymotion.com/)** -- **[Trovo](https://trovo.live/)** -- **[Yandex Disk](https://disk.yandex.ru/)** -- **[Google Drive](https://drive.google.com/)** -- **[Banned Video](https://banned.video/)** -- **[Weverse](https://weverse.io/)** -- **[Egghead](https://egghead.io)** -- **[Youku](https://youku.com)** -- **[Archive.org](https://archive.org)** -- **[Newgrounds](https://newgrounds.com)** -- **[ProxiTok](https://proxitok.pabloferreiro.es/)** -- **[Invidious](https://yewtu.be)** -- **[Piped](https://piped.video)** -- **[Kodik (player)](https://kodik.cc)** -- **[Patreon](https://patreon.com)** -- **[Reddit](https://reddit.com)** -- **[Kick](https://kick.com)** -- **[Apple Developer](https://developer.apple.com)** -- **[EpicGames Developers](https://dev.epicgames.com)** -- **[9AnimeTV](https://9animetv.to/)** -- **[Sap learning](https://learning.sap.com/)** -- **[Watchporn.to](https://watchporn.to/)** -- **[Linkedin learning](https://www.linkedin.com/)** -- **Любые прямые веб-ссылки на `.mp4` или `.webm`** - -⚠️ - Требует дополнительных действий, подробнее в **[Wiki](https://github.com/ilyhalight/voice-over-translation/wiki/%5BRU%5D-Supported-sites)** +Полный список поддерживаемых веб-сайтов и все ограничения, связанные с их поддержкой, вы можете увидеть в **[вики](https://github.com/ilyhalight/voice-over-translation/wiki/%5BRU%5D-Supported-sites)** ### Наши домены: @@ -266,5 +219,3 @@ bun l10n | ⠀[Гайд по установке](https://github.com/ilyhalight/voice-over-translation/wiki/%5BRU%5D-FAQ#%D0%BA%D0%B0%D0%BA-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81-user-js-and-css) | Любой | User Javascript and CSS | ![example btn](https://github.com/ilyhalight/voice-over-translation/blob/master/img/example.png "btn") - -\*: Запрещена на территории РФ diff --git a/bun.lockb b/bun.lockb index 3d238f88..a1b2d3b4 100644 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/changelog.md b/changelog.md index bf87bd90..02d4879f 100644 --- a/changelog.md +++ b/changelog.md @@ -3,13 +3,68 @@ + + -# 1.7.1 [WIP] +# 1.7.1 +- Добавлена поддержка Coursetrain (coursetrain.net) (#706) +- Добавлена поддержка Ricktube (ricktube.ru) +- Добавлена поддержка Bilibili Bangumi (#852) +- Добавлена поддержка Incestflix (#705) +- Добавлена поддержка субтитров от сайта для Vimeo - Включен обход Media CSP для player.vimeo.com +- Добавлена поддержка просмотра видео в плеере Яндекс Диска без перехода по публичной ссылка (Вы все еще должны открыть публичный доступ к файлу (Не к папке!!!)) (#837) +- Исправлено долгое ожидание перевода для новых запросов на перевод для YouTube (статус = 6) ([1#issuecomment-2433274910](https://github.com/ilyhalight/voice-over-translation/issues/1#issuecomment-2433274910), [868#issuecomment-2436080833](https://github.com/ilyhalight/voice-over-translation/issues/868#issuecomment-2436080833)) - Исправлена работа встраиваемого плеера Vimeo (player.vimeo.com), если видео залито в приватный доступ и доступно только через встраивание (#543, #828) +- Переработан новый аудиоплеер, который полностью работает на AudioContext + + По умолчанию данный плеер используется, только, чтобы обходить Media CSP на некоторыъ сайтах. Если вам нужен какой-либо из ниже перечисленных фиксов, то вам нужно будет снять галочку "Использовать только для обхода Media CSP" + + - Исправлена работа медиаклавиш, если включен новый плеер (#192, #841) + - Исправлена работа PiP при активном переводе для браузера Arc (#357) + - Опция "Обходить Media CSP" заменена на "Использовать только для обхода Media CSP" (речь про новый плеер), а так же, теперь, данная опция зависит от состояния опции "Использовать новый аудио плеер" + +- Исправлена ошибка из-за которой озвучка иногда могла не стартовать со старым плеером (#840) +- Теперь, при преобразование секунд в минуты будет учитываться доля секунд, вычисляемая по формуле secs/60, и если доля секунд больше N%, то результат будет округляться до следующей минуты. Благодаря этому, будет меньше ситуаций, когда сервер вернул, что необходимо подождать, например 110 секунд, а расширение пишет, что осталось около 1 минуты +- Исправлено добавление обводки для слайдеров на некоторых сайтах +- Исправлено некорректное отображение чекбоксов на некоторых сайтах +- Переработана логика работы с аудио плеерами + +# 1.7.1 Beta 4 + +- Исправлена ошибка из-за которой при смене видео кнопка могла перестать работать со старым плеером ([875#discussioncomment-11085577](https://github.com/ilyhalight/voice-over-translation/discussions/875#discussioncomment-11085577)) + +# 1.7.1 Beta 3 + +- Обновлена логика запросов к VOT Worker для поддержки новых запросов из 1.7.1-beta2 +- Обновлена логика нового плеера. Теперь, он не использует Tone.js и работает лучше, чем раньше + +# 1.7.1 Beta 2 + +- Добавлена поддержка Coursetrain (coursetrain.net) (#706) +- Добавлена поддержка Ricktube (ricktube.ru) +- Добавлена поддержка Bilibili Bangumi (#852) +- Добавлена поддержка Incestflix (#705) +- Частично исправлено добавление питча при увеличение/уменьшение скорости с новым плеером (#849, #853, #840) +- Исправлена логика работы расширенного увеличения громкости с новым плеером +- (БЕЗ ОБНОВЛЕНИЯ VOT WORKER) Исправлено долгое ожидание перевода для новых запросов на перевод для YouTube (статус = 6) ([1#issuecomment-2433274910](https://github.com/ilyhalight/voice-over-translation/issues/1#issuecomment-2433274910), [868#issuecomment-2436080833](https://github.com/ilyhalight/voice-over-translation/issues/868#issuecomment-2436080833)) +- Опция "Восстановление мультимедийных клавиш" заменена на "Использовать новый аудио плеер" +- Опция "Обходить Media CSP" заменена на "Использовать только для обхода Media CSP" (речь про новый плеер), а так же, теперь, зависит от состояния опции "Использовать новый аудио плеер" +- Исправлено добавление обводки для слайдеров на некоторых сайтах +- Исправлено некорректное отображение чекбоксов на некоторых сайтах +- Переработана логика работы с аудио плеерами +- Часть кода переписана на TypeScript + +# 1.7.1 Beta 1 + +- Включен обход Media CSP для player.vimeo.com - Добавлена поддержка субтитров от сайта для Vimeo -- Исправлено неверное название при отключение чекбокса усилителя громкости аудио +- Исправлено неверное название переменной для отключения чекбокса усилителя громкости аудио, что могло приводить к ошибке +- Исправлена работа встраиваемого плеера Vimeo (player.vimeo.com), если видео залито в приватный доступ и доступно только через встраивание (#543, #828) +- Исправлена работа медиаклавиш, если в браузере есть поддержка AudioContext (#192, #357, #841) + + В меню расширения добавлен чекбокс "Restoring multimedia keys". По умолчанию чекбокс включен, если браузер поддерживает AudioContext. С включением чекбокса "Restoring multimedia keys", изменение значения чекбокса "Bypassing Media CSP" становится недоступным т.к. эти два чекбокса выполняют один и тот же функционал, но "Bypassing Media CSP" действует для ограниченного числа веб-сайтов, а "Restoring multimedia keys" для всех веб-сайтов с которыми работает расширение. Если после этого перехода не возникнет серьезных проблем, то чекбокс "Bypassing Media CSP" будет полностью удален. # 1.7.0 diff --git a/dist/vot-min.user.js b/dist/vot-min.user.js index 3e258ca9..f8c7e6cb 100644 --- a/dist/vot-min.user.js +++ b/dist/vot-min.user.js @@ -50,8 +50,7 @@ // @match *://*.dailymotion.com/* // @match *://*.ok.ru/* // @match *://trovo.live/* -// @match *://disk.yandex.ru/i/* -// @match *://coursehunter.net/* +// @match *://disk.yandex.ru/* // @match *://youtube.googleapis.com/embed/* // @match *://*.banned.video/* // @match *://*.weverse.io/* @@ -73,6 +72,9 @@ // @match *://learning.sap.com/* // @match *://*.watchporn.to/* // @match *://*.linkedin.com/* +// @match *://*.ricktube.ru/* +// @match *://*.incestflix.net/* +// @match *://*.incestflix.to/* // @match *://*/*.mp4* // @match *://*/*.webm* // @match *://*.yewtu.be/* @@ -147,6 +149,8 @@ // @match *://poke.ggtyler.dev/* // @match *://poke.uk2.littlekai.co.uk/* // @match *://poke.blahai.gay/* +// @match *://*.coursehunter.net/* +// @match *://*.coursetrain.net/* // @exclude file://*/*.mp4* // @exclude file://*/*.webm* // @exclude *://accounts.youtube.com/* @@ -161,7 +165,7 @@ // @connect onrender.com // @connect workers.dev // @namespace vot-min -// @version 1.7.0 +// @version 1.7.1 // @icon https://translate.yandex.ru/icons/favicon.ico // @author sodapng, mynovelhost, Toil, SashaXser, MrSoczekXD // @homepageURL https://github.com/ilyhalight/voice-over-translation @@ -171,7 +175,13 @@ // ==/UserScript== /*! For license information please see vot-min.user.js.LICENSE.txt */ -(()=>{var t={"./src/styles/main.scss":()=>{GM_addStyle('.vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;min-width:64px;height:36px;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before,.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border-radius:4px;outline:none;min-width:64px;height:36px;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:"";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-outlined-button[disabled=true]:before,.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:4px;outline:none;min-width:64px;height:36px;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-text-button[disabled=true]:before,.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:50%;outline:none;width:36px;height:36px;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-icon-button[disabled=true]:before,.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:#0000!important;border-radius:4px!important;width:100%!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 #0000,inset -1px 0 #0000,inset 0 -1px #0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):placeholder-shown,.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;width:100%!important;max-height:100%!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span,.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:""!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px #0000!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid #0000!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid #0000!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before,.vot-textfield>input:not(:focus):placeholder-shown+span:after,.vot-textfield>textarea:not(:focus):placeholder-shown+span:before,.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:#0000!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown,.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after,.vot-textfield>input:disabled:placeholder-shown,.vot-textfield>input:disabled:placeholder-shown+span,.vot-textfield>textarea:disabled:placeholder-shown,.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before,.vot-textfield>input:disabled:placeholder-shown+span:after,.vot-textfield>textarea:disabled:placeholder-shown+span:before,.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:#0000!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block}.vot-checkbox>input+span:before{content:"";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:"";z-index:10000;pointer-events:none;border:0 solid #0000;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked,.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before,.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after,.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:#0000}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked,.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:#0000}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;width:100%!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:#0000!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:""!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:#0000!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;width:20px;height:32px;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;max-width:100vw;height:32px;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{color:inherit;background-color:#0000;border:none;justify-content:center;align-items:center;height:100%;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;min-height:100px;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;height:fit-content;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px #0000001f,0 16px 16px #0000003d}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:#0009;transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,#2e2f34cc);color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;width:max-content;max-width:100%;max-height:100%;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}')},"./node_modules/bowser/es5.js":function(t){t.exports=function(t){var e={};function o(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=t,o.c=e,o.d=function(t,e,a){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(o.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)o.d(a,n,function(e){return t[e]}.bind(null,n));return a},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=90)}({17:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var a=o(18),n=function(){function t(){}return t.getFirstMatch=function(t,e){var o=e.match(t);return o&&o.length>0&&o[1]||""},t.getSecondMatch=function(t,e){var o=e.match(t);return o&&o.length>1&&o[2]||""},t.matchAndReturnConst=function(t,e,o){if(t.test(e))return o},t.getWindowsVersionName=function(t){switch(t){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},t.getMacOSVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),10===e[0])switch(e[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},t.getAndroidVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),!(1===e[0]&&e[1]<5))return 1===e[0]&&e[1]<6?"Cupcake":1===e[0]&&e[1]>=6?"Donut":2===e[0]&&e[1]<2?"Eclair":2===e[0]&&2===e[1]?"Froyo":2===e[0]&&e[1]>2?"Gingerbread":3===e[0]?"Honeycomb":4===e[0]&&e[1]<1?"Ice Cream Sandwich":4===e[0]&&e[1]<4?"Jelly Bean":4===e[0]&&e[1]>=4?"KitKat":5===e[0]?"Lollipop":6===e[0]?"Marshmallow":7===e[0]?"Nougat":8===e[0]?"Oreo":9===e[0]?"Pie":void 0},t.getVersionPrecision=function(t){return t.split(".").length},t.compareVersions=function(e,o,a){void 0===a&&(a=!1);var n=t.getVersionPrecision(e),i=t.getVersionPrecision(o),r=Math.max(n,i),s=0,l=t.map([e,o],(function(e){var o=r-t.getVersionPrecision(e),a=e+new Array(o+1).join(".0");return t.map(a.split("."),(function(t){return new Array(20-t.length).join("0")+t})).reverse()}));for(a&&(s=r-Math.min(n,i)),r-=1;r>=s;){if(l[0][r]>l[1][r])return 1;if(l[0][r]===l[1][r]){if(r===s)return 0;r-=1}else if(l[0][r]1?n-1:0),r=1;r0){var r=Object.keys(o),l=s.default.find(r,(function(t){return e.isOS(t)}));if(l){var d=this.satisfies(o[l]);if(void 0!==d)return d}var u=s.default.find(r,(function(t){return e.isPlatform(t)}));if(u){var c=this.satisfies(o[u]);if(void 0!==c)return c}}if(i>0){var h=Object.keys(n),p=s.default.find(h,(function(t){return e.isBrowser(t,!0)}));if(void 0!==p)return this.compareVersion(n[p])}},e.isBrowser=function(t,e){void 0===e&&(e=!1);var o=this.getBrowserName().toLowerCase(),a=t.toLowerCase(),n=s.default.getBrowserTypeByAlias(a);return e&&n&&(a=n.toLowerCase()),a===o},e.compareVersion=function(t){var e=[0],o=t,a=!1,n=this.getBrowserVersion();if("string"==typeof n)return">"===t[0]||"<"===t[0]?(o=t.substr(1),"="===t[1]?(a=!0,o=t.substr(2)):e=[],">"===t[0]?e.push(1):e.push(-1)):"="===t[0]?o=t.substr(1):"~"===t[0]&&(a=!0,o=t.substr(1)),e.indexOf(s.default.compareVersions(n,o,a))>-1},e.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},e.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},e.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},e.is=function(t,e){return void 0===e&&(e=!1),this.isBrowser(t,e)||this.isOS(t)||this.isPlatform(t)},e.some=function(t){var e=this;return void 0===t&&(t=[]),t.some((function(t){return e.is(t)}))},t}();e.default=d,t.exports=e.default},92:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var a,n=(a=o(17))&&a.__esModule?a:{default:a},i=/version\/(\d+(\.?_?\d+)+)/i,r=[{test:[/googlebot/i],describe:function(t){var e={name:"Googlebot"},o=n.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/opera/i],describe:function(t){var e={name:"Opera"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opr\/|opios/i],describe:function(t){var e={name:"Opera"},o=n.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/SamsungBrowser/i],describe:function(t){var e={name:"Samsung Internet for Android"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Whale/i],describe:function(t){var e={name:"NAVER Whale Browser"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MZBrowser/i],describe:function(t){var e={name:"MZ Browser"},o=n.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/focus/i],describe:function(t){var e={name:"Focus"},o=n.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/swing/i],describe:function(t){var e={name:"Swing"},o=n.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/coast/i],describe:function(t){var e={name:"Opera Coast"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(t){var e={name:"Opera Touch"},o=n.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/yabrowser/i],describe:function(t){var e={name:"Yandex Browser"},o=n.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/ucbrowser/i],describe:function(t){var e={name:"UC Browser"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Maxthon|mxios/i],describe:function(t){var e={name:"Maxthon"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/epiphany/i],describe:function(t){var e={name:"Epiphany"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/puffin/i],describe:function(t){var e={name:"Puffin"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sleipnir/i],describe:function(t){var e={name:"Sleipnir"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/k-meleon/i],describe:function(t){var e={name:"K-Meleon"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/micromessenger/i],describe:function(t){var e={name:"WeChat"},o=n.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/qqbrowser/i],describe:function(t){var e={name:/qqbrowserlite/i.test(t)?"QQ Browser Lite":"QQ Browser"},o=n.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/msie|trident/i],describe:function(t){var e={name:"Internet Explorer"},o=n.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/\sedg\//i],describe:function(t){var e={name:"Microsoft Edge"},o=n.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/edg([ea]|ios)/i],describe:function(t){var e={name:"Microsoft Edge"},o=n.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/vivaldi/i],describe:function(t){var e={name:"Vivaldi"},o=n.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/seamonkey/i],describe:function(t){var e={name:"SeaMonkey"},o=n.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sailfish/i],describe:function(t){var e={name:"Sailfish"},o=n.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,t);return o&&(e.version=o),e}},{test:[/silk/i],describe:function(t){var e={name:"Amazon Silk"},o=n.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/phantom/i],describe:function(t){var e={name:"PhantomJS"},o=n.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/slimerjs/i],describe:function(t){var e={name:"SlimerJS"},o=n.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e={name:"BlackBerry"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e={name:"WebOS Browser"},o=n.default.getFirstMatch(i,t)||n.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/bada/i],describe:function(t){var e={name:"Bada"},o=n.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/tizen/i],describe:function(t){var e={name:"Tizen"},o=n.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/qupzilla/i],describe:function(t){var e={name:"QupZilla"},o=n.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var e={name:"Firefox"},o=n.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/electron/i],describe:function(t){var e={name:"Electron"},o=n.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MiuiBrowser/i],describe:function(t){var e={name:"Miui"},o=n.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/chromium/i],describe:function(t){var e={name:"Chromium"},o=n.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,t)||n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/chrome|crios|crmo/i],describe:function(t){var e={name:"Chrome"},o=n.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/GSA/i],describe:function(t){var e={name:"Google Search"},o=n.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e={name:"Android Browser"},o=n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/playstation 4/i],describe:function(t){var e={name:"PlayStation 4"},o=n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/safari|applewebkit/i],describe:function(t){var e={name:"Safari"},o=n.default.getFirstMatch(i,t);return o&&(e.version=o),e}},{test:[/.*/i],describe:function(t){var e=-1!==t.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:n.default.getFirstMatch(e,t),version:n.default.getSecondMatch(e,t)}}}];e.default=r,t.exports=e.default},93:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var a,n=(a=o(17))&&a.__esModule?a:{default:a},i=o(18),r=[{test:[/Roku\/DVP/],describe:function(t){var e=n.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,t);return{name:i.OS_MAP.Roku,version:e}}},{test:[/windows phone/i],describe:function(t){var e=n.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,t);return{name:i.OS_MAP.WindowsPhone,version:e}}},{test:[/windows /i],describe:function(t){var e=n.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,t),o=n.default.getWindowsVersionName(e);return{name:i.OS_MAP.Windows,version:e,versionName:o}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(t){var e={name:i.OS_MAP.iOS},o=n.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,t);return o&&(e.version=o),e}},{test:[/macintosh/i],describe:function(t){var e=n.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,t).replace(/[_\s]/g,"."),o=n.default.getMacOSVersionName(e),a={name:i.OS_MAP.MacOS,version:e};return o&&(a.versionName=o),a}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var e=n.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,t).replace(/[_\s]/g,".");return{name:i.OS_MAP.iOS,version:e}}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e=n.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,t),o=n.default.getAndroidVersionName(e),a={name:i.OS_MAP.Android,version:e};return o&&(a.versionName=o),a}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e=n.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,t),o={name:i.OS_MAP.WebOS};return e&&e.length&&(o.version=e),o}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e=n.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,t)||n.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,t)||n.default.getFirstMatch(/\bbb(\d+)/i,t);return{name:i.OS_MAP.BlackBerry,version:e}}},{test:[/bada/i],describe:function(t){var e=n.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,t);return{name:i.OS_MAP.Bada,version:e}}},{test:[/tizen/i],describe:function(t){var e=n.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,t);return{name:i.OS_MAP.Tizen,version:e}}},{test:[/linux/i],describe:function(){return{name:i.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:i.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var e=n.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,t);return{name:i.OS_MAP.PlayStation4,version:e}}}];e.default=r,t.exports=e.default},94:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var a,n=(a=o(17))&&a.__esModule?a:{default:a},i=o(18),r=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(t){var e=n.default.getFirstMatch(/(can-l01)/i,t)&&"Nova",o={type:i.PLATFORMS_MAP.mobile,vendor:"Huawei"};return e&&(o.model=e),o}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:i.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:i.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:i.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:i.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:i.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:i.PLATFORMS_MAP.tablet}}},{test:function(t){var e=t.test(/ipod|iphone/i),o=t.test(/like (ipod|iphone)/i);return e&&!o},describe:function(t){var e=n.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:i.PLATFORMS_MAP.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:i.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:i.PLATFORMS_MAP.mobile}}},{test:function(t){return"blackberry"===t.getBrowserName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(t){return"bada"===t.getBrowserName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.mobile}}},{test:function(t){return"windows phone"===t.getBrowserName()},describe:function(){return{type:i.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(t){var e=Number(String(t.getOSVersion()).split(".")[0]);return"android"===t.getOSName(!0)&&e>=3},describe:function(){return{type:i.PLATFORMS_MAP.tablet}}},{test:function(t){return"android"===t.getOSName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.mobile}}},{test:function(t){return"macos"===t.getOSName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(t){return"windows"===t.getOSName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.desktop}}},{test:function(t){return"linux"===t.getOSName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.desktop}}},{test:function(t){return"playstation 4"===t.getOSName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.tv}}},{test:function(t){return"roku"===t.getOSName(!0)},describe:function(){return{type:i.PLATFORMS_MAP.tv}}}];e.default=r,t.exports=e.default},95:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var a,n=(a=o(17))&&a.__esModule?a:{default:a},i=o(18),r=[{test:function(t){return"microsoft edge"===t.getBrowserName(!0)},describe:function(t){if(/\sedg\//i.test(t))return{name:i.ENGINE_MAP.Blink};var e=n.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,t);return{name:i.ENGINE_MAP.EdgeHTML,version:e}}},{test:[/trident/i],describe:function(t){var e={name:i.ENGINE_MAP.Trident},o=n.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){return t.test(/presto/i)},describe:function(t){var e={name:i.ENGINE_MAP.Presto},o=n.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=t.test(/gecko/i),o=t.test(/like gecko/i);return e&&!o},describe:function(t){var e={name:i.ENGINE_MAP.Gecko},o=n.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:i.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var e={name:i.ENGINE_MAP.WebKit},o=n.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}}];e.default=r,t.exports=e.default}})},"./node_modules/requestidlecallback-polyfill/index.js":()=>{window.requestIdleCallback=window.requestIdleCallback||function(t){var e=Date.now();return setTimeout((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),1)},window.cancelIdleCallback=window.cancelIdleCallback||function(t){clearTimeout(t)}}},e={};function o(a){var n=e[a];if(void 0!==n)return n.exports;var i=e[a]={exports:{}};return t[a].call(i.exports,i,i.exports,o),i.exports}(()=>{"use strict";var t=o("./node_modules/bowser/es5.js");const e=protobuf;var a;function n(t){switch(t){case 0:case"NO_CONNECTION":return a.NO_CONNECTION;case 10:case"TRANSLATING":return a.TRANSLATING;case 20:case"STREAMING":return a.STREAMING;default:return a.UNRECOGNIZED}}!function(t){t[t.NO_CONNECTION=0]="NO_CONNECTION",t[t.TRANSLATING=10]="TRANSLATING",t[t.STREAMING=20]="STREAMING",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(a||(a={}));const i={encode:(t,o=e.Writer.create())=>(""!==t.target&&o.uint32(10).string(t.target),""!==t.targetUrl&&o.uint32(18).string(t.targetUrl),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={target:"",targetUrl:""};for(;a.pos>>3){case 1:if(10!==t)break;i.target=a.string();continue;case 2:if(18!==t)break;i.targetUrl=a.string();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({target:f(t.target)?globalThis.String(t.target):"",targetUrl:f(t.targetUrl)?globalThis.String(t.targetUrl):""}),toJSON(t){const e={};return""!==t.target&&(e.target=t.target),""!==t.targetUrl&&(e.targetUrl=t.targetUrl),e},create:t=>i.fromPartial(t??{}),fromPartial(t){const e={target:"",targetUrl:""};return e.target=t.target??"",e.targetUrl=t.targetUrl??"",e}};const r={encode(t,o=e.Writer.create()){""!==t.url&&o.uint32(26).string(t.url),void 0!==t.deviceId&&o.uint32(34).string(t.deviceId),!1!==t.firstRequest&&o.uint32(40).bool(t.firstRequest),0!==t.duration&&o.uint32(49).double(t.duration),0!==t.unknown0&&o.uint32(56).int32(t.unknown0),""!==t.language&&o.uint32(66).string(t.language),!1!==t.forceSourceLang&&o.uint32(72).bool(t.forceSourceLang),0!==t.unknown1&&o.uint32(80).int32(t.unknown1);for(const e of t.translationHelp)i.encode(e,o.uint32(90).fork()).ldelim();return""!==t.responseLanguage&&o.uint32(114).string(t.responseLanguage),0!==t.unknown2&&o.uint32(120).int32(t.unknown2),0!==t.unknown3&&o.uint32(128).int32(t.unknown3),!1!==t.bypassCache&&o.uint32(136).bool(t.bypassCache),o},decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const r={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1};for(;a.pos>>3){case 3:if(26!==t)break;r.url=a.string();continue;case 4:if(34!==t)break;r.deviceId=a.string();continue;case 5:if(40!==t)break;r.firstRequest=a.bool();continue;case 6:if(49!==t)break;r.duration=a.double();continue;case 7:if(56!==t)break;r.unknown0=a.int32();continue;case 8:if(66!==t)break;r.language=a.string();continue;case 9:if(72!==t)break;r.forceSourceLang=a.bool();continue;case 10:if(80!==t)break;r.unknown1=a.int32();continue;case 11:if(90!==t)break;r.translationHelp.push(i.decode(a,a.uint32()));continue;case 14:if(114!==t)break;r.responseLanguage=a.string();continue;case 15:if(120!==t)break;r.unknown2=a.int32();continue;case 16:if(128!==t)break;r.unknown3=a.int32();continue;case 17:if(136!==t)break;r.bypassCache=a.bool();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return r},fromJSON:t=>({url:f(t.url)?globalThis.String(t.url):"",deviceId:f(t.deviceId)?globalThis.String(t.deviceId):void 0,firstRequest:!!f(t.firstRequest)&&globalThis.Boolean(t.firstRequest),duration:f(t.duration)?globalThis.Number(t.duration):0,unknown0:f(t.unknown0)?globalThis.Number(t.unknown0):0,language:f(t.language)?globalThis.String(t.language):"",forceSourceLang:!!f(t.forceSourceLang)&&globalThis.Boolean(t.forceSourceLang),unknown1:f(t.unknown1)?globalThis.Number(t.unknown1):0,translationHelp:globalThis.Array.isArray(t?.translationHelp)?t.translationHelp.map((t=>i.fromJSON(t))):[],responseLanguage:f(t.responseLanguage)?globalThis.String(t.responseLanguage):"",unknown2:f(t.unknown2)?globalThis.Number(t.unknown2):0,unknown3:f(t.unknown3)?globalThis.Number(t.unknown3):0,bypassCache:!!f(t.bypassCache)&&globalThis.Boolean(t.bypassCache)}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),void 0!==t.deviceId&&(e.deviceId=t.deviceId),!1!==t.firstRequest&&(e.firstRequest=t.firstRequest),0!==t.duration&&(e.duration=t.duration),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.language&&(e.language=t.language),!1!==t.forceSourceLang&&(e.forceSourceLang=t.forceSourceLang),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),t.translationHelp?.length&&(e.translationHelp=t.translationHelp.map((t=>i.toJSON(t)))),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),0!==t.unknown3&&(e.unknown3=Math.round(t.unknown3)),!1!==t.bypassCache&&(e.bypassCache=t.bypassCache),e},create:t=>r.fromPartial(t??{}),fromPartial(t){const e={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1};return e.url=t.url??"",e.deviceId=t.deviceId??void 0,e.firstRequest=t.firstRequest??!1,e.duration=t.duration??0,e.unknown0=t.unknown0??0,e.language=t.language??"",e.forceSourceLang=t.forceSourceLang??!1,e.unknown1=t.unknown1??0,e.translationHelp=t.translationHelp?.map((t=>i.fromPartial(t)))||[],e.responseLanguage=t.responseLanguage??"",e.unknown2=t.unknown2??0,e.unknown3=t.unknown3??0,e.bypassCache=t.bypassCache??!1,e}};const s={encode:(t,o=e.Writer.create())=>(void 0!==t.url&&o.uint32(10).string(t.url),void 0!==t.duration&&o.uint32(17).double(t.duration),0!==t.status&&o.uint32(32).int32(t.status),void 0!==t.remainingTime&&o.uint32(40).int32(t.remainingTime),void 0!==t.unknown0&&o.uint32(48).int32(t.unknown0),""!==t.translationId&&o.uint32(58).string(t.translationId),void 0!==t.language&&o.uint32(66).string(t.language),void 0!==t.message&&o.uint32(74).string(t.message),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};for(;a.pos>>3){case 1:if(10!==t)break;i.url=a.string();continue;case 2:if(17!==t)break;i.duration=a.double();continue;case 4:if(32!==t)break;i.status=a.int32();continue;case 5:if(40!==t)break;i.remainingTime=a.int32();continue;case 6:if(48!==t)break;i.unknown0=a.int32();continue;case 7:if(58!==t)break;i.translationId=a.string();continue;case 8:if(66!==t)break;i.language=a.string();continue;case 9:if(74!==t)break;i.message=a.string();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({url:f(t.url)?globalThis.String(t.url):void 0,duration:f(t.duration)?globalThis.Number(t.duration):void 0,status:f(t.status)?globalThis.Number(t.status):0,remainingTime:f(t.remainingTime)?globalThis.Number(t.remainingTime):void 0,unknown0:f(t.unknown0)?globalThis.Number(t.unknown0):void 0,translationId:f(t.translationId)?globalThis.String(t.translationId):"",language:f(t.language)?globalThis.String(t.language):void 0,message:f(t.message)?globalThis.String(t.message):void 0}),toJSON(t){const e={};return void 0!==t.url&&(e.url=t.url),void 0!==t.duration&&(e.duration=t.duration),0!==t.status&&(e.status=Math.round(t.status)),void 0!==t.remainingTime&&(e.remainingTime=Math.round(t.remainingTime)),void 0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translationId&&(e.translationId=t.translationId),void 0!==t.language&&(e.language=t.language),void 0!==t.message&&(e.message=t.message),e},create:t=>s.fromPartial(t??{}),fromPartial(t){const e={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};return e.url=t.url??void 0,e.duration=t.duration??void 0,e.status=t.status??0,e.remainingTime=t.remainingTime??void 0,e.unknown0=t.unknown0??void 0,e.translationId=t.translationId??"",e.language=t.language??void 0,e.message=t.message??void 0,e}};const l={encode:(t,o=e.Writer.create())=>(""!==t.language&&o.uint32(10).string(t.language),""!==t.url&&o.uint32(18).string(t.url),0!==t.unknown0&&o.uint32(24).int32(t.unknown0),""!==t.translatedLanguage&&o.uint32(34).string(t.translatedLanguage),""!==t.translatedUrl&&o.uint32(42).string(t.translatedUrl),0!==t.unknown1&&o.uint32(48).int32(t.unknown1),0!==t.unknown2&&o.uint32(56).int32(t.unknown2),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};for(;a.pos>>3){case 1:if(10!==t)break;i.language=a.string();continue;case 2:if(18!==t)break;i.url=a.string();continue;case 3:if(24!==t)break;i.unknown0=a.int32();continue;case 4:if(34!==t)break;i.translatedLanguage=a.string();continue;case 5:if(42!==t)break;i.translatedUrl=a.string();continue;case 6:if(48!==t)break;i.unknown1=a.int32();continue;case 7:if(56!==t)break;i.unknown2=a.int32();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({language:f(t.language)?globalThis.String(t.language):"",url:f(t.url)?globalThis.String(t.url):"",unknown0:f(t.unknown0)?globalThis.Number(t.unknown0):0,translatedLanguage:f(t.translatedLanguage)?globalThis.String(t.translatedLanguage):"",translatedUrl:f(t.translatedUrl)?globalThis.String(t.translatedUrl):"",unknown1:f(t.unknown1)?globalThis.Number(t.unknown1):0,unknown2:f(t.unknown2)?globalThis.Number(t.unknown2):0}),toJSON(t){const e={};return""!==t.language&&(e.language=t.language),""!==t.url&&(e.url=t.url),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translatedLanguage&&(e.translatedLanguage=t.translatedLanguage),""!==t.translatedUrl&&(e.translatedUrl=t.translatedUrl),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),e},create:t=>l.fromPartial(t??{}),fromPartial(t){const e={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};return e.language=t.language??"",e.url=t.url??"",e.unknown0=t.unknown0??0,e.translatedLanguage=t.translatedLanguage??"",e.translatedUrl=t.translatedUrl??"",e.unknown1=t.unknown1??0,e.unknown2=t.unknown2??0,e}};const d={encode:(t,o=e.Writer.create())=>(""!==t.url&&o.uint32(10).string(t.url),""!==t.language&&o.uint32(18).string(t.language),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={url:"",language:""};for(;a.pos>>3){case 1:if(10!==t)break;i.url=a.string();continue;case 2:if(18!==t)break;i.language=a.string();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({url:f(t.url)?globalThis.String(t.url):"",language:f(t.language)?globalThis.String(t.language):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),e},create:t=>d.fromPartial(t??{}),fromPartial(t){const e={url:"",language:""};return e.url=t.url??"",e.language=t.language??"",e}};const u={encode(t,o=e.Writer.create()){!1!==t.waiting&&o.uint32(8).bool(t.waiting);for(const e of t.subtitles)l.encode(e,o.uint32(18).fork()).ldelim();return o},decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={waiting:!1,subtitles:[]};for(;a.pos>>3){case 1:if(8!==t)break;i.waiting=a.bool();continue;case 2:if(18!==t)break;i.subtitles.push(l.decode(a,a.uint32()));continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({waiting:!!f(t.waiting)&&globalThis.Boolean(t.waiting),subtitles:globalThis.Array.isArray(t?.subtitles)?t.subtitles.map((t=>l.fromJSON(t))):[]}),toJSON(t){const e={};return!1!==t.waiting&&(e.waiting=t.waiting),t.subtitles?.length&&(e.subtitles=t.subtitles.map((t=>l.toJSON(t)))),e},create:t=>u.fromPartial(t??{}),fromPartial(t){const e={waiting:!1,subtitles:[]};return e.waiting=t.waiting??!1,e.subtitles=t.subtitles?.map((t=>l.fromPartial(t)))||[],e}};const c={encode:(t,o=e.Writer.create())=>(""!==t.url&&o.uint32(10).string(t.url),""!==t.timestamp&&o.uint32(18).string(t.timestamp),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={url:"",timestamp:""};for(;a.pos>>3){case 1:if(10!==t)break;i.url=a.string();continue;case 2:if(18!==t)break;i.timestamp=a.string();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({url:f(t.url)?globalThis.String(t.url):"",timestamp:f(t.timestamp)?globalThis.String(t.timestamp):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.timestamp&&(e.timestamp=t.timestamp),e},create:t=>c.fromPartial(t??{}),fromPartial(t){const e={url:"",timestamp:""};return e.url=t.url??"",e.timestamp=t.timestamp??"",e}};const h={encode:(t,o=e.Writer.create())=>(""!==t.url&&o.uint32(10).string(t.url),""!==t.language&&o.uint32(18).string(t.language),""!==t.responseLanguage&&o.uint32(26).string(t.responseLanguage),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={url:"",language:"",responseLanguage:""};for(;a.pos>>3){case 1:if(10!==t)break;i.url=a.string();continue;case 2:if(18!==t)break;i.language=a.string();continue;case 3:if(26!==t)break;i.responseLanguage=a.string();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({url:f(t.url)?globalThis.String(t.url):"",language:f(t.language)?globalThis.String(t.language):"",responseLanguage:f(t.responseLanguage)?globalThis.String(t.responseLanguage):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),e},create:t=>h.fromPartial(t??{}),fromPartial(t){const e={url:"",language:"",responseLanguage:""};return e.url=t.url??"",e.language=t.language??"",e.responseLanguage=t.responseLanguage??"",e}};const p={encode:(t,o=e.Writer.create())=>(0!==t.interval&&o.uint32(8).int32(t.interval),void 0!==t.translatedInfo&&c.encode(t.translatedInfo,o.uint32(18).fork()).ldelim(),void 0!==t.pingId&&o.uint32(24).int32(t.pingId),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={interval:0,translatedInfo:void 0,pingId:void 0};for(;a.pos>>3){case 1:if(8!==t)break;i.interval=a.int32();continue;case 2:if(18!==t)break;i.translatedInfo=c.decode(a,a.uint32());continue;case 3:if(24!==t)break;i.pingId=a.int32();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({interval:f(t.interval)?n(t.interval):0,translatedInfo:f(t.translatedInfo)?c.fromJSON(t.translatedInfo):void 0,pingId:f(t.pingId)?globalThis.Number(t.pingId):void 0}),toJSON(t){const e={};return 0!==t.interval&&(e.interval=function(t){switch(t){case a.NO_CONNECTION:return"NO_CONNECTION";case a.TRANSLATING:return"TRANSLATING";case a.STREAMING:return"STREAMING";case a.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.interval)),void 0!==t.translatedInfo&&(e.translatedInfo=c.toJSON(t.translatedInfo)),void 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>p.fromPartial(t??{}),fromPartial(t){const e={interval:0,translatedInfo:void 0,pingId:void 0};return e.interval=t.interval??0,e.translatedInfo=void 0!==t.translatedInfo&&null!==t.translatedInfo?c.fromPartial(t.translatedInfo):void 0,e.pingId=t.pingId??void 0,e}};const g={encode:(t,o=e.Writer.create())=>(0!==t.pingId&&o.uint32(8).int32(t.pingId),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={pingId:0};for(;a.pos>>3){case 1:if(8!==t)break;i.pingId=a.int32();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({pingId:f(t.pingId)?globalThis.Number(t.pingId):0}),toJSON(t){const e={};return 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>g.fromPartial(t??{}),fromPartial(t){const e={pingId:0};return e.pingId=t.pingId??0,e}};const m={encode:(t,o=e.Writer.create())=>(""!==t.uuid&&o.uint32(10).string(t.uuid),""!==t.module&&o.uint32(18).string(t.module),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={uuid:"",module:""};for(;a.pos>>3){case 1:if(10!==t)break;i.uuid=a.string();continue;case 2:if(18!==t)break;i.module=a.string();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({uuid:f(t.uuid)?globalThis.String(t.uuid):"",module:f(t.module)?globalThis.String(t.module):""}),toJSON(t){const e={};return""!==t.uuid&&(e.uuid=t.uuid),""!==t.module&&(e.module=t.module),e},create:t=>m.fromPartial(t??{}),fromPartial(t){const e={uuid:"",module:""};return e.uuid=t.uuid??"",e.module=t.module??"",e}};const v={encode:(t,o=e.Writer.create())=>(""!==t.secretKey&&o.uint32(10).string(t.secretKey),0!==t.expires&&o.uint32(16).int32(t.expires),o),decode(t,o){const a=t instanceof e.Reader?t:e.Reader.create(t);let n=void 0===o?a.len:a.pos+o;const i={secretKey:"",expires:0};for(;a.pos>>3){case 1:if(10!==t)break;i.secretKey=a.string();continue;case 2:if(16!==t)break;i.expires=a.int32();continue}if(4==(7&t)||0===t)break;a.skipType(7&t)}return i},fromJSON:t=>({secretKey:f(t.secretKey)?globalThis.String(t.secretKey):"",expires:f(t.expires)?globalThis.Number(t.expires):0}),toJSON(t){const e={};return""!==t.secretKey&&(e.secretKey=t.secretKey),0!==t.expires&&(e.expires=Math.round(t.expires)),e},create:t=>v.fromPartial(t??{}),fromPartial(t){const e={secretKey:"",expires:0};return e.secretKey=t.secretKey??"",e.expires=t.expires??0,e}};function f(t){return null!=t}const b={encodeTranslationRequest:(t,e,o,a,n)=>r.encode({url:t,firstRequest:!0,duration:e,unknown0:1,language:o,forceSourceLang:!1,unknown1:0,translationHelp:n||[],responseLanguage:a,unknown2:0,unknown3:1,bypassCache:!1}).finish(),decodeTranslationResponse:t=>s.decode(new Uint8Array(t)),encodeSubtitlesRequest:(t,e)=>d.encode({url:t,language:e}).finish(),decodeSubtitlesResponse:t=>u.decode(new Uint8Array(t)),encodeStreamPingRequest:t=>g.encode({pingId:t}).finish(),encodeStreamRequest:(t,e,o)=>h.encode({url:t,language:e,responseLanguage:o}).finish(),decodeStreamResponse:t=>p.decode(new Uint8Array(t)),encodeYandexSessionRequest:(t,e)=>m.encode({uuid:t,module:e}).finish(),decodeYandexSessionResponse:t=>v.decode(new Uint8Array(t))},y={host:"api.browser.yandex.ru",hostVOT:"vot-api.toil.cc/v1",mediaProxy:"media-proxy.toil.cc",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 YaBrowser/24.7.0.0 Safari/537.36",componentVersion:"24.7.3.1250",hmac:"bt8xH3VOlb4mqf0nqAibnDOoiPlXsisf",defaultDuration:343},w=new TextEncoder;async function x(t,e,o){const a=await crypto.subtle.importKey("raw",w.encode(e),{name:"HMAC",hash:{name:t}},!1,["sign","verify"]);return await crypto.subtle.sign("HMAC",a,o)}async function S(t){const e=await x("SHA-256",y.hmac,t);return new Uint8Array(e).reduce(((t,e)=>t+e.toString(16).padStart(2,"0")),"")}var k,T;!function(t){t.custom="custom",t.directlink="custom",t.youtube="youtube",t.piped="piped",t.invidious="invidious",t.vk="vk",t.nine_gag="nine_gag",t.gag="nine_gag",t.twitch="twitch",t.proxitok="proxitok",t.tiktok="tiktok",t.vimeo="vimeo",t.xvideos="xvideos",t.pornhub="pornhub",t.twitter="twitter",t.rumble="rumble",t.facebook="facebook",t.rutube="rutube",t.coub="coub",t.bilibili="bilibili",t.mail_ru="mailru",t.mailru="mailru",t.bitchute="bitchute",t.eporner="eporner",t.peertube="peertube",t.dailymotion="dailymotion",t.trovo="trovo",t.yandexdisk="yandexdisk",t.ok_ru="okru",t.okru="okru",t.googledrive="googledrive",t.bannedvideo="bannedvideo",t.weverse="weverse",t.newgrounds="newgrounds",t.egghead="egghead",t.youku="youku",t.archive="archive",t.kodik="kodik",t.patreon="patreon",t.reddit="reddit",t.kick="kick",t.apple_developer="apple_developer",t.appledeveloper="apple_developer",t.poketube="poketube",t.epicgames="epicgames",t.nineanimetv="nineanimetv",t.odysee="odysee",t.coursehunter="coursehunter",t.sap="sap",t.udemy="udemy",t.coursera="coursera",t.watchpornto="watchpornto",t.linkedin="linkedin"}(k||(k={})),function(t){t[t.FAILED=0]="FAILED",t[t.FINISHED=1]="FINISHED",t[t.WAITING=2]="WAITING",t[t.LONG_WAITING=3]="LONG_WAITING",t[t.PART_CONTENT=5]="PART_CONTENT",t[t.LONG_WAITING_2=6]="LONG_WAITING_2"}(T||(T={}));const C={afr:"af",aka:"ak",alb:"sq",amh:"am",ara:"ar",arm:"hy",asm:"as",aym:"ay",aze:"az",baq:"eu",bel:"be",ben:"bn",bos:"bs",bul:"bg",bur:"my",cat:"ca",chi:"zh",cos:"co",cze:"cs",dan:"da",div:"dv",dut:"nl",eng:"en",epo:"eo",est:"et",ewe:"ee",fin:"fi",fre:"fr",fry:"fy",geo:"ka",ger:"de",gla:"gd",gle:"ga",glg:"gl",gre:"el",grn:"gn",guj:"gu",hat:"ht",hau:"ha",hin:"hi",hrv:"hr",hun:"hu",ibo:"ig",ice:"is",ind:"id",ita:"it",jav:"jv",jpn:"ja",kan:"kn",kaz:"kk",khm:"km",kin:"rw",kir:"ky",kor:"ko",kur:"ku",lao:"lo",lat:"la",lav:"lv",lin:"ln",lit:"lt",ltz:"lb",lug:"lg",mac:"mk",mal:"ml",mao:"mi",mar:"mr",may:"ms",mlg:"mg",mlt:"mt",mon:"mn",nep:"ne",nor:"no",nya:"ny",ori:"or",orm:"om",pan:"pa",per:"fa",pol:"pl",por:"pt",pus:"ps",que:"qu",rum:"ro",rus:"ru",san:"sa",sin:"si",slo:"sk",slv:"sl",smo:"sm",sna:"sn",snd:"sd",som:"so",sot:"st",spa:"es",srp:"sr",sun:"su",swa:"sw",swe:"sv",tam:"ta",tat:"tt",tel:"te",tgk:"tg",tha:"th",tir:"ti",tso:"ts",tuk:"tk",tur:"tr",uig:"ug",ukr:"uk",urd:"ur",uzb:"uz",vie:"vi",wel:"cy",xho:"xh",yid:"yi",yor:"yo",zul:"zu"};async function L(t,e={headers:{"User-Agent":y.userAgent}}){const{timeout:o=3e3,...a}=e,n=new AbortController,i=setTimeout((()=>n.abort()),o),r=await fetch(t,{signal:n.signal,...a});return clearTimeout(i),r}function V(t){return 3===t.length?C[t]:t.toLowerCase().split(/[_;-]/)[0].trim()}function A(t,e="mp4"){return`https://${y.mediaProxy}/v1/proxy/video.${e}?url=${encodeURIComponent(t.href)}&origin=${t.origin}&referer=${t.origin}`}const I=[{additionalData:"mobile",host:k.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:"shorts-video #player"},{additionalData:"mobile",host:k.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:".player-container"},{host:k.youtube,url:"https://youtu.be/",match:/^(www.)?youtube(-nocookie|kids)?.com$/,selector:".html5-video-container:not(#inline-player *)"},{host:k.invidious,url:"https://youtu.be/",match:["yewtu.be","yt.artemislena.eu","invidious.flokinet.to","iv.melmac.space","inv.nadeko.net","inv.tux.pizza","invidious.private.coffee","yt.drgnz.club","vid.puffyan.us","invidious.dhusch.de"],selector:"#player",needBypassCSP:!0},{host:k.piped,url:"https://youtu.be/",match:["piped.video","piped.tokhmi.xyz","piped.moomoo.me","piped.syncpundit.io","piped.mha.fi","watch.whatever.social","piped.garudalinux.org","efy.piped.pages.dev","watch.leptons.xyz","piped.lunar.icu","yt.dc09.ru","piped.mint.lgbt","il.ax","piped.privacy.com.de","piped.esmailelbob.xyz","piped.projectsegfau.lt","piped.in.projectsegfau.lt","piped.us.projectsegfau.lt","piped.privacydev.net","piped.palveluntarjoaja.eu","piped.smnz.de","piped.adminforge.de","piped.qdi.fi","piped.hostux.net","piped.chauvet.pro","piped.jotoma.de","piped.pfcd.me","piped.frontendfriendly.xyz"],selector:".shaka-video-container",needBypassCSP:!0},{host:k.poketube,url:"https://youtu.be/",match:["poketube.fun","pt.sudovanilla.org","poke.ggtyler.dev","poke.uk2.littlekai.co.uk","poke.blahai.gay"],selector:".video-player-container"},{additionalData:"mobile",host:k.vk,url:"https://vk.com/video?z=",match:/^m.vk.(com|ru)$/,selector:"vk-video-player",shadowRoot:!0},{additionalData:"clips",host:k.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:'div[data-testid="clipcontainer-video"]'},{host:k.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:".videoplayer_media"},{host:k.nine_gag,url:"https://9gag.com/gag/",match:/^9gag.com$/,selector:".video-post"},{host:k.twitch,url:"https://twitch.tv/",match:[/^m.twitch.tv$/,/^(www.)?twitch.tv$/,/^clips.twitch.tv$/,/^player.twitch.tv$/],selector:".video-ref, main > div > section > div > div > div"},{host:k.proxitok,url:"https://www.tiktok.com/",match:["proxitok.pabloferreiro.es","proxitok.pussthecat.org","tok.habedieeh.re","proxitok.esmailelbob.xyz","proxitok.privacydev.net","tok.artemislena.eu","tok.adminforge.de","tt.vern.cc","cringe.whatever.social","proxitok.lunar.icu","proxitok.privacy.com.de"],selector:".column.has-text-centered"},{host:k.tiktok,url:"https://www.tiktok.com/",match:/^(www.)?tiktok.com$/,selector:null},{host:k.vimeo,url:"https://vimeo.com/",match:/^vimeo.com$/,needExtraData:!0,selector:".player"},{host:k.vimeo,url:"https://player.vimeo.com/",match:/^player.vimeo.com$/,additionalData:"embed",needExtraData:!0,needBypassCSP:!0,selector:".player"},{host:k.xvideos,url:"https://www.xvideos.com/",match:/^(www.)?(xvideos|xv-ru).com$/,selector:".video-bg-pic",needBypassCSP:!0},{host:k.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:/^[a-z]+.pornhub.com$/,selector:".mainPlayerDiv > .video-element-wrapper-js > div",eventSelector:".mgp_eventCatcher"},{additionalData:"embed",host:k.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:t=>t.host.includes("pornhub.com")&&t.pathname.startsWith("/embed/"),selector:"#player"},{host:k.twitter,url:"https://twitter.com/i/status/",match:/^(twitter|x).com$/,selector:'div[data-testid="videoComponent"] > div:nth-child(1) > div',eventSelector:'div[data-testid="videoPlayer"]',needBypassCSP:!0},{host:k.rumble,url:"https://rumble.com/",match:/^rumble.com$/,selector:"#videoPlayer > .videoPlayer-Rumble-cls > div"},{host:k.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/videos/"),selector:'div[role="main"] div[data-pagelet$="video" i]',needBypassCSP:!0},{additionalData:"reels",host:k.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/reel/"),selector:'div[role="main"]',needBypassCSP:!0},{host:k.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:".video-player > div > div > div:nth-child(2)"},{additionalData:"embed",host:k.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:"#app > div > div"},{host:k.bilibili,url:"https://www.bilibili.com/video/",match:/^(www|m|player).bilibili.com$/,selector:".bpx-player-video-wrap"},{additionalData:"old",host:k.bilibili,url:"https://www.bilibili.com/video/",match:/^(www|m).bilibili.com$/,selector:null},{host:k.mailru,url:"https://my.mail.ru/",match:/^my.mail.ru$/,selector:"#b-video-wrapper"},{host:k.bitchute,url:"https://www.bitchute.com/video/",match:/^(www.)?bitchute.com$/,selector:".video-js"},{host:k.eporner,url:"https://www.eporner.com/",match:/^(www.)?eporner.com$/,selector:".vjs-v7"},{host:k.peertube,url:"stub",match:["peertube.1312.media","tube.shanti.cafe","bee-tube.fr","video.sadmin.io","dalek.zone","review.peertube.biz","peervideo.club","tube.la-dina.net","peertube.tmp.rcp.tf","peertube.su","video.blender.org","videos.viorsan.com","tube-sciences-technologies.apps.education.fr","tube-numerique-educatif.apps.education.fr","tube-arts-lettres-sciences-humaines.apps.education.fr","beetoons.tv","comics.peertube.biz","makertube.net"],selector:".vjs-v7"},{host:k.dailymotion,url:"https://dai.ly/",match:/^geo([\d]+)?.dailymotion.com$/,selector:".player"},{host:k.trovo,url:"https://trovo.live/s/",match:/^trovo.live$/,selector:".player-video"},{host:k.yandexdisk,url:"https://yadi.sk/i/",match:/^disk.yandex.ru$/,selector:".video-player__player > div:nth-child(1)",eventSelector:".video-player__player",needBypassCSP:!0},{host:k.okru,url:"https://ok.ru/video/",match:/^ok.ru$/,selector:".html5-vpl_vid"},{host:k.googledrive,url:"https://drive.google.com/file/d/",match:/^youtube.googleapis.com$/,selector:".html5-video-container"},{host:k.bannedvideo,url:"https://madmaxworld.tv/watch?id=",match:/^(www.)?banned.video|madmaxworld.tv$/,selector:".vjs-v7",needExtraData:!0},{host:k.weverse,url:"https://weverse.io/",match:/^weverse.io$/,selector:".webplayer-internal-source-wrapper",needExtraData:!0},{host:k.newgrounds,url:"https://www.newgrounds.com/",match:/^(www.)?newgrounds.com$/,selector:".ng-video-player"},{host:k.egghead,url:"https://egghead.io/",match:/^egghead.io$/,selector:".cueplayer-react-video-holder"},{host:k.youku,url:"https://v.youku.com/",match:/^v.youku.com$/,selector:"#ykPlayer"},{host:k.archive,url:"https://archive.org/details/",match:/^archive.org$/,selector:".jw-media"},{host:k.kodik,url:"stub",match:/^kodik.(info|biz|cc)$/,selector:".fp-player",needExtraData:!0},{host:k.patreon,url:"stub",match:/^(www.)?patreon.com$/,selector:'div[data-tag="post-card"] div[elevation="subtle"] > div > div > div > div',needExtraData:!0},{host:k.reddit,url:"stub",match:/^(www.|new.|old.)?reddit.com$/,selector:".reddit-video-player-root",needExtraData:!0,needBypassCSP:!0},{host:k.kick,url:"https://kick.com/",match:/^kick.com$/,selector:"#injected-embedded-channel-player-video > div",needExtraData:!0},{host:k.appledeveloper,url:"https://developer.apple.com/",match:/^developer.apple.com$/,selector:".developer-video-player",needExtraData:!0,needBypassCSP:!0},{host:k.epicgames,url:"https://dev.epicgames.com/community/learning/",match:/^dev.epicgames.com$/,selector:".vjs-v7",needExtraData:!0},{host:k.nineanimetv,url:"https://9animetv.to/watch/",match:/^rapid-cloud.co$/,selector:".jw-media",needExtraData:!0},{host:k.odysee,url:"stub",match:/^odysee.com$/,selector:".vjs-v7",needExtraData:!0},{host:k.coursehunter,url:"https://coursehunter.net/course/",match:/^coursehunter.net$/,selector:"#oframeplayer > pjsdiv:nth-of-type(1)",needExtraData:!0},{host:k.sap,url:"https://learning.sap.com/courses/",match:/^learning.sap.com$/,selector:".playkit-container",eventSelector:".playkit-player",needExtraData:!0,needBypassCSP:!0},{host:k.udemy,url:"https://www.udemy.com/",match:/udemy.com$/,selector:'div[data-purpose="curriculum-item-viewer-content"] > section > div > div > div > div:nth-of-type(2)',needExtraData:!0},{host:k.coursera,url:"https://www.coursera.org/",match:/coursera.org$/,selector:".vjs-v8",needExtraData:!0},{host:k.watchpornto,url:"https://watchporn.to/",match:/^watchporn.to$/,selector:".fp-player"},{host:k.linkedin,url:"https://www.linkedin.com/learning/",match:/^(www.)?linkedin.com$/,selector:".vjs-v7",needExtraData:!0,needBypassCSP:!0},{host:k.custom,url:"stub",match:t=>/([^.]+).(mp4|webm)/.test(t.pathname),rawResult:!0}],O=JSON.parse('{"__version__":5,"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","unSupportedExtensionError":"Error! {0} is not supported by this version of the extension!\\n\\nPlease use the cloudflare version of the VOT extension.","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","grantPermissionToAutoPlay":"Grant permission to autoplay","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Do not translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTAudioProxy":"Proxy received audio","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTLiveNotSupported":"Translation of live streams is not supported","VOTPremiere":"Wait for the premiere to end before translating","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"udemyModuleArgsNotFound":"Could not get udemy module data due to the fact that ModuleArgs was not found","VOTTranslationHelpNull":"Could not get the data required for the translate","streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTTranslationService":"Translation Service","VOTDetectService":"Detect Service","VOTTranslatingError":"Translating the error","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTBypassMediaCSP":"Bypassing Media CSP","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site"}'),P={log:(...t)=>{}},M=P,E="media-proxy.toil.cc/v1/proxy/m3u8",_="vot-worker.toil.cc",$="https://vot.toil.cc/v1",N=.15,R="yandex",B="yandex",D={yandex:"https://translate.toil.cc/detect",rustServer:"https://rust-server-531j.onrender.com/detect"},F={yandex:"https://translate.toil.cc/translate",deepl:"https://translate-deepl.toil.cc/translate"},q=new class{constructor(){this.gmSupport="function"==typeof GM_getValue,M.log(`GM Storage Status: ${this.gmSupport}`)}syncGet(t,e=void 0){if(this.gmSupport)return GM_getValue(t,e);const o="number"==typeof e;const a=window.localStorage.getItem(t)??e;return o?Number(a):a}async get(t,e=void 0){if(this.gmSupport)return await GM_getValue(t,e);const o="number"==typeof e;return Promise.resolve(this.syncGet(t,e,o))}syncSet(t,e){return this.gmSupport?GM_setValue(t,e):window.localStorage.setItem(t,e)}async set(t,e){return this.gmSupport?await GM_setValue(t,e):Promise.resolve(this.syncSet(t,e))}syncDelete(t){return this.gmSupport?GM_deleteValue(t):window.localStorage.removeItem(t)}async delete(t){return this.gmSupport?await GM_deleteValue(t):Promise.resolve(this.syncDelete(t))}syncList(){return this.gmSupport?GM_listValues():["autoTranslate","dontTranslateLanguage","dontTranslateYourLang","autoSetVolumeYandexStyle","autoVolume","buttonPos","showVideoSlider","syncVolume","subtitlesMaxLength","highlightWords","responseLanguage","defaultVolume","audioProxy","showPiPButton","translateAPIErrors","translationService","detectService","m3u8ProxyHost","translateProxyEnabled","hotkeyButton","proxyWorkerHost","audioBooster","locale-version","locale-lang","locale-phrases"]}async list(){return this.gmSupport?await GM_listValues():Promise.resolve(this.syncList())}},U="https://raw.githubusercontent.com/ilyhalight/voice-over-translation/master/src/localization",H=["auto","en","ru","af","am","ar","az","bg","bn","bs","ca","cs","cy","da","de","el","es","et","eu","fa","fi","fr","gl","hi","hr","hu","hy","id","it","ja","jv","kk","km","kn","ko","lo","mk","ml","mn","ms","mt","my","ne","nl","pa","pl","pt","ro","si","sk","sl","sq","sr","su","sv","sw","tr","uk","ur","uz","vi","zh","zu"],z=new class{lang="en";locale={};gmValues=["locale-phrases","locale-lang","locale-version","locale-lang-override"];constructor(){const t=q.syncGet("locale-lang-override","auto");this.lang=t&&"auto"!==t?t:(navigator.language||navigator.userLanguage)?.substr(0,2)?.toLowerCase()??"en",this.setLocaleFromJsonString(q.syncGet("locale-phrases",""))}reset(){for(let t=0;ta&&o===this.lang)return;const n=await this.checkUpdates();if(await q.set("locale-updated-at",a),n){M.log("Updating locale...");try{const t=await Q(`${U}/locales/${this.lang}.json`);if(200!==t.status)throw t.status;const e=await t.text();await q.set("locale-phrases",e),this.setLocaleFromJsonString(e),await q.set("locale-hash",n),await q.set("locale-lang",this.lang)}catch(t){console.error("[VOT] [localizationProvider] Failed to get locale, cause:",t),this.setLocaleFromJsonString(await q.get("locale-phrases",""))}}}setLocaleFromJsonString(t){try{this.locale=JSON.parse(t)??{}}catch(t){console.error("[VOT] [localizationProvider]",t),this.locale={}}}getFromLocale(t,e){const o=e.split(".").reduce(((t,e)=>{if("object"==typeof t&&t)return t[e]}),t);return void 0===o&&console.warn("[VOT] [localizationProvider] locale",t,"doesn't contain key",e),o}getDefault(t){return this.getFromLocale(O,t)??t}get(t){return this.getFromLocale(this.locale,t)??this.getFromLocale(O,t)??t}},W=navigator.language||navigator.userLanguage,j=W?.substr(0,2)?.toLowerCase()??"en";function G(t){return t.toLowerCase().split(/[_;-]/)[0].trim()}function Y(){return"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled}function K(){return"undefined"!=typeof Hls&&Hls?.isSupported()?new Hls({debug:!1,lowLatencyMode:!0,backBufferLength:90}):void 0}const J=new RegExp([/(?:https?|ftp):\/\/\S+/g,/https?:\/\/\S+|www\.\S+/gm,/\b\S+\.\S+/gm,/#[^\s#]+/g,/Auto-generated by YouTube/g,/Provided to YouTube by/g,/Released on/g,/0x[a-fA-F0-9]{40}/g,/[13][a-km-zA-HJ-NP-Z1-9]{25,34}/g,/4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}/g,/Paypal/g].map((t=>t.source)).join("|"));function Z(t,e){const o=URL.createObjectURL(t),a=document.createElement("a");a.href=o,a.download=e,a.click(),URL.revokeObjectURL(o)}function X(t){return 0===t.trim().length?(new Date).toLocaleDateString("en-us").replaceAll("/","-"):t.replace(/[\\/:*?"'<>|]/g,"")}async function Q(t,e={}){const{timeout:o=15e3,...a}=e,n=new AbortController,i=setTimeout((()=>n.abort()),o);try{if(t.includes("api.browser.yandex.ru"))throw new Error("Preventing yandex cors");const e=await fetch(t,{signal:n.signal,...a});return clearTimeout(i),e}catch(e){return M.log("GM_fetch preventing cors by GM_xmlhttpRequest",e.message),new Promise(((e,n)=>{clearTimeout(i),GM_xmlhttpRequest({method:a.method||"GET",url:t,responseType:"blob",...a,data:a.body,timeout:o,onload:t=>{const o=Object.fromEntries(t.responseHeaders.trim().split(/\r?\n/).map((t=>t.split(/: (.+)/))).filter((([t])=>t&&/^[\w-]+$/.test(t))));e(new Response(t.response,{status:t.status,headers:o}))},ontimeout:()=>n(new Error("Timeout")),onerror:t=>n(t),onabort:()=>n(new Error("AbortError"))})}))}}function tt(){return Math.floor(Date.now()/1e3)}class et extends Error{constructor(t){super(t),this.name="VideoHelper",this.message=t}}class ot{API_ORIGIN="https://example.com";fetch;extraInfo;referer;service;constructor({fetchFn:t=Q,extraInfo:e=!0,referer:o=document.referrer??window.location.origin+"/",service:a}={}){this.fetch=t,this.extraInfo=e,this.referer=o,this.service=a}async getVideoData(t){}async getVideoId(t){}returnBaseData(t){if(this.service)return{url:this.service.url+t,videoId:t,host:this.service.host,duration:void 0}}}const at=["auto","ru","en","zh","ko","lt","lv","ar","fr","it","es","de","ja"],nt=["ru","en","kk"],it=["srt","vtt","json"];const rt={[k.mailru]:class extends ot{API_ORIGIN="https://my.mail.ru";async getVideoMeta(t){try{const e=await this.fetch(`${this.API_ORIGIN}/+/video/meta/${t}?xemail=&ajax_call=1&func_name=&mna=&mnb=&ext=1&_=${(new Date).getTime()}`);return await e.json()}catch(t){return void console.error("Failed to get mail.ru video data",t.message)}}async getVideoId(t){const e=t.pathname;if(/\/(v|mail|bk|inbox)\//.exec(e))return e.slice(1);const o=/video\/embed\/([^/]+)/.exec(e)?.[1];if(!o)return;const a=await this.getVideoMeta(o);return a?a.meta.url.replace("//my.mail.ru/",""):void 0}},[k.weverse]:class extends ot{API_ORIGIN="https://global.apis.naver.com/weverse/wevweb";API_APP_ID="be4d79eb8fc7bd008ee82c8ec4ff6fd4";API_HMAC_KEY="1b9cb6378d959b45714bec49971ade22e6e24e42";HEADERS={Accept:"application/json, text/plain, */*",Origin:"https://weverse.io",Referer:"https://weverse.io/"};getURLData(){return{appId:this.API_APP_ID,language:"en",os:"WEB",platform:"WEB",wpf:"pc"}}async createHash(t){const e=Date.now(),o=t.substring(0,Math.min(255,t.length))+e,a=await async function(t,e){try{const o=w.encode(e),a=await x("SHA-1",t,o);return btoa(String.fromCharCode(...new Uint8Array(a)))}catch(t){return console.error(t),!1}}(this.API_HMAC_KEY,o);if(!a)throw new et("Failed to get weverse HMAC signature");return{wmsgpad:e.toString(),wmd:a}}async getHashURLParams(t){const e=await this.createHash(t);return new URLSearchParams(e).toString()}async getPostPreview(t){const e=`/post/v1.0/post-${t}/preview?`+new URLSearchParams({fieldSet:"postForPreview",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{headers:this.HEADERS});return await o.json()}catch(e){return console.error(`Failed to get weverse post preview by postId: ${t}`,e.message),!1}}async getVideoInKey(t){const e=`/video/v1.1/vod/${t}/inKey?`+new URLSearchParams({gcc:"RU",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{method:"POST",headers:this.HEADERS});return await o.json()}catch(e){return console.error(`Failed to get weverse InKey by videoId: ${t}`,e.message),!1}}async getVideoInfo(t,e,o){const a=Date.now();try{const n=new URLSearchParams({key:e,sid:o,nonce:a.toString(),devt:"html5_pc",prv:"N",aup:"N",stpb:"N",cpl:"en",env:"prod",lc:"en",adi:JSON.stringify([{adSystem:null}]),adu:"/"}).toString(),i=await this.fetch(`https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/${t}?`+n,{headers:this.HEADERS});return await i.json()}catch(a){return console.error(`Failed to get weverse video info (infraVideoId: ${t}, inkey: ${e}, serviceId: ${o}`,a.message),!1}}extractVideoInfo(t){return t.find((t=>!1===t.useP2P&&t.source.includes(".mp4")))}async getVideoData(t){const e=await this.getPostPreview(t);if(!e)return;const{videoId:o,serviceId:a,infraVideoId:n}=e.extension.video;if(!(o&&a&&n))return;const i=await this.getVideoInKey(o);if(!i)return;const r=await this.getVideoInfo(n,i.inKey,a);if(!r)return;const s=this.extractVideoInfo(r.videos.list);return s?{url:s.source,duration:s.duration}:void 0}async getVideoId(t){return/([^/]+)\/(live|media)\/([^/]+)/.exec(t.pathname)?.[3]}},[k.kodik]:class extends ot{API_ORIGIN=window.location.origin;async getSecureData(t){try{const e=await this.fetch(`${this.API_ORIGIN}${t}`,{headers:{"User-Agent":y.userAgent,Origin:this.API_ORIGIN,Referer:this.API_ORIGIN}}),o=await e.text(),[a,n,i]=t.split("/").filter((t=>t)),r=(new DOMParser).parseFromString(o,"text/html"),s=Array.from(r.getElementsByTagName("script")).filter((t=>t.innerHTML.includes(`videoId = "${n}"`)));if(!s.length)throw new et("Failed to find secure script");const l=/'{[^']+}'/.exec(s[0].textContent.trim())?.[0];if(!l)throw new et("Secure json wasn't found in secure script");const d=JSON.parse(l.replaceAll("'",""));return{videoType:a,videoId:n,hash:i,...d}}catch(e){return console.error(`Failed to get kodik secure data by videoPath: ${t}.`,e.message),!1}}async getFtor(t){const{videoType:e,videoId:o,hash:a,d:n,d_sign:i,pd:r,pd_sign:s,ref:l,ref_sign:d}=t;try{const t=await this.fetch(this.API_ORIGIN+"/ftor",{method:"POST",headers:{"User-Agent":y.userAgent,Origin:this.API_ORIGIN,Referer:`${this.API_ORIGIN}/${e}/${o}/${a}/360p`},body:new URLSearchParams({d:n,d_sign:i,pd:r,pd_sign:s,ref:decodeURIComponent(l),ref_sign:d,bad_user:"false",cdn_is_working:"true",info:"{}",type:e,hash:a,id:o})});return await t.json()}catch(t){return console.error(`Failed to get kodik video data (type: ${e}, id: ${o}, hash: ${a})`,t.message),!1}}decryptUrl(t){const e=atob(t.replace(/[a-zA-Z]/g,(function(t){const e=t.charCodeAt(0)+13,o=t<="Z"?90:122;return String.fromCharCode(o>=e?e:e-26)})));return"https:"+e}async getVideoData(t){const e=await this.getSecureData(t);if(!e)return;const o=await this.getFtor(e);if(!o)return;const a=Object.entries(o.links[o.default.toString()]),n=a.find((([t,e])=>"application/x-mpegURL"===e.type))?.[1];return n?{url:this.decryptUrl(n.src)}:void 0}async getVideoId(t){return/\/(seria|video)\/([^/]+)\/([^/]+)\/([\d]+)p/.exec(t.pathname)?.[0]}},[k.patreon]:class extends ot{API_ORIGIN="https://www.patreon.com/api";async getPosts(t){try{const e=await this.fetch(`${this.API_ORIGIN}/posts/${t}?json-api-use-default-includes=false`);return await e.json()}catch(e){return console.error(`Failed to get patreon posts by postId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPosts(t);if(!e)return;const o=e.data.attributes.post_file.url;return o?{url:o}:void 0}async getVideoId(t){const e=/posts\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e.replace(/[^\d.]/g,"")}},[k.reddit]:class extends ot{API_ORIGIN="https://www.reddit.com";async getVideoData(t){try{const t=document.querySelector("[data-hls-url]")?.dataset.hlsUrl.replaceAll("&","&");if(!t)throw new et("Failed to find content url");return{url:decodeURIComponent(t)}}catch(e){return void console.error(`Failed to get reddit video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/\/r\/(([^/]+)\/([^/]+)\/([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[k.bannedvideo]:class extends ot{API_ORIGIN="https://api.banned.video";async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/graphql`,{method:"POST",body:JSON.stringify({operationName:"GetVideo",query:"query GetVideo($id: String!) {\n getVideo(id: $id) {\n title\n description: summary\n duration: videoDuration\n videoUrl: directUrl\n isStream: live\n }\n }",variables:{id:t}}),headers:{"User-Agent":"bannedVideoFrontEnd","apollographql-client-name":"banned-web","apollographql-client-version":"1.3","content-type":"application/json"}});return await e.json()}catch(e){return console.error(`Failed to get bannedvideo video info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getVideoInfo(t);if(!e)return;const{videoUrl:o,duration:a,isStream:n,description:i,title:r}=e.data.getVideo;return{url:o,duration:a,isStream:n,title:r,description:i}}async getVideoId(t){return t.searchParams.get("id")??void 0}},[k.kick]:class extends ot{API_ORIGIN="https://kick.com/api";async getClipInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v2/clips/${t}`),o=await e.json(),{clip_url:a,duration:n,title:i}=o.clip;return{url:a,duration:n,title:i}}catch(e){return void console.error(`Failed to get kick clip info by clipId: ${t}.`,e.message)}}async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v1/video/${t}`),o=await e.json(),{source:a,livestream:n}=o,{session_title:i,duration:r}=n;return{url:a,duration:Math.round(r/1e3),title:i}}catch(e){return void console.error(`Failed to get kick video info by videoId: ${t}.`,e.message)}}async getVideoData(t){return t.startsWith("videos")?await this.getVideoInfo(t.replace("videos/","")):await this.getClipInfo(t.replace("clips/",""))}async getVideoId(t){return/([^/]+)\/((videos|clips)\/([^/]+))/.exec(t.pathname)?.[2]}},[k.appledeveloper]:class extends ot{API_ORIGIN="https://developer.apple.com";async getVideoData(t){try{const t=document.querySelector("meta[property='og:video']")?.content;if(!t)throw new et("Failed to find content url");return{url:t}}catch(e){return void console.error(`Failed to get apple developer video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/videos\/play\/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0]}},[k.epicgames]:class extends ot{API_ORIGIN="https://dev.epicgames.com/community/api/learning";async getPostInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/post.json?hash_id=${t}`);return await e.json()}catch(e){return console.error(`Failed to get epicgames post info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPostInfo(t);if(!e)return;const o=e.blocks.find((t=>"video"===t.type)),a=o?.video_url?.replace("qsep://","https://");if(!a)return;const{title:n,description:i}=e,r=o?.video_captions?.map((t=>({language:V(t.locale),format:"vtt",url:t.signed_url})));return{url:a,title:n,description:i,subtitles:r}}async getVideoId(t){return/\/(\w{3,5})\/[^/]+$/.exec(t.pathname)?.[1]}},[k.nineanimetv]:class extends ot{API_ORIGIN="https://9animetv.to/ajax/episode";RAPID_CLOUD_ORIGIN="https://rapid-cloud.co/ajax/embed-6-v2";async getSourceId(t){try{const e=await this.fetch(`${this.API_ORIGIN}/servers?episodeId=${t}`),o=await e.json();return!!o.html&&/data-id="(\d+)"/.exec(o.html)?.[1]}catch(e){return console.error(`Failed to get 9animetv servers info by episodeId: ${t}.`,e.message),!1}}async getPlayerLink(t){try{const e=await this.fetch(`${this.API_ORIGIN}/sources?id=${t}`),o=await e.json();return!!o.link.includes("rapid-cloud.co")&&o.link}catch(e){return console.error(`Failed to get player link by sourceId: ${t}.`,e.message),!1}}async getRapidCloudData(t){try{const e=await this.fetch(`${this.RAPID_CLOUD_ORIGIN}/getSources?id=${t}`),o=await e.json();return o.encrypted?(console.warn("Encrypted RapidCloud data found. Let us know about it",o),!1):o}catch(e){return console.error(`Failed to get rapid cloud data by rapidId: ${t}.`,e.message),!1}}async getVideoData(t){const e=t.split("?ep=")[1],o=await this.getSourceId(e);if(!o)return;const a=await this.getPlayerLink(o);if(!a)return;const n=/\/([^/?]+)\?/.exec(a)?.[1];if(!n)return;const i=await this.getRapidCloudData(n);if(!i)return;const r=i.sources.find((t=>"hls"===t.type))?.file;if(!r)return;const s=i.tracks.reduce(((t,e)=>{const o=/([\w+]+)(-\d)?\.vtt/.exec(e.file)?.[1];if(!o)return t;const a=V(3===o.length?o:e.label);return t.find((t=>t.language===a))||t.push({language:a,format:"vtt",url:e.file}),t}),[]);return{url:r,subtitles:s}}async getVideoId(t){return new Promise((t=>{const e="https://9animetv.to";window.addEventListener("message",(o=>{o.origin===e&&o.data?.startsWith("getVideoId:")&&t(o.data.replace("getVideoId:",""))})),window.top.postMessage("getVideoId",e)}))}},[k.odysee]:class extends ot{API_ORIGIN="https://odysee.com";async getVideoData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/${t}`),o=await e.text(),a=/"contentUrl":(\s)?"([^"]+)"/.exec(o)?.[2];if(!a)throw new Error("Odysee url doesn't parsed");return{url:a}}catch(e){return void console.error(`Failed to get odysee video data by video ID: ${t}`,e.message)}}async getVideoId(t){return t.pathname.slice(1)}},[k.coursehunter]:class extends ot{API_ORIGIN="https://coursehunter.net/api/v1";getCourseId(t){return window.course_id??+document.querySelector('input[name="course_id"]')?.value}async getLessonsData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/course/${t}/lessons`);return await e.json()}catch(e){return console.error(`Failed to get Coursehunter lessons data by courseId: ${t}`,e.message),!1}}async getVideoData(t){const e=this.getCourseId(t);if(!e)return;const o=window.lessons??await this.getLessonsData(e);if(!o)return;const a=+(t.split("?lesson=")?.[1]??document.querySelector(".lessons-item_active")?.dataset?.index??1),n=o?.[a-1],{file:i,duration:r,title:s}=n;return i?{url:i,duration:r,title:s}:void 0}async getVideoId(t){const e=/\/course\/([^/]+)/.exec(t.pathname)?.[1];return e?e+t.search:void 0}},[k.twitch]:class extends ot{API_ORIGIN="https://clips.twitch.tv";async getClipLink(t,e){const o=document.querySelector("script[type='application/ld+json']"),a=t.slice(1);if(o){const t=JSON.parse(o.innerText),e=t["@graph"].find((t=>"VideoObject"===t["@type"]))?.creator.url;return`${e.replace("https://www.twitch.tv/","")}/clip/${a}`}const n="embed"===a,i=document.querySelector(n?".tw-link[data-test-selector='stream-info-card-component__stream-avatar-link']":".clips-player a:not([class])");if(!i)return;return`${i.href.replace("https://www.twitch.tv/","")}/clip/${n?e:a}`}async getVideoId(t){const e=t.pathname;if(/^m\.twitch\.tv$/.test(e))return/videos\/([^/]+)/.exec(t.href)?.[0]??e.slice(1);if(/^player\.twitch\.tv$/.test(t.hostname))return`videos/${t.searchParams.get("video")}`;const o=/([^/]+)\/(?:clip)\/([^/]+)/.exec(e);if(o)return o[0];return/^clips\.twitch\.tv$/.test(t.hostname)?await this.getClipLink(e,t.searchParams.get("clip")):/(?:videos)\/([^/]+)/.exec(e)?.[0]}},[k.sap]:class extends ot{API_ORIGIN="https://learning.sap.com/";async requestKaltura(t,e,o){try{const a=await this.fetch(`https://${t}/api_v3/service/multirequest`,{method:"POST",body:JSON.stringify({1:{service:"session",action:"startWidgetSession",widgetId:`_${e}`},2:{service:"baseEntry",action:"list",ks:"{1:result:ks}",filter:{redirectFromEntryId:o},responseProfile:{type:1,fields:"id,referenceId,name,description,dataUrl,duration,flavorParamsIds,type,dvrStatus,externalSourceType,createdAt,updatedAt,endDate,plays,views,downloadUrl,creatorId"}},3:{service:"baseEntry",action:"getPlaybackContext",entryId:"{2:result:objects:0:id}",ks:"{1:result:ks}",contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},apiVersion:"3.3.0",format:1,ks:"",clientTag:"html5:v3.17.22",partnerId:e}),headers:{"Content-Type":"application/json"}});return await a.json()}catch(t){return void console.error("Failed to request kaltura data",t.message)}}async getKalturaData(t){try{const e=/https:\/\/([^"]+)\/p\/([^"]+)\/embedPlaykitJs\/uiconf_id\/([^"]+)/.exec(document.querySelector('script[data-nscript="beforeInteractive"]')?.src);if(!e)throw new et(`Failed to get sap data for videoId: ${t}`);const[,o,a]=e;let n=document.querySelector("#shadow")?.firstChild?.getAttribute("id");if(n||(n=/"sourceId":\s?"([^"]+)"/.exec(document.querySelector("#__NEXT_DATA__")?.innerText)?.[1]),!o||Number.isNaN(+a)||!n)throw new et(`One of the necessary parameters for getting a link to a sap video in wasn't found for ${t}. Params: kalturaDomain = ${o}, partnerId = ${a}, entryId = ${n}`);return await this.requestKaltura(o,a,n)}catch(t){return void console.error("Failed to get kaltura data",t.message)}}async getVideoData(t){const e=await this.getKalturaData(t);if(!e)return;const[,o,a]=e,{duration:n}=o.objects[0],i=a.sources.find((t=>"url"===t.format&&"http,https"===t.protocols&&t.url.includes(".mp4")))?.url;if(!i)return;return{url:i,subtitles:a.playbackCaptions.map((t=>({language:V(t.languageCode),format:"vtt",url:t.webVttUrl,isAutoGenerated:t.label.includes("auto-generated")}))),duration:n}}async getVideoId(t){return/((courses|learning-journeys)\/([^/]+)(\/[^/]+)?)/.exec(t.pathname)?.[1]}},[k.udemy]:class extends ot{API_ORIGIN="https://www.udemy.com/api-2.0";getModuleData(){const t=document.querySelector(".ud-app-loader[data-module-id='course-taking']")?.dataset?.moduleArgs;return t?JSON.parse(t):(console.error(z.get("udemyModuleArgsNotFound")),{})}getLectureId(){return/learn\/lecture\/([^/]+)/.exec(window.location.pathname)?.[1]}async getLectureData(t,e){const o=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}/lectures/${e}/?`+new URLSearchParams({"fields[lecture]":"title,description,asset","fields[asset]":"length,media_sources,captions"}));return await o.json()}async getCourseLang(t){const e=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}?`+new URLSearchParams({"fields[course]":"locale"}));return await e.json()}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>G(t.locale_id)===e));return o||(o=t?.find((t=>"en"===G(t.locale_id)))??t?.[0]),o?.url}async getVideoData(t){const{courseId:e}=this.getModuleData();if(!e)return;const o=this.getLectureId();if(M.log(`[Udemy] courseId: ${e}, lectureId: ${o}`),!o)return;const{title:a,description:n,asset:i}=await this.getLectureData(e,o),{length:r,media_sources:s,captions:l}=i,d=this.findVideoUrl(s);if(!d)return void console.log("Failed to find .mp4 video file in media_sources",s);const u=await this.getCourseLang(e);let{locale:{locale:c}}=u;c=c?G(c):"en",at.includes(c)||(c="en");const h=this.findSubtitleUrl(l,c);return h||console.log("Failed to find subtitle file in captions",l),{...h?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:h},{target:"video_file_url",targetUrl:d}],detectedLanguage:c}:{url:d,translationHelp:null},duration:r,title:a,description:n}}async getVideoId(t){return t.pathname.slice(1)}},[k.coursera]:class extends ot{API_ORIGIN="https://www.coursera.org/api";async getCourseData(t){const e=await this.fetch(`${this.API_ORIGIN}/onDemandCourses.v1/${t}`),o=await e.json();return o?.elements?.[0]}getPlayer(){return document.querySelector(".vjs-v8")}getPlayerData(){return this.getPlayer()?.player}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>G(t.srclang)===e));return o||(o=t?.find((t=>"en"===G(t.srclang)))||t?.[0]),o?.src}async getVideoData(t){const e=this.getPlayerData(),{duration:o}=e?.cache_||{},{courseId:a,tracks:n,sources:i}=e?.options_||{},r=this.findVideoUrl(i);if(!r)return void console.log("Failed to find .mp4 video file in sources",i);const{primaryLanguageCodes:s}=await this.getCourseData(a);let l=s?.[0];l=l?G(l):"en",at.includes(l)||(l="en");const d=this.findSubtitleUrl(n,l);return d||console.log("Failed to find subtitle file in tracks",n),{...d?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:d},{target:"video_file_url",targetUrl:r}]}:{url:r,translationHelp:null},detectedLanguage:l,duration:o}}async getVideoId(t){return/learn\/([^/]+)\/lecture\/([^/]+)/.exec(t.pathname)?.[0]}},[k.linkedin]:class extends ot{API_ORIGIN="https://www.linkedin.com/learning";async getVideoData(t){try{const e=document.querySelector(".video-js");if(!e)throw new et(`Failed to find video element for videoID ${t}`);const o=(e.getAttribute("data-sources")??"[]").replaceAll(""",'"').replaceAll("&","&"),a=JSON.parse(o).find((t=>t.src.includes(".mp4")));if(!a)throw new Error(`Failed to find video url for videoID ${t}`);const n=new URL(a.src),i=e.getAttribute("data-captions-url"),r=i?[{language:"en",format:"vtt",url:i}]:void 0;return{url:A(n),subtitles:r}}catch(t){return void console.error("Failed to get linkedin video data",t.message)}}async getVideoId(t){return/\/learning\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[k.vimeo]:class extends ot{API_KEY="";DEFAULT_SITE_ORIGIN="https://vimeo.com";SITE_ORIGIN=this.isPrivatePlayer()?this.service?.url?.slice(0,-1)??this.DEFAULT_SITE_ORIGIN:this.DEFAULT_SITE_ORIGIN;isErrorData(t){return Object.hasOwn(t,"error")}isPrivatePlayer(){return this.referer&&!this.referer.includes("vimeo.com")}async getViewerData(){try{const t=await this.fetch("https://vimeo.com/_next/viewer"),e=await t.json(),{apiUrl:o,jwt:a}=e;return this.API_ORIGIN=`https://${o}`,this.API_KEY=`jwt ${a}`,e}catch(t){return console.error("Failed to get default viewer data.",t.message),!1}}async getVideoInfo(t){try{const e=new URLSearchParams({fields:"name,link,description,duration"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}?${e}`,{headers:{Authorization:this.API_KEY}}),a=await o.json();if(this.isErrorData(a))throw new Error(a.developer_message??a.error);return a}catch(e){return console.error(`Failed to get video info by video ID: ${t}`,e.message),!1}}async getPrivateVideoSource(t){try{const{default_cdn:e,cdns:o}=t.dash,a=o[e].url,n=await this.fetch(a);if(200!==n.status)throw new et(await n.text());const i=await n.json(),r=new URL(a),s=Array.from(i.base_url.matchAll(/\.\.\//g)).length+1,l=r.pathname.split("/");let d=i.base_url.replaceAll("../","");d=d&&!d.startsWith("/")?`/${d}`:d,r.pathname=l.slice(0,l.length-s).join("/")+d,r.pathname.endsWith("/")||(r.pathname+="/");const u=i.audio.find((t=>"audio/mp4"===t.mime_type&&"dash"===t.format));if(!u)throw new et("Failed to find video data");const c=u.segments?.[0]?.url;if(!c)throw new et("Failed to find first segment url");const[h,p]=c.split("?",2),g=new URLSearchParams(p);return g.delete("range"),r.pathname+=`${u.base_url}${h}`,r.href=r.href.split("?")[0]+"?"+g.toString(),r.href}catch(t){return console.error("Failed to get private video source",t.message),!1}}async getPrivateVideoInfo(t){try{const e=await this.getPrivateVideoSource(playerConfig.request.files);if(!e)throw new et("Failed to get private video source");const{title:o,duration:a}=playerConfig.video,{text_tracks:n}=playerConfig.request;return{url:`${this.SITE_ORIGIN}/${t}`,video_url:e,title:o,duration:a,subs:n}}catch(e){return console.error(`Failed to get private video info by video ID: ${t}`,e.message),!1}}async getSubsInfo(t){try{const e=new URLSearchParams({per_page:"100",fields:"language,type,link"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}/texttracks?${e}`,{headers:{Authorization:this.API_KEY}}),a=await o.json();if(this.isErrorData(a))throw new Error(a.developer_message??a.error);return a}catch(e){return console.error(`Failed to get subtitles info by video ID: ${t}`,e.message),!1}}async getVideoData(t){const e=this.isPrivatePlayer();if(!this.extraInfo)return this.returnBaseData(t);if(e){const e=await this.getPrivateVideoInfo(t);if(!e)return;const{url:o,subs:a,video_url:n,title:i,duration:r}=e,s=a.map((t=>({language:V(t.lang),format:"vtt",url:this.SITE_ORIGIN+t.url,isAutoGenerated:t.lang.includes("autogenerated")}))),l=s.length?[{target:"video_file_url",targetUrl:n},{target:"subtitles_file_url",targetUrl:s[0].url}]:null;return{...l?{url:o,translationHelp:l}:{url:n},subtitles:s,title:i,duration:r}}t.startsWith("video/")&&(t=t.replace("video/","")),t.includes("/")&&(t=t.replace("/",":"));if(!await this.getViewerData())return this.returnBaseData(t);const o=await this.getVideoInfo(t);if(!o)return this.returnBaseData(t);const a=await this.getSubsInfo(t),n=a?a.data.map((t=>({language:V(t.language),format:"vtt",url:t.link,isAutoGenerated:t.language.includes("autogen")}))):[],{link:i,duration:r,name:s,description:l}=o;return{url:i,title:s,description:l,subtitles:n,duration:r}}async getVideoId(t){const e=/[^/]+\/[^/]+$/.exec(t.pathname)?.[0];return this.isPrivatePlayer()?e:e?.startsWith("video/")?e.replace("video/",""):e??/[^/]+$/.exec(t.pathname)?.[0]}}};class st{helpersData;constructor(t={}){this.helpersData=t}getHelper(t){return new rt[t](this.helpersData)}}class lt extends Error{constructor(t){super(t),this.name="VideoDataError",this.message=t}}async function dt(t,e,o={}){const a=new URL(window.location.href),n=t.host;if(Object.keys(rt).includes(n)){const t=new st(o).getHelper(n);return await t.getVideoId(a)}switch(n){case k.custom:return a.href;case k.piped:case k.poketube:case k.invidious:case k.youtube:return"youtu.be"===a.hostname&&(a.search=`?v=${a.pathname.replace("/","")}`,a.pathname="/watch"),/(?:watch|embed|shorts|live)\/([^/]+)/.exec(a.pathname)?.[1]??a.searchParams.get("v");case k.vk:{const t=/^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(a.pathname),o=a.searchParams.get("z"),n=a.searchParams.get("oid"),i=a.searchParams.get("id");if(t)return t[0].slice(1);if(o)return o.split("/")[0];if(n&&i)return`video-${Math.abs(parseInt(n))}_${i}`;const r=e.parentElement?.closest(".video_box_wrap");return r?r.id.replace("video_box_wrap","video"):null}case k.nine_gag:case k.gag:return/gag\/([^/]+)/.exec(a.pathname)?.[1];case k.proxitok:case k.tiktok:return/([^/]+)\/video\/([^/]+)/.exec(a.pathname)?.[0];case k.xvideos:return/[^/]+\/[^/]+$/.exec(a.pathname)?.[0];case k.pornhub:return a.searchParams.get("viewkey")??/embed\/([^/]+)/.exec(a.pathname)?.[1];case k.twitter:return/status\/([^/]+)/.exec(a.pathname)?.[1];case k.rumble:case k.facebook:return a.pathname.slice(1);case k.rutube:return/(?:video|embed)\/([^/]+)/.exec(a.pathname)?.[1];case k.bilibili:{const t=a.searchParams.get("bvid");if(t)return t;let e=/video\/([^/]+)/.exec(a.pathname)?.[1];return e&&null!==a.searchParams.get("p")&&(e+=`/?p=${a.searchParams.get("p")}`),e}case k.bitchute:return/(video|embed)\/([^/]+)/.exec(a.pathname)?.[2];case k.eporner:return/video-([^/]+)\/([^/]+)/.exec(a.pathname)?.[0];case k.peertube:return/\/w\/([^/]+)/.exec(a.pathname)?.[0];case k.dailymotion:{const t=Array.from(document.querySelectorAll("*")).filter((t=>t.innerHTML.trim().includes(".m3u8")));let e=t?.[1]?.lastChild?.src;if(!e)return;return/\/video\/(\w+)\.m3u8/.exec(e)?.[1]}case k.trovo:{const t=a.searchParams.get("vid");if(!t)return null;const e=/([^/]+)\/([\d]+)/.exec(a.pathname)?.[0];return e?`${e}?vid=${t}`:null}case k.yandexdisk:return/\/i\/([^/]+)/.exec(a.pathname)?.[1];case k.okru:return/\/video\/(\d+)/.exec(a.pathname)?.[1];case k.googledrive:return a.searchParams.get("docid");case k.newgrounds:return/([^/]+)\/(view)\/([^/]+)/.exec(a.pathname)?.[0];case k.egghead:return a.pathname.slice(1);case k.youku:return/v_show\/id_[\w=]+/.exec(a.pathname)?.[0];case k.archive:return/(details|embed)\/([^/]+)/.exec(a.pathname)?.[2];case k.watchpornto:return/(video|embed)\/(\d+)(\/[^/]+\/)?/.exec(a.pathname)?.[0];default:return}}async function ut(t,e,o={}){const a=await dt(t,e,o);if(!a)throw new lt(`Entered unsupported link: "${t.host}"`);if(t.host===k.peertube&&(t.url=window.location.origin),t.rawResult)return{url:a,videoId:a,host:t.host,duration:void 0};if(!t.needExtraData)return{url:t.url+a,videoId:a,host:t.host,duration:void 0};const n=new st({...o,service:t}).getHelper(t.host),i=await n.getVideoData(a);if(!i)throw new lt(`Failed to get video raw url for ${t.host}`);return{...i,videoId:a,host:t.host}}class ct extends Error{constructor(t){super(z.getDefault(t)),this.name="VOTLocalizedError",this.unlocalizedMessage=t,this.localizedMessage=z.get(t)}}const{rE:ht}={rE:"1.3.1"};class pt extends Error{data;constructor(t,e=void 0){super(t),this.data=e,this.name="VOTJSError",this.message=t}}class gt{host;hostVOT;schema;schemaVOT;fetch;fetchOpts;getVideoDataFn;sessions={};requestLang;responseLang;userAgent=y.userAgent;componentVersion=y.componentVersion;paths={videoTranslation:"/video-translation/translate",videoSubtitles:"/video-subtitles/get-subtitles",streamPing:"/stream-translation/ping-stream",streamTranslation:"/stream-translation/translate-stream",createSession:"/session/create"};isCustomLink(t){return!!(/\.(m3u8|m4(a|v)|mpd)/.exec(t)??/^https:\/\/cdn\.qstv\.on\.epicgames\.com/.exec(t))}headers={"User-Agent":this.userAgent,Accept:"application/x-protobuf","Accept-Language":"en","Content-Type":"application/x-protobuf",Pragma:"no-cache","Cache-Control":"no-cache","Sec-Fetch-Mode":"no-cors"};headersVOT={"User-Agent":`vot.js/${ht}`,"Content-Type":"application/json",Pragma:"no-cache","Cache-Control":"no-cache"};constructor({host:t=y.host,hostVOT:e=y.hostVOT,fetchFn:o=L,fetchOpts:a={},getVideoDataFn:n=ut,requestLang:i="en",responseLang:r="ru",headers:s={}}={}){const l=/(http(s)?):\/\//,d=l.exec(t)?.[1];this.host=d?t.replace(`${d}://`,""):t,this.schema=d??"https";const u=l.exec(e)?.[1];this.hostVOT=u?e.replace(`${u}://`,""):e,this.schemaVOT=u??"https",this.fetch=o,this.fetchOpts=a,this.getVideoDataFn=n,this.requestLang=i,this.responseLang=r,this.headers={...this.headers,...s}}getOpts(t,e={}){return{method:"POST",headers:{...this.headers,...e},body:t,...this.fetchOpts}}async request(t,e,o={}){const a=this.getOpts(new Blob([e]),o);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestVOT(t,e,o={}){const a=this.getOpts(JSON.stringify(e),{...this.headersVOT,...o});try{const e=await this.fetch(`${this.schemaVOT}://${this.hostVOT}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async getSession(t){const e=Math.floor(Date.now()/1e3),o=this.sessions[t];if(o&&o.timestamp+o.expires>e)return o;const{secretKey:a,expires:n,uuid:i}=await this.createSession(t);return this.sessions[t]={secretKey:a,expires:n,timestamp:e,uuid:i},this.sessions[t]}async translateVideoYAImpl({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:a=null,headers:n={}}){const{url:i,duration:r=y.defaultDuration}=t,{secretKey:s,uuid:l}=await this.getSession("video-translation"),d=b.encodeTranslationRequest(i,r,e,o,a),u=await S(d),c=await this.request(this.paths.videoTranslation,d,{"Vtrans-Signature":u,"Sec-Vtrans-Sk":s,"Sec-Vtrans-Token":`${u}:${l}:${this.paths.videoTranslation}:${this.componentVersion}`,...n});if(!c.success)throw new ct("requestTranslationFailed");const h=b.decodeTranslationResponse(c.data);switch(M.log("requestTranslation",h),h.status){case T.FAILED:throw h?.message?new pt("Yandex couldn't translate video",h):new ct("requestTranslationFailed");case T.FINISHED:case T.PART_CONTENT:if(!h.url)throw new ct("audioNotReceived");return{translated:!0,url:h.url,remainingTime:h.remainingTime??-1};case T.WAITING:return{translated:!1,remainingTime:h.remainingTime};case T.LONG_WAITING:case T.LONG_WAITING_2:return{translated:!1,remainingTime:h.remainingTime??-1};default:throw console.error("[vot.js] Unknown response",h),new pt("Unknown response from Yandex",h)}}async translateVideoVOTImpl({url:t,videoId:e,service:o,requestLang:a=this.requestLang,responseLang:n=this.responseLang,headers:i={}}){const r=function(t,e,o){return t===k.patreon?{service:"mux",videoId:new URL(o).pathname.slice(1)}:{service:t,videoId:e}}(o,e,t),s=await this.requestVOT(this.paths.videoTranslation,{provider:"yandex",service:r.service,videoId:r.videoId,fromLang:a,toLang:n,rawVideo:t},i);if(!s.success)throw new ct("requestTranslationFailed",s);const l=s.data;switch(l.status){case"failed":throw new pt("Yandex couldn't translate video",l);case"success":if(!l.translatedUrl)throw new ct("audioNotReceived");return{translated:!0,url:l.translatedUrl,remainingTime:-1};case"waiting":return{translated:!1,remainingTime:l.remainingTime,message:l.message}}}async translateVideo({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:a=null,headers:n={}}){const{url:i,videoId:r,host:s}=t;return this.isCustomLink(i)?await this.translateVideoVOTImpl({url:i,videoId:r,service:s,requestLang:e,responseLang:o,headers:n}):await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:a,headers:n})}async getSubtitles({videoData:t,requestLang:e=this.requestLang,headers:o={}}){const{url:a}=t;if(this.isCustomLink(a))return{waiting:!1,subtitles:[]};const{secretKey:n,uuid:i}=await this.getSession("video-translation"),r=b.encodeSubtitlesRequest(a,e),s=await S(r),l=await this.request(this.paths.videoSubtitles,r,{"Vsubs-Signature":await S(r),"Sec-Vsubs-Sk":n,"Sec-Vsubs-Token":`${s}:${i}:${this.paths.videoSubtitles}:${this.componentVersion}`,...o});if(!l.success)throw new pt("Failed to request video subtitles",l);return b.decodeSubtitlesResponse(l.data)}async pingStream({pingId:t,headers:e={}}){const{secretKey:o,uuid:a}=await this.getSession("video-translation"),n=b.encodeStreamPingRequest(t),i=await S(n),r=await this.request(this.paths.streamPing,n,{"Vtrans-Signature":await S(n),"Sec-Vtrans-Sk":o,"Sec-Vtrans-Token":`${i}:${a}:${this.paths.streamPing}:${this.componentVersion}`,...e});if(!r.success)throw new pt("Failed to request stream ping",r);return!0}async translateStream({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,headers:n={}}){const{url:i}=t;if(this.isCustomLink(i))throw new ct("VOTStreamNotSupportedUrl");const{secretKey:r,uuid:s}=await this.getSession("video-translation"),l=b.encodeStreamRequest(i,e,o),d=await S(l),u=await this.request(this.paths.streamTranslation,l,{"Vtrans-Signature":await S(l),"Sec-Vtrans-Sk":r,"Sec-Vtrans-Token":`${d}:${s}:${this.paths.streamTranslation}:${this.componentVersion}`,...n});if(!u.success)throw new pt("Failed to request stream translation",u);const c=b.decodeStreamResponse(u.data),h=c.interval;switch(h){case a.NO_CONNECTION:case a.TRANSLATING:return{translated:!1,interval:h,message:h===a.NO_CONNECTION?"streamNoConnectionToServer":"translationTakeFewMinutes"};case a.STREAMING:return{translated:!0,interval:h,pingId:c.pingId,result:c.translatedInfo};default:throw console.error("[vot.js] Unknown response",c),new pt("Unknown response from Yandex",c)}}async createSession(t){const e=function(){let t="";for(let e=0;e<32;e++)t+="0123456789ABCDEF"[Math.floor(16*Math.random())];return t}(),o=b.encodeYandexSessionRequest(e,t),a=await this.request(this.paths.createSession,o,{"Vtrans-Signature":await S(o)});if(!a.success)throw new pt("Failed to request create session",a);return{...b.decodeYandexSessionResponse(a.data),uuid:e}}}class mt extends gt{async request(t,e,o={}){const a=this.getOpts(JSON.stringify({headers:{...this.headers,...o},body:Array.from(e)}),{"Content-Type":"application/json"});try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}}var vt;function ft(t,e=","){const o=t/1e3,a=Math.floor(o/3600),n=Math.floor(o%3600/60),i=Math.floor(o%60),r=Math.floor(t%1e3);return`${a.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}${e}${r.toString().padStart(3,"0")}`}function bt(t){const e=t.split(" ")?.[0]?.split(":");e.length<3&&e.unshift("00");const[o,a,n]=e;return 36e5*+o+6e4*+a+ +n.replace(/[,.]/,"")}function yt(t,e="srt"){const o="vtt"===e,a=o?".":",",n=t.subtitles.map(((t,e)=>(o?"":`${e+1}\n`)+`${ft(t.startMs,a)} --\x3e ${ft(t.startMs+t.durationMs,a)}\n${t.text}\n\n`)).join("").trim();return o?`WEBVTT\n\n${n}`:n}function wt(t,e="srt"){const o=function(t){return"string"!=typeof t?"json":/(WEBVTT)(\r?\n\r?\n)/.exec(t)?"vtt":"srt"}(t);return o===e?t:"json"===o?yt(t,e):(t=function(t,e="srt"){const o=t.split(/\r?\n\r?\n/g);"vtt"===e&&o.shift();const a=+("srt"===e);return{containsTokens:!1,subtitles:o.reduce(((t,e)=>{const o=e.trim().split("\n"),n=o[a],i=o.slice(a+1).join("\n");if(!(2===o.length&&e.includes(" --\x3e ")||n?.includes(" --\x3e ")))return 0===t.length||(t[t.length-1].text+=`\n\n${o.join("\n")}`),t;const[r,s]=n.split(" --\x3e "),l=bt(r),d=bt(s)-l;return t.push({text:i,startMs:l,durationMs:d,speakerId:"0"}),t}),[])}}(t,o),"json"===e?t:yt(t,e))}!function(t){t.Channel="Channel",t.Video="Video"}(vt||(vt={}));const xt=globalThis,St=xt.trustedTypes,kt=St?St.createPolicy("lit-html",{createHTML:t=>t}):void 0,Tt="$lit$",Ct=`lit$${Math.random().toFixed(9).slice(2)}$`,Lt="?"+Ct,Vt=`<${Lt}>`,At=document,It=()=>At.createComment(""),Ot=t=>null===t||"object"!=typeof t&&"function"!=typeof t,Pt=Array.isArray,Mt=t=>Pt(t)||"function"==typeof t?.[Symbol.iterator],Et="[ \t\n\f\r]",_t=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,$t=/-->/g,Nt=/>/g,Rt=RegExp(`>|${Et}(?:([^\\s"'>=/]+)(${Et}*=${Et}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),Bt=/'/g,Dt=/"/g,Ft=/^(?:script|style|textarea|title)$/i,qt=t=>(e,...o)=>({_$litType$:t,strings:e,values:o}),Ut=qt(1),Ht=qt(2),zt=(qt(3),Symbol.for("lit-noChange")),Wt=Symbol.for("lit-nothing"),jt=new WeakMap,Gt=At.createTreeWalker(At,129);function Yt(t,e){if(!Pt(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==kt?kt.createHTML(e):e}const Kt=(t,e)=>{const o=t.length-1,a=[];let n,i=2===e?"":3===e?"":"",r=_t;for(let e=0;e"===l[0]?(r=n??_t,d=-1):void 0===l[1]?d=-2:(d=r.lastIndex-l[2].length,s=l[1],r=void 0===l[3]?Rt:'"'===l[3]?Dt:Bt):r===Dt||r===Bt?r=Rt:r===$t||r===Nt?r=_t:(r=Rt,n=void 0);const c=r===Rt&&t[e+1].startsWith("/>")?" ":"";i+=r===_t?o+Vt:d>=0?(a.push(s),o.slice(0,d)+Tt+o.slice(d)+Ct+c):o+Ct+(-2===d?e:c)}return[Yt(t,i+(t[o]||"")+(2===e?"":3===e?"":"")),a]};class Jt{constructor({strings:t,_$litType$:e},o){let a;this.parts=[];let n=0,i=0;const r=t.length-1,s=this.parts,[l,d]=Kt(t,e);if(this.el=Jt.createElement(l,o),Gt.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(a=Gt.nextNode())&&s.length0){a.textContent=St?St.emptyScript:"";for(let o=0;o2||""!==o[0]||""!==o[1]?(this._$AH=Array(o.length-1).fill(new String),this.strings=o):this._$AH=Wt}_$AI(t,e=this,o,a){const n=this.strings;let i=!1;if(void 0===n)t=Zt(this,t,e,0),i=!Ot(t)||t!==this._$AH&&t!==zt,i&&(this._$AH=t);else{const a=t;let r,s;for(t=n[0],r=0;r{const a=o?.renderBefore??e;let n=a._$litPart$;if(void 0===n){const t=o?.renderBefore??null;a._$litPart$=n=new Qt(e.insertBefore(It(),t),t,void 0,o??{})}return n._$AI(t),n};function se(t){return String(t).split("").map((t=>t.charCodeAt(0)))}function le(t){return new Uint8Array(se(t))}function de(t){const e=new ArrayBuffer(2*t.length),o=new Uint8Array(e);return new Uint16Array(e).set(se(t)),o}function ue(t){const e=255;return[t>>>24&e,t>>>16&e,t>>>8&e,t&e]}function ce(t){return 11+t}function he(t,e,o,a){return 11+e+1+1+(a?2+2*(o+1):o+1)+t}function pe(t){let e=0;return t.forEach((t=>{e+=2+2*t[0].length+2+2+2*t[1].length+2})),11+e}function ge(t,e){const o=2*e;let a=0;return t.forEach((t=>{a+=2+2*t[0].length+2+4})),18+o+2+a}class me{_setIntegerFrame(t,e){const o=parseInt(e,10);this.frames.push({name:t,value:o,size:ce(o.toString().length)})}_setStringFrame(t,e){const o=e.toString();let a=13+2*o.length;"TDAT"===t&&(a=ce(o.length)),this.frames.push({name:t,value:o,size:a})}_setPictureFrame(t,e,o,a){const n=function(t){if(!t||!t.length)return null;if(255===t[0]&&216===t[1]&&255===t[2])return"image/jpeg";if(137===t[0]&&80===t[1]&&78===t[2]&&71===t[3])return"image/png";if(71===t[0]&&73===t[1]&&70===t[2])return"image/gif";if(87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])return"image/webp";const e=73===t[0]&&73===t[1]&&42===t[2]&&0===t[3],o=77===t[0]&&77===t[1]&&0===t[2]&&42===t[3];return e||o?"image/tiff":66===t[0]&&77===t[1]?"image/bmp":0===t[0]&&0===t[1]&&1===t[2]&&0===t[3]?"image/x-icon":null}(new Uint8Array(e)),i=o.toString();if(!n)throw new Error("Unknown picture MIME type");o||(a=!1),this.frames.push({name:"APIC",value:e,pictureType:t,mimeType:n,useUnicodeEncoding:a,description:i,size:he(e.byteLength,n.length,i.length,a)})}_setLyricsFrame(t,e,o){const a=t.split("").map((t=>t.charCodeAt(0))),n=e.toString(),i=o.toString();var r,s;this.frames.push({name:"USLT",value:i,language:a,description:n,size:(r=n.length,s=i.length,16+2*r+2+2+2*s)})}_setCommentFrame(t,e,o){const a=t.split("").map((t=>t.charCodeAt(0))),n=e.toString(),i=o.toString();var r,s;this.frames.push({name:"COMM",value:i,language:a,description:n,size:(r=n.length,s=i.length,16+2*r+2+2+2*s)})}_setPrivateFrame(t,e){const o=t.toString();var a,n;this.frames.push({name:"PRIV",value:e,id:o,size:(a=o.length,n=e.byteLength,10+a+1+n)})}_setUserStringFrame(t,e){const o=t.toString(),a=e.toString();var n,i;this.frames.push({name:"TXXX",description:o,value:a,size:(n=o.length,i=a.length,13+2*n+2+2+2*i)})}_setUrlLinkFrame(t,e){const o=e.toString();var a;this.frames.push({name:t,value:o,size:(a=o.length,10+a)})}_setPairedTextFrame(t,e){this.frames.push({name:t,value:e,size:pe(e)})}_setSynchronisedLyricsFrame(t,e,o,a,n){const i=n.toString(),r=a.split("").map((t=>t.charCodeAt(0)));this.frames.push({name:"SYLT",value:e,language:r,description:i,type:t,timestampFormat:o,size:ge(e,i.length)})}constructor(t){if(!t||"object"!=typeof t||!("byteLength"in t))throw new Error("First argument should be an instance of ArrayBuffer or Buffer");this.arrayBuffer=t,this.padding=4096,this.frames=[],this.url=""}setFrame(t,e){switch(t){case"TPE1":case"TCOM":case"TCON":{if(!Array.isArray(e))throw new Error(`${t} frame value should be an array of strings`);const o="TCON"===t?";":"/",a=e.join(o);this._setStringFrame(t,a);break}case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TMED":case"TPUB":case"TCOP":case"TKEY":case"TEXT":case"TDAT":case"TSRC":this._setStringFrame(t,e);break;case"TBPM":case"TLEN":case"TYER":this._setIntegerFrame(t,e);break;case"USLT":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("lyrics"in e))throw new Error("USLT frame value should be an object with keys description and lyrics");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setLyricsFrame(e.language,e.description,e.lyrics);break;case"APIC":if("object"!=typeof e||!("type"in e)||!("data"in e)||!("description"in e))throw new Error("APIC frame value should be an object with keys type, data and description");if(e.type<0||e.type>20)throw new Error("Incorrect APIC frame picture type");this._setPictureFrame(e.type,e.data,e.description,!!e.useUnicodeEncoding);break;case"TXXX":if("object"!=typeof e||!("description"in e)||!("value"in e))throw new Error("TXXX frame value should be an object with keys description and value");this._setUserStringFrame(e.description,e.value);break;case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":this._setUrlLinkFrame(t,e);break;case"COMM":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("text"in e))throw new Error("COMM frame value should be an object with keys description and text");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setCommentFrame(e.language,e.description,e.text);break;case"PRIV":if("object"!=typeof e||!("id"in e)||!("data"in e))throw new Error("PRIV frame value should be an object with keys id and data");this._setPrivateFrame(e.id,e.data);break;case"IPLS":if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Error("IPLS frame value should be an array of pairs");this._setPairedTextFrame(t,e);break;case"SYLT":if("object"!=typeof e||!("type"in e)||!("text"in e)||!("timestampFormat"in e))throw new Error("SYLT frame value should be an object with keys type, text and timestampFormat");if(!Array.isArray(e.text)||!Array.isArray(e.text[0]))throw new Error("SYLT frame text value should be an array of pairs");if(e.type<0||e.type>6)throw new Error("Incorrect SYLT frame content type");if(e.timestampFormat<1||e.timestampFormat>2)throw new Error("Incorrect SYLT frame time stamp format");e.language=e.language||"eng",e.description=e.description||"",this._setSynchronisedLyricsFrame(e.type,e.text,e.timestampFormat,e.language,e.description);break;default:throw new Error(`Unsupported frame ${t}`)}return this}removeTag(){if(this.arrayBuffer.byteLength<10)return;const t=new Uint8Array(this.arrayBuffer),e=t[3],o=((a=[t[6],t[7],t[8],t[9]])[0]<<21)+(a[1]<<14)+(a[2]<<7)+a[3]+10;var a,n;73!==(n=t)[0]||68!==n[1]||51!==n[2]||e<2||e>4||(this.arrayBuffer=new Uint8Array(t.subarray(o)).buffer)}addTag(){this.removeTag();const t=[255,254],e=10+this.frames.reduce(((t,e)=>t+e.size),0)+this.padding,o=new ArrayBuffer(this.arrayBuffer.byteLength+e),a=new Uint8Array(o);let n=0,i=[];return i=[73,68,51,3],a.set(i,n),n+=i.length,n++,n++,i=function(t){const e=127;return[t>>>21&e,t>>>14&e,t>>>7&e,t&e]}(e-10),a.set(i,n),n+=i.length,this.frames.forEach((e=>{switch(i=le(e.name),a.set(i,n),n+=i.length,i=ue(e.size-10),a.set(i,n),n+=i.length,n+=2,e.name){case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":i=le(e.value),a.set(i,n),n+=i.length;break;case"TPE1":case"TCOM":case"TCON":case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TKEY":case"TMED":case"TPUB":case"TCOP":case"TEXT":case"TSRC":i=[1].concat(t),a.set(i,n),n+=i.length,i=de(e.value),a.set(i,n),n+=i.length;break;case"TXXX":case"USLT":case"COMM":i=[1],"USLT"!==e.name&&"COMM"!==e.name||(i=i.concat(e.language)),i=i.concat(t),a.set(i,n),n+=i.length,i=de(e.description),a.set(i,n),n+=i.length,i=[0,0].concat(t),a.set(i,n),n+=i.length,i=de(e.value),a.set(i,n),n+=i.length;break;case"TBPM":case"TLEN":case"TDAT":case"TYER":n++,i=le(e.value),a.set(i,n),n+=i.length;break;case"PRIV":i=le(e.id),a.set(i,n),n+=i.length,n++,a.set(new Uint8Array(e.value),n),n+=e.value.byteLength;break;case"APIC":i=[e.useUnicodeEncoding?1:0],a.set(i,n),n+=i.length,i=le(e.mimeType),a.set(i,n),n+=i.length,i=[0,e.pictureType],a.set(i,n),n+=i.length,e.useUnicodeEncoding?(i=[].concat(t),a.set(i,n),n+=i.length,i=de(e.description),a.set(i,n),n+=i.length,n+=2):(i=le(e.description),a.set(i,n),n+=i.length,n++),a.set(new Uint8Array(e.value),n),n+=e.value.byteLength;break;case"IPLS":i=[1],a.set(i,n),n+=i.length,e.value.forEach((e=>{i=[].concat(t),a.set(i,n),n+=i.length,i=de(e[0].toString()),a.set(i,n),n+=i.length,i=[0,0].concat(t),a.set(i,n),n+=i.length,i=de(e[1].toString()),a.set(i,n),n+=i.length,i=[0,0],a.set(i,n),n+=i.length}));break;case"SYLT":i=[1].concat(e.language).concat(e.timestampFormat).concat(e.type),a.set(i,n),n+=i.length,i=[].concat(t),a.set(i,n),n+=i.length,i=de(e.description),a.set(i,n),n+=i.length,n+=2,e.value.forEach((e=>{i=[].concat(t),a.set(i,n),n+=i.length,i=de(e[0].toString()),a.set(i,n),n+=i.length,i=[0,0],a.set(i,n),n+=i.length,i=ue(e[1]),a.set(i,n),n+=i.length}))}})),n+=this.padding,a.set(new Uint8Array(this.arrayBuffer),n),this.arrayBuffer=o,o}getBlob(){return new Blob([this.arrayBuffer],{type:"audio/mpeg"})}getURL(){return this.url||(this.url=URL.createObjectURL(this.getBlob())),this.url}revokeURL(){URL.revokeObjectURL(this.url)}}o("./src/styles/main.scss");const ve="#UNDEFINED",fe=Ht`{var t={"./src/styles/main.scss":()=>{GM_addStyle('.vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before,.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border-radius:4px;outline:none;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:"";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-outlined-button[disabled=true]:before,.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:4px;outline:none;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-text-button[disabled=true]:before,.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;width:36px;height:36px;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:50%;outline:none;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-icon-button[disabled=true]:before,.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;width:100%!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:#0000!important;border-radius:4px!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 #0000,inset -1px 0 #0000,inset 0 -1px #0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):placeholder-shown,.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{width:100%!important;max-height:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span,.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:""!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px #0000!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid #0000!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid #0000!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before,.vot-textfield>input:not(:focus):placeholder-shown+span:after,.vot-textfield>textarea:not(:focus):placeholder-shown+span:before,.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:#0000!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown,.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after,.vot-textfield>input:disabled:placeholder-shown,.vot-textfield>input:disabled:placeholder-shown+span,.vot-textfield>textarea:disabled:placeholder-shown,.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before,.vot-textfield>input:disabled:placeholder-shown+span:after,.vot-textfield>textarea:disabled:placeholder-shown+span:before,.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:#0000!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox-sub{padding-left:16px}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;padding:0;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block;position:relative}.vot-checkbox>input+span:before{content:"";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:"";z-index:10000;pointer-events:none;border:0 solid #0000;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked,.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before,.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after,.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:#0000}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked,.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:#0000}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;width:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:#0000!important;border:none!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;padding:0!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:""!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:#0000!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{width:20px;height:32px;fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));max-width:100vw;height:32px;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{height:100%;color:inherit;background-color:#0000;border:none;justify-content:center;align-items:center;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{min-height:100px;max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);height:fit-content;color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px #0000001f,0 16px 16px #0000003d}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:#0009;transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,#2e2f34cc);width:max-content;max-width:100%;max-height:100%;color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}')},"./node_modules/bowser/es5.js":function(t){t.exports=function(t){var e={};function o(i){if(e[i])return e[i].exports;var a=e[i]={i,l:!1,exports:{}};return t[i].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=t,o.c=e,o.d=function(t,e,i){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)o.d(i,a,function(e){return t[e]}.bind(null,a));return i},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=90)}({17:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i=o(18),a=function(){function t(){}return t.getFirstMatch=function(t,e){var o=e.match(t);return o&&o.length>0&&o[1]||""},t.getSecondMatch=function(t,e){var o=e.match(t);return o&&o.length>1&&o[2]||""},t.matchAndReturnConst=function(t,e,o){if(t.test(e))return o},t.getWindowsVersionName=function(t){switch(t){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},t.getMacOSVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),10===e[0])switch(e[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},t.getAndroidVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),!(1===e[0]&&e[1]<5))return 1===e[0]&&e[1]<6?"Cupcake":1===e[0]&&e[1]>=6?"Donut":2===e[0]&&e[1]<2?"Eclair":2===e[0]&&2===e[1]?"Froyo":2===e[0]&&e[1]>2?"Gingerbread":3===e[0]?"Honeycomb":4===e[0]&&e[1]<1?"Ice Cream Sandwich":4===e[0]&&e[1]<4?"Jelly Bean":4===e[0]&&e[1]>=4?"KitKat":5===e[0]?"Lollipop":6===e[0]?"Marshmallow":7===e[0]?"Nougat":8===e[0]?"Oreo":9===e[0]?"Pie":void 0},t.getVersionPrecision=function(t){return t.split(".").length},t.compareVersions=function(e,o,i){void 0===i&&(i=!1);var a=t.getVersionPrecision(e),n=t.getVersionPrecision(o),r=Math.max(a,n),s=0,l=t.map([e,o],(function(e){var o=r-t.getVersionPrecision(e),i=e+new Array(o+1).join(".0");return t.map(i.split("."),(function(t){return new Array(20-t.length).join("0")+t})).reverse()}));for(i&&(s=r-Math.min(a,n)),r-=1;r>=s;){if(l[0][r]>l[1][r])return 1;if(l[0][r]===l[1][r]){if(r===s)return 0;r-=1}else if(l[0][r]1?a-1:0),r=1;r0){var r=Object.keys(o),l=s.default.find(r,(function(t){return e.isOS(t)}));if(l){var d=this.satisfies(o[l]);if(void 0!==d)return d}var u=s.default.find(r,(function(t){return e.isPlatform(t)}));if(u){var c=this.satisfies(o[u]);if(void 0!==c)return c}}if(n>0){var h=Object.keys(a),p=s.default.find(h,(function(t){return e.isBrowser(t,!0)}));if(void 0!==p)return this.compareVersion(a[p])}},e.isBrowser=function(t,e){void 0===e&&(e=!1);var o=this.getBrowserName().toLowerCase(),i=t.toLowerCase(),a=s.default.getBrowserTypeByAlias(i);return e&&a&&(i=a.toLowerCase()),i===o},e.compareVersion=function(t){var e=[0],o=t,i=!1,a=this.getBrowserVersion();if("string"==typeof a)return">"===t[0]||"<"===t[0]?(o=t.substr(1),"="===t[1]?(i=!0,o=t.substr(2)):e=[],">"===t[0]?e.push(1):e.push(-1)):"="===t[0]?o=t.substr(1):"~"===t[0]&&(i=!0,o=t.substr(1)),e.indexOf(s.default.compareVersions(a,o,i))>-1},e.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},e.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},e.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},e.is=function(t,e){return void 0===e&&(e=!1),this.isBrowser(t,e)||this.isOS(t)||this.isPlatform(t)},e.some=function(t){var e=this;return void 0===t&&(t=[]),t.some((function(t){return e.is(t)}))},t}();e.default=d,t.exports=e.default},92:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=/version\/(\d+(\.?_?\d+)+)/i,r=[{test:[/googlebot/i],describe:function(t){var e={name:"Googlebot"},o=a.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/opera/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opr\/|opios/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/SamsungBrowser/i],describe:function(t){var e={name:"Samsung Internet for Android"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Whale/i],describe:function(t){var e={name:"NAVER Whale Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MZBrowser/i],describe:function(t){var e={name:"MZ Browser"},o=a.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/focus/i],describe:function(t){var e={name:"Focus"},o=a.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/swing/i],describe:function(t){var e={name:"Swing"},o=a.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/coast/i],describe:function(t){var e={name:"Opera Coast"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(t){var e={name:"Opera Touch"},o=a.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/yabrowser/i],describe:function(t){var e={name:"Yandex Browser"},o=a.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/ucbrowser/i],describe:function(t){var e={name:"UC Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Maxthon|mxios/i],describe:function(t){var e={name:"Maxthon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/epiphany/i],describe:function(t){var e={name:"Epiphany"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/puffin/i],describe:function(t){var e={name:"Puffin"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sleipnir/i],describe:function(t){var e={name:"Sleipnir"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/k-meleon/i],describe:function(t){var e={name:"K-Meleon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/micromessenger/i],describe:function(t){var e={name:"WeChat"},o=a.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qqbrowser/i],describe:function(t){var e={name:/qqbrowserlite/i.test(t)?"QQ Browser Lite":"QQ Browser"},o=a.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/msie|trident/i],describe:function(t){var e={name:"Internet Explorer"},o=a.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/\sedg\//i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/edg([ea]|ios)/i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/vivaldi/i],describe:function(t){var e={name:"Vivaldi"},o=a.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/seamonkey/i],describe:function(t){var e={name:"SeaMonkey"},o=a.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sailfish/i],describe:function(t){var e={name:"Sailfish"},o=a.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,t);return o&&(e.version=o),e}},{test:[/silk/i],describe:function(t){var e={name:"Amazon Silk"},o=a.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/phantom/i],describe:function(t){var e={name:"PhantomJS"},o=a.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/slimerjs/i],describe:function(t){var e={name:"SlimerJS"},o=a.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e={name:"BlackBerry"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e={name:"WebOS Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/bada/i],describe:function(t){var e={name:"Bada"},o=a.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/tizen/i],describe:function(t){var e={name:"Tizen"},o=a.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qupzilla/i],describe:function(t){var e={name:"QupZilla"},o=a.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var e={name:"Firefox"},o=a.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/electron/i],describe:function(t){var e={name:"Electron"},o=a.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MiuiBrowser/i],describe:function(t){var e={name:"Miui"},o=a.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/chromium/i],describe:function(t){var e={name:"Chromium"},o=a.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/chrome|crios|crmo/i],describe:function(t){var e={name:"Chrome"},o=a.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/GSA/i],describe:function(t){var e={name:"Google Search"},o=a.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e={name:"Android Browser"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/playstation 4/i],describe:function(t){var e={name:"PlayStation 4"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/safari|applewebkit/i],describe:function(t){var e={name:"Safari"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/.*/i],describe:function(t){var e=-1!==t.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:a.default.getFirstMatch(e,t),version:a.default.getSecondMatch(e,t)}}}];e.default=r,t.exports=e.default},93:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/Roku\/DVP/],describe:function(t){var e=a.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,t);return{name:n.OS_MAP.Roku,version:e}}},{test:[/windows phone/i],describe:function(t){var e=a.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.WindowsPhone,version:e}}},{test:[/windows /i],describe:function(t){var e=a.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,t),o=a.default.getWindowsVersionName(e);return{name:n.OS_MAP.Windows,version:e,versionName:o}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(t){var e={name:n.OS_MAP.iOS},o=a.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,t);return o&&(e.version=o),e}},{test:[/macintosh/i],describe:function(t){var e=a.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,t).replace(/[_\s]/g,"."),o=a.default.getMacOSVersionName(e),i={name:n.OS_MAP.MacOS,version:e};return o&&(i.versionName=o),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var e=a.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,t).replace(/[_\s]/g,".");return{name:n.OS_MAP.iOS,version:e}}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e=a.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,t),o=a.default.getAndroidVersionName(e),i={name:n.OS_MAP.Android,version:e};return o&&(i.versionName=o),i}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e=a.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,t),o={name:n.OS_MAP.WebOS};return e&&e.length&&(o.version=e),o}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e=a.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,t)||a.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,t)||a.default.getFirstMatch(/\bbb(\d+)/i,t);return{name:n.OS_MAP.BlackBerry,version:e}}},{test:[/bada/i],describe:function(t){var e=a.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Bada,version:e}}},{test:[/tizen/i],describe:function(t){var e=a.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Tizen,version:e}}},{test:[/linux/i],describe:function(){return{name:n.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:n.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var e=a.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.PlayStation4,version:e}}}];e.default=r,t.exports=e.default},94:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(t){var e=a.default.getFirstMatch(/(can-l01)/i,t)&&"Nova",o={type:n.PLATFORMS_MAP.mobile,vendor:"Huawei"};return e&&(o.model=e),o}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){var e=t.test(/ipod|iphone/i),o=t.test(/like (ipod|iphone)/i);return e&&!o},describe:function(t){var e=a.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:n.PLATFORMS_MAP.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"blackberry"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(t){return"bada"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"windows phone"===t.getBrowserName()},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(t){var e=Number(String(t.getOSVersion()).split(".")[0]);return"android"===t.getOSName(!0)&&e>=3},describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){return"android"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"macos"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(t){return"windows"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"linux"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"playstation 4"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}},{test:function(t){return"roku"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}}];e.default=r,t.exports=e.default},95:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:function(t){return"microsoft edge"===t.getBrowserName(!0)},describe:function(t){if(/\sedg\//i.test(t))return{name:n.ENGINE_MAP.Blink};var e=a.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,t);return{name:n.ENGINE_MAP.EdgeHTML,version:e}}},{test:[/trident/i],describe:function(t){var e={name:n.ENGINE_MAP.Trident},o=a.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){return t.test(/presto/i)},describe:function(t){var e={name:n.ENGINE_MAP.Presto},o=a.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=t.test(/gecko/i),o=t.test(/like gecko/i);return e&&!o},describe:function(t){var e={name:n.ENGINE_MAP.Gecko},o=a.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:n.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var e={name:n.ENGINE_MAP.WebKit},o=a.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}}];e.default=r,t.exports=e.default}})},"./node_modules/requestidlecallback-polyfill/index.js":()=>{window.requestIdleCallback=window.requestIdleCallback||function(t){var e=Date.now();return setTimeout((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),1)},window.cancelIdleCallback=window.cancelIdleCallback||function(t){clearTimeout(t)}}},e={};function o(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,o),n.exports}(()=>{"use strict";var t=o("./node_modules/bowser/es5.js");const e=protobuf;var i;function a(t){switch(t){case 0:case"NO_CONNECTION":return i.NO_CONNECTION;case 10:case"TRANSLATING":return i.TRANSLATING;case 20:case"STREAMING":return i.STREAMING;default:return i.UNRECOGNIZED}}!function(t){t[t.NO_CONNECTION=0]="NO_CONNECTION",t[t.TRANSLATING=10]="TRANSLATING",t[t.STREAMING=20]="STREAMING",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(i||(i={}));const n={encode:(t,o=e.Writer.create())=>(""!==t.target&&o.uint32(10).string(t.target),""!==t.targetUrl&&o.uint32(18).string(t.targetUrl),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={target:"",targetUrl:""};for(;i.pos>>3){case 1:if(10!==t)break;n.target=i.string();continue;case 2:if(18!==t)break;n.targetUrl=i.string();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({target:x(t.target)?globalThis.String(t.target):"",targetUrl:x(t.targetUrl)?globalThis.String(t.targetUrl):""}),toJSON(t){const e={};return""!==t.target&&(e.target=t.target),""!==t.targetUrl&&(e.targetUrl=t.targetUrl),e},create:t=>n.fromPartial(t??{}),fromPartial(t){const e={target:"",targetUrl:""};return e.target=t.target??"",e.targetUrl=t.targetUrl??"",e}};const r={encode(t,o=e.Writer.create()){""!==t.url&&o.uint32(26).string(t.url),void 0!==t.deviceId&&o.uint32(34).string(t.deviceId),!1!==t.firstRequest&&o.uint32(40).bool(t.firstRequest),0!==t.duration&&o.uint32(49).double(t.duration),0!==t.unknown0&&o.uint32(56).int32(t.unknown0),""!==t.language&&o.uint32(66).string(t.language),!1!==t.forceSourceLang&&o.uint32(72).bool(t.forceSourceLang),0!==t.unknown1&&o.uint32(80).int32(t.unknown1);for(const e of t.translationHelp)n.encode(e,o.uint32(90).fork()).ldelim();return""!==t.responseLanguage&&o.uint32(114).string(t.responseLanguage),0!==t.unknown2&&o.uint32(120).int32(t.unknown2),0!==t.unknown3&&o.uint32(128).int32(t.unknown3),!1!==t.bypassCache&&o.uint32(136).bool(t.bypassCache),0!==t.unknown4&&o.uint32(144).int32(t.unknown4),o},decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const r={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,unknown4:0};for(;i.pos>>3){case 3:if(26!==t)break;r.url=i.string();continue;case 4:if(34!==t)break;r.deviceId=i.string();continue;case 5:if(40!==t)break;r.firstRequest=i.bool();continue;case 6:if(49!==t)break;r.duration=i.double();continue;case 7:if(56!==t)break;r.unknown0=i.int32();continue;case 8:if(66!==t)break;r.language=i.string();continue;case 9:if(72!==t)break;r.forceSourceLang=i.bool();continue;case 10:if(80!==t)break;r.unknown1=i.int32();continue;case 11:if(90!==t)break;r.translationHelp.push(n.decode(i,i.uint32()));continue;case 14:if(114!==t)break;r.responseLanguage=i.string();continue;case 15:if(120!==t)break;r.unknown2=i.int32();continue;case 16:if(128!==t)break;r.unknown3=i.int32();continue;case 17:if(136!==t)break;r.bypassCache=i.bool();continue;case 18:if(144!==t)break;r.unknown4=i.int32();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return r},fromJSON:t=>({url:x(t.url)?globalThis.String(t.url):"",deviceId:x(t.deviceId)?globalThis.String(t.deviceId):void 0,firstRequest:!!x(t.firstRequest)&&globalThis.Boolean(t.firstRequest),duration:x(t.duration)?globalThis.Number(t.duration):0,unknown0:x(t.unknown0)?globalThis.Number(t.unknown0):0,language:x(t.language)?globalThis.String(t.language):"",forceSourceLang:!!x(t.forceSourceLang)&&globalThis.Boolean(t.forceSourceLang),unknown1:x(t.unknown1)?globalThis.Number(t.unknown1):0,translationHelp:globalThis.Array.isArray(t?.translationHelp)?t.translationHelp.map((t=>n.fromJSON(t))):[],responseLanguage:x(t.responseLanguage)?globalThis.String(t.responseLanguage):"",unknown2:x(t.unknown2)?globalThis.Number(t.unknown2):0,unknown3:x(t.unknown3)?globalThis.Number(t.unknown3):0,bypassCache:!!x(t.bypassCache)&&globalThis.Boolean(t.bypassCache),unknown4:x(t.unknown4)?globalThis.Number(t.unknown4):0}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),void 0!==t.deviceId&&(e.deviceId=t.deviceId),!1!==t.firstRequest&&(e.firstRequest=t.firstRequest),0!==t.duration&&(e.duration=t.duration),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.language&&(e.language=t.language),!1!==t.forceSourceLang&&(e.forceSourceLang=t.forceSourceLang),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),t.translationHelp?.length&&(e.translationHelp=t.translationHelp.map((t=>n.toJSON(t)))),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),0!==t.unknown3&&(e.unknown3=Math.round(t.unknown3)),!1!==t.bypassCache&&(e.bypassCache=t.bypassCache),0!==t.unknown4&&(e.unknown4=Math.round(t.unknown4)),e},create:t=>r.fromPartial(t??{}),fromPartial(t){const e={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,unknown4:0};return e.url=t.url??"",e.deviceId=t.deviceId??void 0,e.firstRequest=t.firstRequest??!1,e.duration=t.duration??0,e.unknown0=t.unknown0??0,e.language=t.language??"",e.forceSourceLang=t.forceSourceLang??!1,e.unknown1=t.unknown1??0,e.translationHelp=t.translationHelp?.map((t=>n.fromPartial(t)))||[],e.responseLanguage=t.responseLanguage??"",e.unknown2=t.unknown2??0,e.unknown3=t.unknown3??0,e.bypassCache=t.bypassCache??!1,e.unknown4=t.unknown4??0,e}};const s={encode:(t,o=e.Writer.create())=>(void 0!==t.url&&o.uint32(10).string(t.url),void 0!==t.duration&&o.uint32(17).double(t.duration),0!==t.status&&o.uint32(32).int32(t.status),void 0!==t.remainingTime&&o.uint32(40).int32(t.remainingTime),void 0!==t.unknown0&&o.uint32(48).int32(t.unknown0),""!==t.translationId&&o.uint32(58).string(t.translationId),void 0!==t.language&&o.uint32(66).string(t.language),void 0!==t.message&&o.uint32(74).string(t.message),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};for(;i.pos>>3){case 1:if(10!==t)break;n.url=i.string();continue;case 2:if(17!==t)break;n.duration=i.double();continue;case 4:if(32!==t)break;n.status=i.int32();continue;case 5:if(40!==t)break;n.remainingTime=i.int32();continue;case 6:if(48!==t)break;n.unknown0=i.int32();continue;case 7:if(58!==t)break;n.translationId=i.string();continue;case 8:if(66!==t)break;n.language=i.string();continue;case 9:if(74!==t)break;n.message=i.string();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({url:x(t.url)?globalThis.String(t.url):void 0,duration:x(t.duration)?globalThis.Number(t.duration):void 0,status:x(t.status)?globalThis.Number(t.status):0,remainingTime:x(t.remainingTime)?globalThis.Number(t.remainingTime):void 0,unknown0:x(t.unknown0)?globalThis.Number(t.unknown0):void 0,translationId:x(t.translationId)?globalThis.String(t.translationId):"",language:x(t.language)?globalThis.String(t.language):void 0,message:x(t.message)?globalThis.String(t.message):void 0}),toJSON(t){const e={};return void 0!==t.url&&(e.url=t.url),void 0!==t.duration&&(e.duration=t.duration),0!==t.status&&(e.status=Math.round(t.status)),void 0!==t.remainingTime&&(e.remainingTime=Math.round(t.remainingTime)),void 0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translationId&&(e.translationId=t.translationId),void 0!==t.language&&(e.language=t.language),void 0!==t.message&&(e.message=t.message),e},create:t=>s.fromPartial(t??{}),fromPartial(t){const e={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};return e.url=t.url??void 0,e.duration=t.duration??void 0,e.status=t.status??0,e.remainingTime=t.remainingTime??void 0,e.unknown0=t.unknown0??void 0,e.translationId=t.translationId??"",e.language=t.language??void 0,e.message=t.message??void 0,e}};function l(){return{audioFile:new Uint8Array(0),message:""}}const d={encode:(t,o=e.Writer.create())=>(0!==t.audioFile.length&&o.uint32(18).bytes(t.audioFile),""!==t.message&&o.uint32(10).string(t.message),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n=l();for(;i.pos>>3){case 2:if(18!==t)break;n.audioFile=i.bytes();continue;case 1:if(10!==t)break;n.message=i.string();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({audioFile:x(t.audioFile)?w(t.audioFile):new Uint8Array(0),message:x(t.message)?globalThis.String(t.message):""}),toJSON(t){const e={};return 0!==t.audioFile.length&&(e.audioFile=function(t){if(globalThis.Buffer)return globalThis.Buffer.from(t).toString("base64");{const e=[];return t.forEach((t=>{e.push(globalThis.String.fromCharCode(t))})),globalThis.btoa(e.join(""))}}(t.audioFile)),""!==t.message&&(e.message=t.message),e},create:t=>d.fromPartial(t??{}),fromPartial(t){const e=l();return e.audioFile=t.audioFile??new Uint8Array(0),e.message=t.message??"",e}};const u={encode:(t,o=e.Writer.create())=>(""!==t.translationId&&o.uint32(10).string(t.translationId),""!==t.url&&o.uint32(18).string(t.url),void 0!==t.audioInfo&&d.encode(t.audioInfo,o.uint32(50).fork()).ldelim(),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={translationId:"",url:"",audioInfo:void 0};for(;i.pos>>3){case 1:if(10!==t)break;n.translationId=i.string();continue;case 2:if(18!==t)break;n.url=i.string();continue;case 6:if(50!==t)break;n.audioInfo=d.decode(i,i.uint32());continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({translationId:x(t.translationId)?globalThis.String(t.translationId):"",url:x(t.url)?globalThis.String(t.url):"",audioInfo:x(t.audioInfo)?d.fromJSON(t.audioInfo):void 0}),toJSON(t){const e={};return""!==t.translationId&&(e.translationId=t.translationId),""!==t.url&&(e.url=t.url),void 0!==t.audioInfo&&(e.audioInfo=d.toJSON(t.audioInfo)),e},create:t=>u.fromPartial(t??{}),fromPartial(t){const e={translationId:"",url:"",audioInfo:void 0};return e.translationId=t.translationId??"",e.url=t.url??"",e.audioInfo=void 0!==t.audioInfo&&null!==t.audioInfo?d.fromPartial(t.audioInfo):void 0,e}};const c={encode:(t,o=e.Writer.create())=>(""!==t.language&&o.uint32(10).string(t.language),""!==t.url&&o.uint32(18).string(t.url),0!==t.unknown0&&o.uint32(24).int32(t.unknown0),""!==t.translatedLanguage&&o.uint32(34).string(t.translatedLanguage),""!==t.translatedUrl&&o.uint32(42).string(t.translatedUrl),0!==t.unknown1&&o.uint32(48).int32(t.unknown1),0!==t.unknown2&&o.uint32(56).int32(t.unknown2),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};for(;i.pos>>3){case 1:if(10!==t)break;n.language=i.string();continue;case 2:if(18!==t)break;n.url=i.string();continue;case 3:if(24!==t)break;n.unknown0=i.int32();continue;case 4:if(34!==t)break;n.translatedLanguage=i.string();continue;case 5:if(42!==t)break;n.translatedUrl=i.string();continue;case 6:if(48!==t)break;n.unknown1=i.int32();continue;case 7:if(56!==t)break;n.unknown2=i.int32();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({language:x(t.language)?globalThis.String(t.language):"",url:x(t.url)?globalThis.String(t.url):"",unknown0:x(t.unknown0)?globalThis.Number(t.unknown0):0,translatedLanguage:x(t.translatedLanguage)?globalThis.String(t.translatedLanguage):"",translatedUrl:x(t.translatedUrl)?globalThis.String(t.translatedUrl):"",unknown1:x(t.unknown1)?globalThis.Number(t.unknown1):0,unknown2:x(t.unknown2)?globalThis.Number(t.unknown2):0}),toJSON(t){const e={};return""!==t.language&&(e.language=t.language),""!==t.url&&(e.url=t.url),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translatedLanguage&&(e.translatedLanguage=t.translatedLanguage),""!==t.translatedUrl&&(e.translatedUrl=t.translatedUrl),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),e},create:t=>c.fromPartial(t??{}),fromPartial(t){const e={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};return e.language=t.language??"",e.url=t.url??"",e.unknown0=t.unknown0??0,e.translatedLanguage=t.translatedLanguage??"",e.translatedUrl=t.translatedUrl??"",e.unknown1=t.unknown1??0,e.unknown2=t.unknown2??0,e}};const h={encode:(t,o=e.Writer.create())=>(""!==t.url&&o.uint32(10).string(t.url),""!==t.language&&o.uint32(18).string(t.language),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={url:"",language:""};for(;i.pos>>3){case 1:if(10!==t)break;n.url=i.string();continue;case 2:if(18!==t)break;n.language=i.string();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({url:x(t.url)?globalThis.String(t.url):"",language:x(t.language)?globalThis.String(t.language):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),e},create:t=>h.fromPartial(t??{}),fromPartial(t){const e={url:"",language:""};return e.url=t.url??"",e.language=t.language??"",e}};const p={encode(t,o=e.Writer.create()){!1!==t.waiting&&o.uint32(8).bool(t.waiting);for(const e of t.subtitles)c.encode(e,o.uint32(18).fork()).ldelim();return o},decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={waiting:!1,subtitles:[]};for(;i.pos>>3){case 1:if(8!==t)break;n.waiting=i.bool();continue;case 2:if(18!==t)break;n.subtitles.push(c.decode(i,i.uint32()));continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({waiting:!!x(t.waiting)&&globalThis.Boolean(t.waiting),subtitles:globalThis.Array.isArray(t?.subtitles)?t.subtitles.map((t=>c.fromJSON(t))):[]}),toJSON(t){const e={};return!1!==t.waiting&&(e.waiting=t.waiting),t.subtitles?.length&&(e.subtitles=t.subtitles.map((t=>c.toJSON(t)))),e},create:t=>p.fromPartial(t??{}),fromPartial(t){const e={waiting:!1,subtitles:[]};return e.waiting=t.waiting??!1,e.subtitles=t.subtitles?.map((t=>c.fromPartial(t)))||[],e}};const g={encode:(t,o=e.Writer.create())=>(""!==t.url&&o.uint32(10).string(t.url),""!==t.timestamp&&o.uint32(18).string(t.timestamp),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={url:"",timestamp:""};for(;i.pos>>3){case 1:if(10!==t)break;n.url=i.string();continue;case 2:if(18!==t)break;n.timestamp=i.string();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({url:x(t.url)?globalThis.String(t.url):"",timestamp:x(t.timestamp)?globalThis.String(t.timestamp):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.timestamp&&(e.timestamp=t.timestamp),e},create:t=>g.fromPartial(t??{}),fromPartial(t){const e={url:"",timestamp:""};return e.url=t.url??"",e.timestamp=t.timestamp??"",e}};const m={encode:(t,o=e.Writer.create())=>(""!==t.url&&o.uint32(10).string(t.url),""!==t.language&&o.uint32(18).string(t.language),""!==t.responseLanguage&&o.uint32(26).string(t.responseLanguage),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={url:"",language:"",responseLanguage:""};for(;i.pos>>3){case 1:if(10!==t)break;n.url=i.string();continue;case 2:if(18!==t)break;n.language=i.string();continue;case 3:if(26!==t)break;n.responseLanguage=i.string();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({url:x(t.url)?globalThis.String(t.url):"",language:x(t.language)?globalThis.String(t.language):"",responseLanguage:x(t.responseLanguage)?globalThis.String(t.responseLanguage):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),e},create:t=>m.fromPartial(t??{}),fromPartial(t){const e={url:"",language:"",responseLanguage:""};return e.url=t.url??"",e.language=t.language??"",e.responseLanguage=t.responseLanguage??"",e}};const v={encode:(t,o=e.Writer.create())=>(0!==t.interval&&o.uint32(8).int32(t.interval),void 0!==t.translatedInfo&&g.encode(t.translatedInfo,o.uint32(18).fork()).ldelim(),void 0!==t.pingId&&o.uint32(24).int32(t.pingId),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={interval:0,translatedInfo:void 0,pingId:void 0};for(;i.pos>>3){case 1:if(8!==t)break;n.interval=i.int32();continue;case 2:if(18!==t)break;n.translatedInfo=g.decode(i,i.uint32());continue;case 3:if(24!==t)break;n.pingId=i.int32();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({interval:x(t.interval)?a(t.interval):0,translatedInfo:x(t.translatedInfo)?g.fromJSON(t.translatedInfo):void 0,pingId:x(t.pingId)?globalThis.Number(t.pingId):void 0}),toJSON(t){const e={};return 0!==t.interval&&(e.interval=function(t){switch(t){case i.NO_CONNECTION:return"NO_CONNECTION";case i.TRANSLATING:return"TRANSLATING";case i.STREAMING:return"STREAMING";case i.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.interval)),void 0!==t.translatedInfo&&(e.translatedInfo=g.toJSON(t.translatedInfo)),void 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>v.fromPartial(t??{}),fromPartial(t){const e={interval:0,translatedInfo:void 0,pingId:void 0};return e.interval=t.interval??0,e.translatedInfo=void 0!==t.translatedInfo&&null!==t.translatedInfo?g.fromPartial(t.translatedInfo):void 0,e.pingId=t.pingId??void 0,e}};const f={encode:(t,o=e.Writer.create())=>(0!==t.pingId&&o.uint32(8).int32(t.pingId),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={pingId:0};for(;i.pos>>3){case 1:if(8!==t)break;n.pingId=i.int32();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({pingId:x(t.pingId)?globalThis.Number(t.pingId):0}),toJSON(t){const e={};return 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>f.fromPartial(t??{}),fromPartial(t){const e={pingId:0};return e.pingId=t.pingId??0,e}};const b={encode:(t,o=e.Writer.create())=>(""!==t.uuid&&o.uint32(10).string(t.uuid),""!==t.module&&o.uint32(18).string(t.module),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={uuid:"",module:""};for(;i.pos>>3){case 1:if(10!==t)break;n.uuid=i.string();continue;case 2:if(18!==t)break;n.module=i.string();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({uuid:x(t.uuid)?globalThis.String(t.uuid):"",module:x(t.module)?globalThis.String(t.module):""}),toJSON(t){const e={};return""!==t.uuid&&(e.uuid=t.uuid),""!==t.module&&(e.module=t.module),e},create:t=>b.fromPartial(t??{}),fromPartial(t){const e={uuid:"",module:""};return e.uuid=t.uuid??"",e.module=t.module??"",e}};const y={encode:(t,o=e.Writer.create())=>(""!==t.secretKey&&o.uint32(10).string(t.secretKey),0!==t.expires&&o.uint32(16).int32(t.expires),o),decode(t,o){const i=t instanceof e.Reader?t:e.Reader.create(t);let a=void 0===o?i.len:i.pos+o;const n={secretKey:"",expires:0};for(;i.pos>>3){case 1:if(10!==t)break;n.secretKey=i.string();continue;case 2:if(16!==t)break;n.expires=i.int32();continue}if(4==(7&t)||0===t)break;i.skipType(7&t)}return n},fromJSON:t=>({secretKey:x(t.secretKey)?globalThis.String(t.secretKey):"",expires:x(t.expires)?globalThis.Number(t.expires):0}),toJSON(t){const e={};return""!==t.secretKey&&(e.secretKey=t.secretKey),0!==t.expires&&(e.expires=Math.round(t.expires)),e},create:t=>y.fromPartial(t??{}),fromPartial(t){const e={secretKey:"",expires:0};return e.secretKey=t.secretKey??"",e.expires=t.expires??0,e}};function w(t){if(globalThis.Buffer)return Uint8Array.from(globalThis.Buffer.from(t,"base64"));{const e=globalThis.atob(t),o=new Uint8Array(e.length);for(let t=0;tr.encode({url:t,firstRequest:!0,duration:e,unknown0:1,language:o,forceSourceLang:!1,unknown1:0,translationHelp:a||[],responseLanguage:i,unknown2:0,unknown3:1,bypassCache:!1,unknown4:1}).finish(),decodeTranslationResponse:t=>s.decode(new Uint8Array(t)),encodeTranslationAudioRequest:(t,e)=>u.encode({url:t,translationId:e,audioInfo:{audioFile:new Uint8Array(0),message:T.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME}}).finish(),decodeTranslationAudioResponse:t=>s.decode(new Uint8Array(t)),encodeSubtitlesRequest:(t,e)=>h.encode({url:t,language:e}).finish(),decodeSubtitlesResponse:t=>p.decode(new Uint8Array(t)),encodeStreamPingRequest:t=>f.encode({pingId:t}).finish(),encodeStreamRequest:(t,e,o)=>m.encode({url:t,language:e,responseLanguage:o}).finish(),decodeStreamResponse:t=>v.decode(new Uint8Array(t)),encodeYandexSessionRequest:(t,e)=>b.encode({uuid:t,module:e}).finish(),decodeYandexSessionResponse:t=>y.decode(new Uint8Array(t))},P={host:"api.browser.yandex.ru",hostVOT:"vot-api.toil.cc/v1",mediaProxy:"media-proxy.toil.cc",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 YaBrowser/24.10.0.0 Safari/537.36",componentVersion:"24.10.1.598",hmac:"bt8xH3VOlb4mqf0nqAibnDOoiPlXsisf",defaultDuration:343,loggerLevel:1,version:"1.3.8"};var L;!function(t){t[t.DEBUG=0]="DEBUG",t[t.INFO=1]="INFO",t[t.WARN=2]="WARN",t[t.ERROR=3]="ERROR",t[t.SILENCE=4]="SILENCE"}(L||(L={}));class A{static prefix=`[vot.js v${P.version}]`;static canLog(t){return P.loggerLevel<=t}static log(...t){A.canLog(L.DEBUG)&&console.log(A.prefix,...t)}static info(...t){A.canLog(L.INFO)&&console.info(A.prefix,...t)}static warn(...t){A.canLog(L.WARN)&&console.warn(A.prefix,...t)}static error(...t){A.canLog(L.ERROR)&&console.error(A.prefix,...t)}}const I=new TextEncoder;async function _(t,e,o){const i=await crypto.subtle.importKey("raw",I.encode(e),{name:"HMAC",hash:{name:t}},!1,["sign","verify"]);return await crypto.subtle.sign("HMAC",i,o)}async function V(t){const e=await _("SHA-256",P.hmac,t);return new Uint8Array(e).reduce(((t,e)=>t+e.toString(16).padStart(2,"0")),"")}const O={afr:"af",aka:"ak",alb:"sq",amh:"am",ara:"ar",arm:"hy",asm:"as",aym:"ay",aze:"az",baq:"eu",bel:"be",ben:"bn",bos:"bs",bul:"bg",bur:"my",cat:"ca",chi:"zh",cos:"co",cze:"cs",dan:"da",div:"dv",dut:"nl",eng:"en",epo:"eo",est:"et",ewe:"ee",fin:"fi",fre:"fr",fry:"fy",geo:"ka",ger:"de",gla:"gd",gle:"ga",glg:"gl",gre:"el",grn:"gn",guj:"gu",hat:"ht",hau:"ha",hin:"hi",hrv:"hr",hun:"hu",ibo:"ig",ice:"is",ind:"id",ita:"it",jav:"jv",jpn:"ja",kan:"kn",kaz:"kk",khm:"km",kin:"rw",kir:"ky",kor:"ko",kur:"ku",lao:"lo",lat:"la",lav:"lv",lin:"ln",lit:"lt",ltz:"lb",lug:"lg",mac:"mk",mal:"ml",mao:"mi",mar:"mr",may:"ms",mlg:"mg",mlt:"mt",mon:"mn",nep:"ne",nor:"no",nya:"ny",ori:"or",orm:"om",pan:"pa",per:"fa",pol:"pl",por:"pt",pus:"ps",que:"qu",rum:"ro",rus:"ru",san:"sa",sin:"si",slo:"sk",slv:"sl",smo:"sm",sna:"sn",snd:"sd",som:"so",sot:"st",spa:"es",srp:"sr",sun:"su",swa:"sw",swe:"sv",tam:"ta",tat:"tt",tel:"te",tgk:"tg",tha:"th",tir:"ti",tso:"ts",tuk:"tk",tur:"tr",uig:"ug",ukr:"uk",urd:"ur",uzb:"uz",vie:"vi",wel:"cy",xho:"xh",yid:"yi",yor:"yo",zul:"zu"};async function M(t,e={headers:{"User-Agent":P.userAgent}}){const{timeout:o=3e3,...i}=e,a=new AbortController,n=setTimeout((()=>a.abort()),o),r=await fetch(t,{signal:a.signal,...i});return clearTimeout(n),r}function E(t){return 3===t.length?O[t]:t.toLowerCase().split(/[_;-]/)[0].trim()}function B(t,e="mp4"){return`https://${P.mediaProxy}/v1/proxy/video.${e}?url=${encodeURIComponent(t.href)}&origin=${t.origin}&referer=${t.origin}`}const N=[{additionalData:"mobile",host:S.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:"shorts-video #player"},{additionalData:"mobile",host:S.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:".player-container"},{host:S.youtube,url:"https://youtu.be/",match:/^(www.)?youtube(-nocookie|kids)?.com$/,selector:".html5-video-container:not(#inline-player *)"},{host:S.invidious,url:"https://youtu.be/",match:["yewtu.be","yt.artemislena.eu","invidious.flokinet.to","iv.melmac.space","inv.nadeko.net","inv.tux.pizza","invidious.private.coffee","yt.drgnz.club","vid.puffyan.us","invidious.dhusch.de"],selector:"#player",needBypassCSP:!0},{host:S.piped,url:"https://youtu.be/",match:["piped.video","piped.tokhmi.xyz","piped.moomoo.me","piped.syncpundit.io","piped.mha.fi","watch.whatever.social","piped.garudalinux.org","efy.piped.pages.dev","watch.leptons.xyz","piped.lunar.icu","yt.dc09.ru","piped.mint.lgbt","il.ax","piped.privacy.com.de","piped.esmailelbob.xyz","piped.projectsegfau.lt","piped.in.projectsegfau.lt","piped.us.projectsegfau.lt","piped.privacydev.net","piped.palveluntarjoaja.eu","piped.smnz.de","piped.adminforge.de","piped.qdi.fi","piped.hostux.net","piped.chauvet.pro","piped.jotoma.de","piped.pfcd.me","piped.frontendfriendly.xyz"],selector:".shaka-video-container",needBypassCSP:!0},{host:S.poketube,url:"https://youtu.be/",match:["poketube.fun","pt.sudovanilla.org","poke.ggtyler.dev","poke.uk2.littlekai.co.uk","poke.blahai.gay"],selector:".video-player-container"},{host:S.ricktube,url:"https://youtu.be/",match:["ricktube.ru"],selector:"#oframeplayer > pjsdiv:has(video)"},{additionalData:"mobile",host:S.vk,url:"https://vk.com/video?z=",match:/^m.vk.(com|ru)$/,selector:"vk-video-player",shadowRoot:!0},{additionalData:"clips",host:S.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:'div[data-testid="clipcontainer-video"]'},{host:S.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:".videoplayer_media"},{host:S.nine_gag,url:"https://9gag.com/gag/",match:/^9gag.com$/,selector:".video-post"},{host:S.twitch,url:"https://twitch.tv/",match:[/^m.twitch.tv$/,/^(www.)?twitch.tv$/,/^clips.twitch.tv$/,/^player.twitch.tv$/],selector:".video-ref, main > div > section > div > div > div"},{host:S.proxitok,url:"https://www.tiktok.com/",match:["proxitok.pabloferreiro.es","proxitok.pussthecat.org","tok.habedieeh.re","proxitok.esmailelbob.xyz","proxitok.privacydev.net","tok.artemislena.eu","tok.adminforge.de","tt.vern.cc","cringe.whatever.social","proxitok.lunar.icu","proxitok.privacy.com.de"],selector:".column.has-text-centered"},{host:S.tiktok,url:"https://www.tiktok.com/",match:/^(www.)?tiktok.com$/,selector:null},{host:S.vimeo,url:"https://vimeo.com/",match:/^vimeo.com$/,needExtraData:!0,selector:".player"},{host:S.vimeo,url:"https://player.vimeo.com/",match:/^player.vimeo.com$/,additionalData:"embed",needExtraData:!0,needBypassCSP:!0,selector:".player"},{host:S.xvideos,url:"https://www.xvideos.com/",match:/^(www.)?(xvideos|xv-ru).com$/,selector:".video-bg-pic",needBypassCSP:!0},{host:S.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:/^[a-z]+.pornhub.com$/,selector:".mainPlayerDiv > .video-element-wrapper-js > div",eventSelector:".mgp_eventCatcher"},{additionalData:"embed",host:S.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:t=>t.host.includes("pornhub.com")&&t.pathname.startsWith("/embed/"),selector:"#player"},{host:S.twitter,url:"https://twitter.com/i/status/",match:/^(twitter|x).com$/,selector:'div[data-testid="videoComponent"] > div:nth-child(1) > div',eventSelector:'div[data-testid="videoPlayer"]',needBypassCSP:!0},{host:S.rumble,url:"https://rumble.com/",match:/^rumble.com$/,selector:"#videoPlayer > .videoPlayer-Rumble-cls > div"},{host:S.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/videos/"),selector:'div[role="main"] div[data-pagelet$="video" i]',needBypassCSP:!0},{additionalData:"reels",host:S.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/reel/"),selector:'div[role="main"]',needBypassCSP:!0},{host:S.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:".video-player > div > div > div:nth-child(2)"},{additionalData:"embed",host:S.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:"#app > div > div"},{host:S.bilibili,url:"https://www.bilibili.com/",match:/^(www|m|player).bilibili.com$/,selector:".bpx-player-video-wrap"},{additionalData:"old",host:S.bilibili,url:"https://www.bilibili.com/",match:/^(www|m).bilibili.com$/,selector:null},{host:S.mailru,url:"https://my.mail.ru/",match:/^my.mail.ru$/,selector:"#b-video-wrapper"},{host:S.bitchute,url:"https://www.bitchute.com/video/",match:/^(www.)?bitchute.com$/,selector:".video-js"},{host:S.eporner,url:"https://www.eporner.com/",match:/^(www.)?eporner.com$/,selector:".vjs-v7"},{host:S.peertube,url:"stub",match:["peertube.1312.media","tube.shanti.cafe","bee-tube.fr","video.sadmin.io","dalek.zone","review.peertube.biz","peervideo.club","tube.la-dina.net","peertube.tmp.rcp.tf","peertube.su","video.blender.org","videos.viorsan.com","tube-sciences-technologies.apps.education.fr","tube-numerique-educatif.apps.education.fr","tube-arts-lettres-sciences-humaines.apps.education.fr","beetoons.tv","comics.peertube.biz","makertube.net"],selector:".vjs-v7"},{host:S.dailymotion,url:"https://dai.ly/",match:/^geo([\d]+)?.dailymotion.com$/,selector:".player"},{host:S.trovo,url:"https://trovo.live/s/",match:/^trovo.live$/,selector:".player-video"},{host:S.yandexdisk,url:"https://yadi.sk/",match:/^disk.yandex.ru$/,selector:".video-player__player > div:nth-child(1)",eventSelector:".video-player__player",needBypassCSP:!0,needExtraData:!0},{host:S.okru,url:"https://ok.ru/video/",match:/^ok.ru$/,selector:".html5-vpl_vid"},{host:S.googledrive,url:"https://drive.google.com/file/d/",match:/^youtube.googleapis.com$/,selector:".html5-video-container"},{host:S.bannedvideo,url:"https://madmaxworld.tv/watch?id=",match:/^(www.)?banned.video|madmaxworld.tv$/,selector:".vjs-v7",needExtraData:!0},{host:S.weverse,url:"https://weverse.io/",match:/^weverse.io$/,selector:".webplayer-internal-source-wrapper",needExtraData:!0},{host:S.newgrounds,url:"https://www.newgrounds.com/",match:/^(www.)?newgrounds.com$/,selector:".ng-video-player"},{host:S.egghead,url:"https://egghead.io/",match:/^egghead.io$/,selector:".cueplayer-react-video-holder"},{host:S.youku,url:"https://v.youku.com/",match:/^v.youku.com$/,selector:"#ykPlayer"},{host:S.archive,url:"https://archive.org/details/",match:/^archive.org$/,selector:".jw-media"},{host:S.kodik,url:"stub",match:/^kodik.(info|biz|cc)$/,selector:".fp-player",needExtraData:!0},{host:S.patreon,url:"stub",match:/^(www.)?patreon.com$/,selector:'div[data-tag="post-card"] div[elevation="subtle"] > div > div > div > div',needExtraData:!0},{host:S.reddit,url:"stub",match:/^(www.|new.|old.)?reddit.com$/,selector:".reddit-video-player-root",needExtraData:!0,needBypassCSP:!0},{host:S.kick,url:"https://kick.com/",match:/^kick.com$/,selector:"#injected-embedded-channel-player-video > div",needExtraData:!0},{host:S.appledeveloper,url:"https://developer.apple.com/",match:/^developer.apple.com$/,selector:".developer-video-player",needExtraData:!0,needBypassCSP:!0},{host:S.epicgames,url:"https://dev.epicgames.com/community/learning/",match:/^dev.epicgames.com$/,selector:".vjs-v7",needExtraData:!0},{host:S.nineanimetv,url:"https://9animetv.to/watch/",match:/^rapid-cloud.co$/,selector:".jw-media",needExtraData:!0},{host:S.odysee,url:"stub",match:/^odysee.com$/,selector:".vjs-v7",needExtraData:!0},{host:S.coursehunterLike,url:"stub",match:["coursehunter.net","coursetrain.net"],selector:"#oframeplayer > pjsdiv:has(video)",needExtraData:!0},{host:S.sap,url:"https://learning.sap.com/courses/",match:/^learning.sap.com$/,selector:".playkit-container",eventSelector:".playkit-player",needExtraData:!0,needBypassCSP:!0},{host:S.udemy,url:"https://www.udemy.com/",match:/udemy.com$/,selector:'div[data-purpose="curriculum-item-viewer-content"] > section > div > div > div > div:nth-of-type(2)',needExtraData:!0},{host:S.coursera,url:"https://www.coursera.org/",match:/coursera.org$/,selector:".vjs-v8",needExtraData:!0},{host:S.watchpornto,url:"https://watchporn.to/",match:/^watchporn.to$/,selector:".fp-player"},{host:S.linkedin,url:"https://www.linkedin.com/learning/",match:/^(www.)?linkedin.com$/,selector:".vjs-v7",needExtraData:!0,needBypassCSP:!0},{host:S.incestflix,url:"https://www.incestflix.net/watch/",match:/^(www.)?incestflix.(net|to|com)$/,selector:"#incflix-stream",needExtraData:!0},{host:S.porntn,url:"https://porntn.com/videos/",match:/^porntn.com$/,selector:null,needExtraData:!0},{host:S.custom,url:"stub",match:t=>/([^.]+).(mp4|webm)/.test(t.pathname),rawResult:!0}],R=JSON.parse('{"__version__":5,"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","unSupportedExtensionError":"Error! {0} is not supported by this version of the extension!\\n\\nPlease use the cloudflare version of the VOT extension.","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","grantPermissionToAutoPlay":"Grant permission to autoplay","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Do not translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTAudioProxy":"Proxy received audio","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTLiveNotSupported":"Translation of live streams is not supported","VOTPremiere":"Wait for the premiere to end before translating","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"udemyModuleArgsNotFound":"Could not get udemy module data due to the fact that ModuleArgs was not found","VOTTranslationHelpNull":"Could not get the data required for the translate","streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTTranslationService":"Translation Service","VOTDetectService":"Detect Service","VOTTranslatingError":"Translating the error","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site","VOTOnlyBypassMediaCSP":"Use it only for bypassing Media CSP","VOTNewAudioPlayer":"Use the new audio player"}'),$={log:(...t)=>{}},D="media-proxy.toil.cc/v1/proxy/m3u8",F="vot-worker.toil.cc",q="https://vot.toil.cc/v1",U=.15,H="yandex",z="yandex",W={yandex:"https://translate.toil.cc/detect",rustServer:"https://rust-server-531j.onrender.com/detect"},j={yandex:"https://translate.toil.cc/translate",deepl:"https://translate-deepl.toil.cc/translate"},G=["Violentmonkey","FireMonkey","Greasemonkey","AdGuard","OrangeMonkey"],Y=new class{constructor(){this.gmSupport="function"==typeof GM_getValue,$.log(`GM Storage Status: ${this.gmSupport}`)}syncGet(t,e=void 0){if(this.gmSupport)return GM_getValue(t,e);const o="number"==typeof e;const i=window.localStorage.getItem(t)??e;return o?Number(i):i}async get(t,e=void 0){if(this.gmSupport)return await GM_getValue(t,e);const o="number"==typeof e;return Promise.resolve(this.syncGet(t,e,o))}syncSet(t,e){return this.gmSupport?GM_setValue(t,e):window.localStorage.setItem(t,e)}async set(t,e){return this.gmSupport?await GM_setValue(t,e):Promise.resolve(this.syncSet(t,e))}syncDelete(t){return this.gmSupport?GM_deleteValue(t):window.localStorage.removeItem(t)}async delete(t){return this.gmSupport?await GM_deleteValue(t):Promise.resolve(this.syncDelete(t))}syncList(){return this.gmSupport?GM_listValues():["autoTranslate","dontTranslateLanguage","dontTranslateYourLang","autoSetVolumeYandexStyle","autoVolume","buttonPos","showVideoSlider","syncVolume","subtitlesMaxLength","highlightWords","responseLanguage","defaultVolume","audioProxy","showPiPButton","translateAPIErrors","translationService","detectService","m3u8ProxyHost","translateProxyEnabled","hotkeyButton","proxyWorkerHost","audioBooster","locale-version","locale-lang","locale-phrases"]}async list(){return this.gmSupport?await GM_listValues():Promise.resolve(this.syncList())}},J="https://raw.githubusercontent.com/ilyhalight/voice-over-translation/master/src/localization",K=["auto","en","ru","af","am","ar","az","bg","bn","bs","ca","cs","cy","da","de","el","es","et","eu","fa","fi","fr","gl","hi","hr","hu","hy","id","it","ja","jv","kk","km","kn","ko","lo","mk","ml","mn","ms","mt","my","ne","nl","pa","pl","pt","ro","si","sk","sl","sq","sr","su","sv","sw","tr","uk","ur","uz","vi","zh","zu"],Z=new class{lang="en";locale={};gmValues=["locale-phrases","locale-lang","locale-hash","locale-updated-at","locale-lang-override"];constructor(){const t=Y.syncGet("locale-lang-override","auto");this.lang=t&&"auto"!==t?t:(navigator.language||navigator.userLanguage)?.substr(0,2)?.toLowerCase()??"en",this.setLocaleFromJsonString(Y.syncGet("locale-phrases",""))}reset(){for(let t=0;ti&&o===this.lang)return;const a=await this.checkUpdates();if(await Y.set("locale-updated-at",i),a){$.log("Updating locale...");try{const t=await nt(`${J}/locales/${this.lang}.json`);if(200!==t.status)throw t.status;const e=await t.text();await Y.set("locale-phrases",e),this.setLocaleFromJsonString(e),await Y.set("locale-hash",a),await Y.set("locale-lang",this.lang)}catch(t){console.error("[VOT] [localizationProvider] Failed to get locale, cause:",t),this.setLocaleFromJsonString(await Y.get("locale-phrases",""))}}}setLocaleFromJsonString(t){try{this.locale=JSON.parse(t)??{}}catch(t){console.error("[VOT] [localizationProvider]",t),this.locale={}}}getFromLocale(t,e){const o=e.split(".").reduce(((t,e)=>{if("object"==typeof t&&t)return t[e]}),t);return void 0===o&&console.warn("[VOT] [localizationProvider] locale",t,"doesn't contain key",e),o}getDefault(t){return this.getFromLocale(R,t)??t}get(t){return this.getFromLocale(this.locale,t)??this.getFromLocale(R,t)??t}},X=navigator.language||navigator.userLanguage,Q=X?.substr(0,2)?.toLowerCase()??"en";function tt(){return"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled}function et(){return"undefined"!=typeof Hls&&Hls?.isSupported()?new Hls({debug:!1,lowLatencyMode:!0,backBufferLength:90}):void 0}const ot=new RegExp([/(?:https?|ftp):\/\/\S+/g,/https?:\/\/\S+|www\.\S+/gm,/\b\S+\.\S+/gm,/#[^\s#]+/g,/Auto-generated by YouTube/g,/Provided to YouTube by/g,/Released on/g,/0x[a-fA-F0-9]{40}/g,/[13][a-km-zA-HJ-NP-Z1-9]{25,34}/g,/4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}/g,/Paypal/g].map((t=>t.source)).join("|"));function it(t,e){const o=URL.createObjectURL(t),i=document.createElement("a");i.href=o,i.download=e,i.click(),URL.revokeObjectURL(o)}function at(t){return 0===t.trim().length?(new Date).toLocaleDateString("en-us").replaceAll("/","-"):t.replace(/[\\/:*?"'<>|]/g,"")}async function nt(t,e={}){const{timeout:o=15e3,...i}=e,a=new AbortController,n=setTimeout((()=>a.abort()),o);try{if(t.includes("api.browser.yandex.ru"))throw new Error("Preventing yandex cors");const e=await fetch(t,{signal:a.signal,...i});return clearTimeout(n),e}catch(e){return $.log("GM_fetch preventing cors by GM_xmlhttpRequest",e.message),new Promise(((e,a)=>{clearTimeout(n),GM_xmlhttpRequest({method:i.method||"GET",url:t,responseType:"blob",...i,data:i.body,timeout:o,onload:t=>{const o=Object.fromEntries(t.responseHeaders.trim().split(/\r?\n/).map((t=>t.split(/: (.+)/))).filter((([t])=>t&&/^[\w-]+$/.test(t))));e(new Response(t.response,{status:t.status,headers:o}))},ontimeout:()=>a(new Error("Timeout")),onerror:t=>a(t),onabort:()=>a(new Error("AbortError"))})}))}}function rt(){return Math.floor(Date.now()/1e3)}class st extends Error{constructor(t){super(t),this.name="VideoHelper",this.message=t}}class lt{API_ORIGIN=window.location.origin;fetch;extraInfo;referer;origin;service;constructor({fetchFn:t=nt,extraInfo:e=!0,referer:o=document.referrer??window.location.origin+"/",origin:i=window.location.origin,service:a}={}){this.fetch=t,this.extraInfo=e,this.referer=o,this.origin=/^(http(s)?):\/\//.test(String(i))?i:window.location.origin,this.service=a}async getVideoData(t){}async getVideoId(t){}returnBaseData(t){if(this.service)return{url:this.service.url+t,videoId:t,host:this.service.host,duration:void 0}}}const dt=["auto","ru","en","zh","ko","lt","lv","ar","fr","it","es","de","ja"],ut=["ru","en","kk"],ct=["srt","vtt","json"];class ht extends Error{constructor(t){super(Z.getDefault(t)),this.name="VOTLocalizedError",this.unlocalizedMessage=t,this.localizedMessage=Z.get(t)}}const pt={[S.mailru]:class extends lt{API_ORIGIN="https://my.mail.ru";async getVideoMeta(t){try{const e=await this.fetch(`${this.API_ORIGIN}/+/video/meta/${t}?xemail=&ajax_call=1&func_name=&mna=&mnb=&ext=1&_=${(new Date).getTime()}`);return await e.json()}catch(t){return void A.error("Failed to get mail.ru video data",t.message)}}async getVideoId(t){const e=t.pathname;if(/\/(v|mail|bk|inbox)\//.exec(e))return e.slice(1);const o=/video\/embed\/([^/]+)/.exec(e)?.[1];if(!o)return;const i=await this.getVideoMeta(o);return i?i.meta.url.replace("//my.mail.ru/",""):void 0}},[S.weverse]:class extends lt{API_ORIGIN="https://global.apis.naver.com/weverse/wevweb";API_APP_ID="be4d79eb8fc7bd008ee82c8ec4ff6fd4";API_HMAC_KEY="1b9cb6378d959b45714bec49971ade22e6e24e42";HEADERS={Accept:"application/json, text/plain, */*",Origin:"https://weverse.io",Referer:"https://weverse.io/"};getURLData(){return{appId:this.API_APP_ID,language:"en",os:"WEB",platform:"WEB",wpf:"pc"}}async createHash(t){const e=Date.now(),o=t.substring(0,Math.min(255,t.length))+e,i=await async function(t,e){try{const o=I.encode(e),i=await _("SHA-1",t,o);return btoa(String.fromCharCode(...new Uint8Array(i)))}catch(t){return A.error(t),!1}}(this.API_HMAC_KEY,o);if(!i)throw new st("Failed to get weverse HMAC signature");return{wmsgpad:e.toString(),wmd:i}}async getHashURLParams(t){const e=await this.createHash(t);return new URLSearchParams(e).toString()}async getPostPreview(t){const e=`/post/v1.0/post-${t}/preview?`+new URLSearchParams({fieldSet:"postForPreview",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{headers:this.HEADERS});return await o.json()}catch(e){return A.error(`Failed to get weverse post preview by postId: ${t}`,e.message),!1}}async getVideoInKey(t){const e=`/video/v1.1/vod/${t}/inKey?`+new URLSearchParams({gcc:"RU",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{method:"POST",headers:this.HEADERS});return await o.json()}catch(e){return A.error(`Failed to get weverse InKey by videoId: ${t}`,e.message),!1}}async getVideoInfo(t,e,o){const i=Date.now();try{const a=new URLSearchParams({key:e,sid:o,nonce:i.toString(),devt:"html5_pc",prv:"N",aup:"N",stpb:"N",cpl:"en",env:"prod",lc:"en",adi:JSON.stringify([{adSystem:null}]),adu:"/"}).toString(),n=await this.fetch(`https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/${t}?`+a,{headers:this.HEADERS});return await n.json()}catch(i){return A.error(`Failed to get weverse video info (infraVideoId: ${t}, inkey: ${e}, serviceId: ${o}`,i.message),!1}}extractVideoInfo(t){return t.find((t=>!1===t.useP2P&&t.source.includes(".mp4")))}async getVideoData(t){const e=await this.getPostPreview(t);if(!e)return;const{videoId:o,serviceId:i,infraVideoId:a}=e.extension.video;if(!(o&&i&&a))return;const n=await this.getVideoInKey(o);if(!n)return;const r=await this.getVideoInfo(a,n.inKey,i);if(!r)return;const s=this.extractVideoInfo(r.videos.list);return s?{url:s.source,duration:s.duration}:void 0}async getVideoId(t){return/([^/]+)\/(live|media)\/([^/]+)/.exec(t.pathname)?.[3]}},[S.kodik]:class extends lt{API_ORIGIN=window.location.origin;async getSecureData(t){try{const e=await this.fetch(`${this.API_ORIGIN}${t}`,{headers:{"User-Agent":P.userAgent,Origin:this.API_ORIGIN,Referer:this.API_ORIGIN}}),o=await e.text(),[i,a,n]=t.split("/").filter((t=>t)),r=(new DOMParser).parseFromString(o,"text/html"),s=Array.from(r.getElementsByTagName("script")).filter((t=>t.innerHTML.includes(`videoId = "${a}"`)));if(!s.length)throw new st("Failed to find secure script");const l=/'{[^']+}'/.exec(s[0].textContent.trim())?.[0];if(!l)throw new st("Secure json wasn't found in secure script");const d=JSON.parse(l.replaceAll("'",""));return{videoType:i,videoId:a,hash:n,...d}}catch(e){return A.error(`Failed to get kodik secure data by videoPath: ${t}.`,e.message),!1}}async getFtor(t){const{videoType:e,videoId:o,hash:i,d:a,d_sign:n,pd:r,pd_sign:s,ref:l,ref_sign:d}=t;try{const t=await this.fetch(this.API_ORIGIN+"/ftor",{method:"POST",headers:{"User-Agent":P.userAgent,Origin:this.API_ORIGIN,Referer:`${this.API_ORIGIN}/${e}/${o}/${i}/360p`},body:new URLSearchParams({d:a,d_sign:n,pd:r,pd_sign:s,ref:decodeURIComponent(l),ref_sign:d,bad_user:"false",cdn_is_working:"true",info:"{}",type:e,hash:i,id:o})});return await t.json()}catch(t){return A.error(`Failed to get kodik video data (type: ${e}, id: ${o}, hash: ${i})`,t.message),!1}}decryptUrl(t){const e=atob(t.replace(/[a-zA-Z]/g,(function(t){const e=t.charCodeAt(0)+13,o=t<="Z"?90:122;return String.fromCharCode(o>=e?e:e-26)})));return"https:"+e}async getVideoData(t){const e=await this.getSecureData(t);if(!e)return;const o=await this.getFtor(e);if(!o)return;const i=Object.entries(o.links[o.default.toString()]),a=i.find((([t,e])=>"application/x-mpegURL"===e.type))?.[1];return a?{url:this.decryptUrl(a.src)}:void 0}async getVideoId(t){return/\/(seria|video)\/([^/]+)\/([^/]+)\/([\d]+)p/.exec(t.pathname)?.[0]}},[S.patreon]:class extends lt{API_ORIGIN="https://www.patreon.com/api";async getPosts(t){try{const e=await this.fetch(`${this.API_ORIGIN}/posts/${t}?json-api-use-default-includes=false`);return await e.json()}catch(e){return A.error(`Failed to get patreon posts by postId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPosts(t);if(!e)return;const o=e.data.attributes.post_file.url;return o?{url:o}:void 0}async getVideoId(t){const e=/posts\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e.replace(/[^\d.]/g,"")}},[S.reddit]:class extends lt{API_ORIGIN="https://www.reddit.com";async getVideoData(t){try{const t=document.querySelector("[data-hls-url]")?.dataset.hlsUrl.replaceAll("&","&");if(!t)throw new st("Failed to find content url");return{url:decodeURIComponent(t)}}catch(e){return void A.error(`Failed to get reddit video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/\/r\/(([^/]+)\/([^/]+)\/([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[S.bannedvideo]:class extends lt{API_ORIGIN="https://api.banned.video";async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/graphql`,{method:"POST",body:JSON.stringify({operationName:"GetVideo",query:"query GetVideo($id: String!) {\n getVideo(id: $id) {\n title\n description: summary\n duration: videoDuration\n videoUrl: directUrl\n isStream: live\n }\n }",variables:{id:t}}),headers:{"User-Agent":"bannedVideoFrontEnd","apollographql-client-name":"banned-web","apollographql-client-version":"1.3","content-type":"application/json"}});return await e.json()}catch(e){return console.error(`Failed to get bannedvideo video info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getVideoInfo(t);if(!e)return;const{videoUrl:o,duration:i,isStream:a,description:n,title:r}=e.data.getVideo;return{url:o,duration:i,isStream:a,title:r,description:n}}async getVideoId(t){return t.searchParams.get("id")??void 0}},[S.kick]:class extends lt{API_ORIGIN="https://kick.com/api";async getClipInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v2/clips/${t}`),o=await e.json(),{clip_url:i,duration:a,title:n}=o.clip;return{url:i,duration:a,title:n}}catch(e){return void A.error(`Failed to get kick clip info by clipId: ${t}.`,e.message)}}async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v1/video/${t}`),o=await e.json(),{source:i,livestream:a}=o,{session_title:n,duration:r}=a;return{url:i,duration:Math.round(r/1e3),title:n}}catch(e){return void A.error(`Failed to get kick video info by videoId: ${t}.`,e.message)}}async getVideoData(t){return t.startsWith("videos")?await this.getVideoInfo(t.replace("videos/","")):await this.getClipInfo(t.replace("clips/",""))}async getVideoId(t){return/([^/]+)\/((videos|clips)\/([^/]+))/.exec(t.pathname)?.[2]}},[S.appledeveloper]:class extends lt{API_ORIGIN="https://developer.apple.com";async getVideoData(t){try{const t=document.querySelector("meta[property='og:video']")?.content;if(!t)throw new st("Failed to find content url");return{url:t}}catch(e){return void A.error(`Failed to get apple developer video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/videos\/play\/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0]}},[S.epicgames]:class extends lt{API_ORIGIN="https://dev.epicgames.com/community/api/learning";async getPostInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/post.json?hash_id=${t}`);return await e.json()}catch(e){return A.error(`Failed to get epicgames post info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPostInfo(t);if(!e)return;const o=e.blocks.find((t=>"video"===t.type)),i=o?.video_url?.replace("qsep://","https://");if(!i)return;const{title:a,description:n}=e,r=o?.video_captions?.map((t=>({language:E(t.locale),format:"vtt",url:t.signed_url})));return{url:i,title:a,description:n,subtitles:r}}async getVideoId(t){return/\/(\w{3,5})\/[^/]+$/.exec(t.pathname)?.[1]}},[S.nineanimetv]:class extends lt{API_ORIGIN="https://9animetv.to/ajax/episode";RAPID_CLOUD_ORIGIN="https://rapid-cloud.co/ajax/embed-6-v2";async getSourceId(t){try{const e=await this.fetch(`${this.API_ORIGIN}/servers?episodeId=${t}`),o=await e.json();return!!o.html&&/data-id="(\d+)"/.exec(o.html)?.[1]}catch(e){return A.error(`Failed to get 9animetv servers info by episodeId: ${t}.`,e.message),!1}}async getPlayerLink(t){try{const e=await this.fetch(`${this.API_ORIGIN}/sources?id=${t}`),o=await e.json();return!!o.link.includes("rapid-cloud.co")&&o.link}catch(e){return A.error(`Failed to get player link by sourceId: ${t}.`,e.message),!1}}async getRapidCloudData(t){try{const e=await this.fetch(`${this.RAPID_CLOUD_ORIGIN}/getSources?id=${t}`),o=await e.json();return o.encrypted?(A.warn("Encrypted RapidCloud data found. Let us know about it",o),!1):o}catch(e){return A.error(`Failed to get rapid cloud data by rapidId: ${t}.`,e.message),!1}}async getVideoData(t){const e=t.split("?ep=")[1],o=await this.getSourceId(e);if(!o)return;const i=await this.getPlayerLink(o);if(!i)return;const a=/\/([^/?]+)\?/.exec(i)?.[1];if(!a)return;const n=await this.getRapidCloudData(a);if(!n)return;const r=n.sources.find((t=>"hls"===t.type))?.file;if(!r)return;const s=n.tracks.reduce(((t,e)=>{const o=/([\w+]+)(-\d)?\.vtt/.exec(e.file)?.[1];if(!o)return t;const i=E(3===o.length?o:e.label);return t.find((t=>t.language===i))||t.push({language:i,format:"vtt",url:e.file}),t}),[]);return{url:r,subtitles:s}}async getVideoId(t){return new Promise((t=>{const e="https://9animetv.to";window.addEventListener("message",(o=>{o.origin===e&&o.data?.startsWith("getVideoId:")&&t(o.data.replace("getVideoId:",""))})),window.top.postMessage("getVideoId",e)}))}},[S.odysee]:class extends lt{API_ORIGIN="https://odysee.com";async getVideoData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/${t}`),o=await e.text(),i=/"contentUrl":(\s)?"([^"]+)"/.exec(o)?.[2];if(!i)throw new Error("Odysee url doesn't parsed");return{url:i}}catch(e){return void A.error(`Failed to get odysee video data by video ID: ${t}`,e.message)}}async getVideoId(t){return t.pathname.slice(1)}},[S.coursehunterLike]:class extends lt{API_ORIGIN=this.origin??"https://coursehunter.net";async getCourseId(t){try{const e=await this.fetch(`${this.API_ORIGIN}/${t}`),o=await e.text();return/course_id(\s)?=(\s)?([\d]+)/.exec(o)?.[3]}catch(e){return A.error(`Failed to get CoursehunterLike courseId by videoId: ${t}, because ${e.message}`),!1}}async getLessonsData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/api/v1/course/${t}/lessons`);return await e.json()}catch(e){return A.error(`Failed to get CoursehunterLike lessons data by courseId: ${t}, because ${e.message}`),!1}}async getVideoData(t){const e=await this.getCourseId(t);if(!e)return;const o=await this.getLessonsData(e);if(!o)return;const i=+(t.split("?lesson=")?.[1]??1),a=o?.[i-1],{file:n,duration:r,title:s}=a;return n?{url:n,duration:r,title:s}:void 0}async getVideoId(t){const e=/course\/([^/]+)/.exec(t.pathname)?.[0];return e?e+t.search:void 0}},[S.twitch]:class extends lt{API_ORIGIN="https://clips.twitch.tv";async getClipLink(t,e){const o=document.querySelector("script[type='application/ld+json']"),i=t.slice(1);if(o){const t=JSON.parse(o.innerText),e=t["@graph"].find((t=>"VideoObject"===t["@type"]))?.creator.url;return`${e.replace("https://www.twitch.tv/","")}/clip/${i}`}const a="embed"===i,n=document.querySelector(a?".tw-link[data-test-selector='stream-info-card-component__stream-avatar-link']":".clips-player a:not([class])");if(!n)return;return`${n.href.replace("https://www.twitch.tv/","")}/clip/${a?e:i}`}async getVideoId(t){const e=t.pathname;if(/^m\.twitch\.tv$/.test(e))return/videos\/([^/]+)/.exec(t.href)?.[0]??e.slice(1);if(/^player\.twitch\.tv$/.test(t.hostname))return`videos/${t.searchParams.get("video")}`;const o=/([^/]+)\/(?:clip)\/([^/]+)/.exec(e);if(o)return o[0];return/^clips\.twitch\.tv$/.test(t.hostname)?await this.getClipLink(e,t.searchParams.get("clip")):/(?:videos)\/([^/]+)/.exec(e)?.[0]}},[S.sap]:class extends lt{API_ORIGIN="https://learning.sap.com/";async requestKaltura(t,e,o){try{const i=await this.fetch(`https://${t}/api_v3/service/multirequest`,{method:"POST",body:JSON.stringify({1:{service:"session",action:"startWidgetSession",widgetId:`_${e}`},2:{service:"baseEntry",action:"list",ks:"{1:result:ks}",filter:{redirectFromEntryId:o},responseProfile:{type:1,fields:"id,referenceId,name,description,dataUrl,duration,flavorParamsIds,type,dvrStatus,externalSourceType,createdAt,updatedAt,endDate,plays,views,downloadUrl,creatorId"}},3:{service:"baseEntry",action:"getPlaybackContext",entryId:"{2:result:objects:0:id}",ks:"{1:result:ks}",contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},apiVersion:"3.3.0",format:1,ks:"",clientTag:"html5:v3.17.22",partnerId:e}),headers:{"Content-Type":"application/json"}});return await i.json()}catch(t){return void A.error("Failed to request kaltura data",t.message)}}async getKalturaData(t){try{const e=/https:\/\/([^"]+)\/p\/([^"]+)\/embedPlaykitJs\/uiconf_id\/([^"]+)/.exec(document.querySelector('script[data-nscript="beforeInteractive"]')?.src);if(!e)throw new st(`Failed to get sap data for videoId: ${t}`);const[,o,i]=e;let a=document.querySelector("#shadow")?.firstChild?.getAttribute("id");if(a||(a=/"sourceId":\s?"([^"]+)"/.exec(document.querySelector("#__NEXT_DATA__")?.innerText)?.[1]),!o||Number.isNaN(+i)||!a)throw new st(`One of the necessary parameters for getting a link to a sap video in wasn't found for ${t}. Params: kalturaDomain = ${o}, partnerId = ${i}, entryId = ${a}`);return await this.requestKaltura(o,i,a)}catch(t){return void A.error("Failed to get kaltura data",t.message)}}async getVideoData(t){const e=await this.getKalturaData(t);if(!e)return;const[,o,i]=e,{duration:a}=o.objects[0],n=i.sources.find((t=>"url"===t.format&&"http,https"===t.protocols&&t.url.includes(".mp4")))?.url;if(!n)return;return{url:n,subtitles:i.playbackCaptions.map((t=>({language:E(t.languageCode),format:"vtt",url:t.webVttUrl,isAutoGenerated:t.label.includes("auto-generated")}))),duration:a}}async getVideoId(t){return/((courses|learning-journeys)\/([^/]+)(\/[^/]+)?)/.exec(t.pathname)?.[1]}},[S.udemy]:class extends lt{API_ORIGIN="https://www.udemy.com/api-2.0";getModuleData(){const t=document.querySelector(".ud-app-loader[data-module-id='course-taking']")?.dataset?.moduleArgs;return t?JSON.parse(t):(console.error(Z.get("udemyModuleArgsNotFound")),{})}getLectureId(){return/learn\/lecture\/([^/]+)/.exec(window.location.pathname)?.[1]}async getLectureData(t,e){const o=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}/lectures/${e}/?`+new URLSearchParams({"fields[lecture]":"title,description,asset","fields[asset]":"length,media_sources,captions"}));return await o.json()}async getCourseLang(t){const e=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}?`+new URLSearchParams({"fields[course]":"locale"}));return await e.json()}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>E(t.locale_id)===e));return o||(o=t?.find((t=>"en"===E(t.locale_id)))??t?.[0]),o?.url}async getVideoData(t){const{courseId:e}=this.getModuleData();if(!e)return;const o=this.getLectureId();if($.log(`[Udemy] courseId: ${e}, lectureId: ${o}`),!o)return;const{title:i,description:a,asset:n}=await this.getLectureData(e,o),{length:r,media_sources:s,captions:l}=n,d=this.findVideoUrl(s);if(!d)return void console.log("Failed to find .mp4 video file in media_sources",s);const u=await this.getCourseLang(e);let{locale:{locale:c}}=u;c=c?E(c):"en",dt.includes(c)||(c="en");const h=this.findSubtitleUrl(l,c);return h||console.log("Failed to find subtitle file in captions",l),{...h?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:h},{target:"video_file_url",targetUrl:d}],detectedLanguage:c}:{url:d,translationHelp:null},duration:r,title:i,description:a}}async getVideoId(t){return t.pathname.slice(1)}},[S.coursera]:class extends lt{API_ORIGIN="https://www.coursera.org/api";async getCourseData(t){const e=await this.fetch(`${this.API_ORIGIN}/onDemandCourses.v1/${t}`),o=await e.json();return o?.elements?.[0]}getPlayer(){return document.querySelector(".vjs-v8")}getPlayerData(){return this.getPlayer()?.player}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>E(t.srclang)===e));return o||(o=t?.find((t=>"en"===E(t.srclang)))||t?.[0]),o?.src}async getVideoData(t){const e=this.getPlayerData(),{duration:o}=e?.cache_||{},{courseId:i,tracks:a,sources:n}=e?.options_||{},r=this.findVideoUrl(n);if(!r)return void console.log("Failed to find .mp4 video file in sources",n);const{primaryLanguageCodes:s}=await this.getCourseData(i);let l=s?.[0];l=l?E(l):"en",dt.includes(l)||(l="en");const d=this.findSubtitleUrl(a,l);return d||console.log("Failed to find subtitle file in tracks",a),{...d?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:d},{target:"video_file_url",targetUrl:r}]}:{url:r,translationHelp:null},detectedLanguage:l,duration:o}}async getVideoId(t){return/learn\/([^/]+)\/lecture\/([^/]+)/.exec(t.pathname)?.[0]}},[S.linkedin]:class extends lt{API_ORIGIN="https://www.linkedin.com/learning";async getVideoData(t){try{const e=document.querySelector(".video-js");if(!e)throw new st(`Failed to find video element for videoID ${t}`);const o=(e.getAttribute("data-sources")??"[]").replaceAll(""",'"').replaceAll("&","&"),i=JSON.parse(o).find((t=>t.src.includes(".mp4")));if(!i)throw new Error(`Failed to find video url for videoID ${t}`);const a=new URL(i.src),n=e.getAttribute("data-captions-url"),r=n?[{language:"en",format:"vtt",url:n}]:void 0;return{url:B(a),subtitles:r}}catch(t){return void A.error("Failed to get linkedin video data",t.message)}}async getVideoId(t){return/\/learning\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[S.vimeo]:class extends lt{API_KEY="";DEFAULT_SITE_ORIGIN="https://vimeo.com";SITE_ORIGIN=this.isPrivatePlayer()?this.service?.url?.slice(0,-1)??this.DEFAULT_SITE_ORIGIN:this.DEFAULT_SITE_ORIGIN;isErrorData(t){return Object.hasOwn(t,"error")}isPrivatePlayer(){return this.referer&&!this.referer.includes("vimeo.com")}async getViewerData(){try{const t=await this.fetch("https://vimeo.com/_next/viewer"),e=await t.json(),{apiUrl:o,jwt:i}=e;return this.API_ORIGIN=`https://${o}`,this.API_KEY=`jwt ${i}`,e}catch(t){return A.error("Failed to get default viewer data.",t.message),!1}}async getVideoInfo(t){try{const e=new URLSearchParams({fields:"name,link,description,duration"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return A.error(`Failed to get video info by video ID: ${t}`,e.message),!1}}async getPrivateVideoSource(t){try{const{default_cdn:e,cdns:o}=t.dash,i=o[e].url,a=await this.fetch(i);if(200!==a.status)throw new st(await a.text());const n=await a.json(),r=new URL(i),s=Array.from(n.base_url.matchAll(/\.\.\//g)).length+1,l=r.pathname.split("/");let d=n.base_url.replaceAll("../","");d=d&&!d.startsWith("/")?`/${d}`:d,r.pathname=l.slice(0,l.length-s).join("/")+d,r.pathname.endsWith("/")||(r.pathname+="/");const u=n.audio.find((t=>"audio/mp4"===t.mime_type&&"dash"===t.format));if(!u)throw new st("Failed to find video data");const c=u.segments?.[0]?.url;if(!c)throw new st("Failed to find first segment url");const[h,p]=c.split("?",2),g=new URLSearchParams(p);return g.delete("range"),r.pathname+=`${u.base_url}${h}`,r.href=r.href.split("?")[0]+"?"+g.toString(),r.href}catch(t){return A.error("Failed to get private video source",t.message),!1}}async getPrivateVideoInfo(t){try{const e=await this.getPrivateVideoSource(playerConfig.request.files);if(!e)throw new st("Failed to get private video source");const{title:o,duration:i}=playerConfig.video,{text_tracks:a}=playerConfig.request;return{url:`${this.SITE_ORIGIN}/${t}`,video_url:e,title:o,duration:i,subs:a}}catch(e){return A.error(`Failed to get private video info by video ID: ${t}`,e.message),!1}}async getSubsInfo(t){try{const e=new URLSearchParams({per_page:"100",fields:"language,type,link"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}/texttracks?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return A.error(`Failed to get subtitles info by video ID: ${t}`,e.message),!1}}async getVideoData(t){const e=this.isPrivatePlayer();if(!this.extraInfo)return this.returnBaseData(t);if(e){const e=await this.getPrivateVideoInfo(t);if(!e)return;const{url:o,subs:i,video_url:a,title:n,duration:r}=e,s=i.map((t=>({language:E(t.lang),format:"vtt",url:this.SITE_ORIGIN+t.url,isAutoGenerated:t.lang.includes("autogenerated")}))),l=s.length?[{target:"video_file_url",targetUrl:a},{target:"subtitles_file_url",targetUrl:s[0].url}]:null;return{...l?{url:o,translationHelp:l}:{url:a},subtitles:s,title:n,duration:r}}t.startsWith("video/")&&(t=t.replace("video/","")),t.includes("/")&&(t=t.replace("/",":"));if(!await this.getViewerData())return this.returnBaseData(t);const o=await this.getVideoInfo(t);if(!o)return this.returnBaseData(t);const i=await this.getSubsInfo(t),a=i?i.data.map((t=>({language:E(t.language),format:"vtt",url:t.link,isAutoGenerated:t.language.includes("autogen")}))):[],{link:n,duration:r,name:s,description:l}=o;return{url:n,title:s,description:l,subtitles:a,duration:r}}async getVideoId(t){const e=/[^/]+\/[^/]+$/.exec(t.pathname)?.[0];return this.isPrivatePlayer()?e:e?.startsWith("video/")?e.replace("video/",""):e??/[^/]+$/.exec(t.pathname)?.[0]}},[S.yandexdisk]:class extends lt{API_ORIGIN="https://disk.yandex.ru";CLIENT_PREFIX="/client/disk";async getVideoData(t){if(!t.startsWith(this.CLIENT_PREFIX))return{url:this.service.url+t};const e=new URL(window.location).searchParams.get("idDialog");if(!e)return;const o=document.querySelector("#preloaded-data");if(o)try{const t=JSON.parse(o.innerText),{idClient:i,sk:a}=t.config,n=await this.fetch(this.API_ORIGIN+"/models/?_m=resource",{method:"POST",body:new URLSearchParams({idClient:i,sk:a,"_model.0":"resource","id.0":e.replaceAll(" ","+")}).toString().replaceAll(/%2B/g,"+"),headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}),r=await n.json();if(!r.models)throw new st("Failed to get resource info");const s=r.models[0].data;if(Object.hasOwn(s,"error"))throw new st(s.error?.message);const{meta:l,name:d}=s,{short_url:u,video_info:c}=l;if(!c)throw new st("There's no video open right now");if(!u)throw new st("VOTLimitedVideoAccess");return{url:u,title:d.replace(/(\.[^.]+)$/,""),duration:c.duration}}catch(e){if(e.message?.startsWith("VOT"))throw new ht(e.message);return void console.error(`Failed to get yandex disk video data by video ID: ${t}`,e.message)}}async getVideoId(t){const e=/\/i\/([^/]+)/.exec(t.pathname)?.[1];return e||(t.pathname.startsWith(this.CLIENT_PREFIX)?t.pathname+t.search:void 0)}},[S.vk]:class extends lt{async getVideoId(t){const e=/^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(t.pathname);if(e)return e[0].slice(1);const o=t.searchParams.get("z");if(o)return o.split("/")[0];const i=t.searchParams.get("oid"),a=t.searchParams.get("id");return i&&a?`video-${Math.abs(parseInt(i))}_${a}`:void 0}},[S.trovo]:class extends lt{async getVideoId(t){const e=t.searchParams.get("vid"),o=/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0];if(e&&o)return`${o}?vid=${e}`}},[S.incestflix]:class extends lt{async getVideoData(t){try{const t=document.querySelector("#incflix-stream source:first-of-type");if(!t)throw new st("Failed to find source element");const e=t.getAttribute("src"),o=new URL(e.startsWith("//")?`https:${e}`:e);return o.searchParams.append("media-proxy","video.mp4"),{url:B(o)}}catch(e){return void A.error(`Failed to get Incestflix data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[S.porntn]:class extends lt{async getVideoData(t){try{const t=document.body.innerHTML,e=/var flashvars\s=\s/,o=document.getElementsByTagName("script").find((t=>e.exec(t.textContent)));if(!o)throw new st("Failed to find data script");const i=o.textContent.split(e)?.[1]?.split(";\n",1)[0].replace(/(\t|\n)/g,"");A.log(i);const a=/video_url: 'function\/0\/([^']+)'/.exec(t)?.[1],n=/rnd: '([^']+)'/.exec(t)?.[1];if(!a||!n)throw new st("Failed to find video source or rnd");const r=/video_title: '([^']+)'/.exec(t)?.[1],s=new URL(a);return s.searchParams.append("rnd",n),A.log(s.href),{url:B(s),title:r}}catch(e){return void A.error(`Failed to get PornTN data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/videos\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}}};class gt{helpersData;constructor(t={}){this.helpersData=t}getHelper(t){return new pt[t](this.helpersData)}}class mt extends Error{constructor(t){super(t),this.name="VideoDataError",this.message=t}}async function vt(t,e,o={}){const i=new URL(window.location.href),a=t.host;if(Object.keys(pt).includes(a)){const t=new gt(o).getHelper(a);return await t.getVideoId(i)}switch(a){case S.custom:return i.href;case S.piped:case S.poketube:case S.invidious:case S.ricktube:case S.youtube:return"youtu.be"===i.hostname&&(i.search=`?v=${i.pathname.replace("/","")}`,i.pathname="/watch"),/(?:watch|embed|shorts|live)\/([^/]+)/.exec(i.pathname)?.[1]??i.searchParams.get("v");case S.nine_gag:case S.gag:return/gag\/([^/]+)/.exec(i.pathname)?.[1];case S.proxitok:case S.tiktok:return/([^/]+)\/video\/([^/]+)/.exec(i.pathname)?.[0];case S.xvideos:return/[^/]+\/[^/]+$/.exec(i.pathname)?.[0];case S.pornhub:return i.searchParams.get("viewkey")??/embed\/([^/]+)/.exec(i.pathname)?.[1];case S.twitter:return/status\/([^/]+)/.exec(i.pathname)?.[1];case S.rumble:case S.facebook:return i.pathname.slice(1);case S.rutube:return/(?:video|embed)\/([^/]+)/.exec(i.pathname)?.[1];case S.bilibili:{const t=/bangumi\/play\/([^/]+)/.exec(i.pathname)?.[0];if(t)return t;const e=i.searchParams.get("bvid");if(e)return`video/${e}`;let o=/video\/([^/]+)/.exec(i.pathname)?.[0];return o&&null!==i.searchParams.get("p")&&(o+=`/?p=${i.searchParams.get("p")}`),o}case S.bitchute:return/(video|embed)\/([^/]+)/.exec(i.pathname)?.[2];case S.eporner:return/video-([^/]+)\/([^/]+)/.exec(i.pathname)?.[0];case S.peertube:return/\/w\/([^/]+)/.exec(i.pathname)?.[0];case S.dailymotion:{const t=Array.from(document.querySelectorAll("*")).filter((t=>t.innerHTML.trim().includes(".m3u8")));let e=t?.[1]?.lastChild?.src;if(!e)return;return/\/video\/(\w+)\.m3u8/.exec(e)?.[1]}case S.okru:return/\/video\/(\d+)/.exec(i.pathname)?.[1];case S.googledrive:return i.searchParams.get("docid");case S.newgrounds:return/([^/]+)\/(view)\/([^/]+)/.exec(i.pathname)?.[0];case S.egghead:return i.pathname.slice(1);case S.youku:return/v_show\/id_[\w=]+/.exec(i.pathname)?.[0];case S.archive:return/(details|embed)\/([^/]+)/.exec(i.pathname)?.[2];case S.watchpornto:return/(video|embed)\/(\d+)(\/[^/]+\/)?/.exec(i.pathname)?.[0];default:return}}async function ft(t,e,o={}){const i=await vt(t,0,o);if(!i)throw new mt(`Entered unsupported link: "${t.host}"`);const a=window.location.origin;if([S.peertube,S.coursehunterLike].includes(t.host)&&(t.url=a),t.rawResult)return{url:i,videoId:i,host:t.host,duration:void 0};if(!t.needExtraData)return{url:t.url+i,videoId:i,host:t.host,duration:void 0};const n=new gt({...o,service:t,origin:a}).getHelper(t.host),r=await n.getVideoData(i);if(!r)throw new mt(`Failed to get video raw url for ${t.host}`);return{...r,videoId:i,host:t.host}}class bt extends Error{data;constructor(t,e=void 0){super(t),this.data=e,this.name="VOTJSError",this.message=t}}class yt{host;hostVOT;schema;schemaVOT;fetch;fetchOpts;getVideoDataFn;sessions={};requestLang;responseLang;userAgent=P.userAgent;componentVersion=P.componentVersion;paths={videoTranslation:"/video-translation/translate",videoTranslationFailAudio:"/video-translation/fail-audio-js",videoTranslationAudio:"/video-translation/audio",videoSubtitles:"/video-subtitles/get-subtitles",streamPing:"/stream-translation/ping-stream",streamTranslation:"/stream-translation/translate-stream",createSession:"/session/create"};isCustomLink(t){return!!(/\.(m3u8|m4(a|v)|mpd)/.exec(t)??/^https:\/\/cdn\.qstv\.on\.epicgames\.com/.exec(t))}headers={"User-Agent":this.userAgent,Accept:"application/x-protobuf","Accept-Language":"en","Content-Type":"application/x-protobuf",Pragma:"no-cache","Cache-Control":"no-cache","Sec-Fetch-Mode":"no-cors"};headersVOT={"User-Agent":`vot.js/${P.version}`,"Content-Type":"application/json",Pragma:"no-cache","Cache-Control":"no-cache"};constructor({host:t=P.host,hostVOT:e=P.hostVOT,fetchFn:o=M,fetchOpts:i={},getVideoDataFn:a=ft,requestLang:n="en",responseLang:r="ru",headers:s={}}={}){const l=/(http(s)?):\/\//,d=l.exec(t)?.[1];this.host=d?t.replace(`${d}://`,""):t,this.schema=d??"https";const u=l.exec(e)?.[1];this.hostVOT=u?e.replace(`${u}://`,""):e,this.schemaVOT=u??"https",this.fetch=o,this.fetchOpts=i,this.getVideoDataFn=a,this.requestLang=n,this.responseLang=r,this.headers={...this.headers,...s}}getOpts(t,e={},o="POST"){return{method:o,headers:{...this.headers,...e},body:t,...this.fetchOpts}}async request(t,e,o={},i="POST"){const a=this.getOpts(new Blob([e]),o,i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(e,{"Content-Type":"application/json",...o},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestVOT(t,e,o={}){const i=this.getOpts(JSON.stringify(e),{...this.headersVOT,...o});try{const e=await this.fetch(`${this.schemaVOT}://${this.hostVOT}${t}`,i),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async getSession(t){const e=Math.floor(Date.now()/1e3),o=this.sessions[t];if(o&&o.timestamp+o.expires>e)return o;const{secretKey:i,expires:a,uuid:n}=await this.createSession(t);return this.sessions[t]={secretKey:i,expires:a,timestamp:e,uuid:n},this.sessions[t]}async translateVideoYAImpl({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={},shouldSendFailedAudio:n=!0}){const{url:r,duration:s=P.defaultDuration}=t,{secretKey:l,uuid:d}=await this.getSession("video-translation"),u=C.encodeTranslationRequest(r,s,e,o,i),c=await V(u),h=await this.request(this.paths.videoTranslation,u,{"Vtrans-Signature":c,"Sec-Vtrans-Sk":l,"Sec-Vtrans-Token":`${c}:${d}:${this.paths.videoTranslation}:${this.componentVersion}`,...a});if(!h.success)throw new ht("requestTranslationFailed");const p=C.decodeTranslationResponse(h.data);switch($.log("requestTranslation",p),p.status){case k.FAILED:throw p?.message?new bt("Yandex couldn't translate video",p):new ht("requestTranslationFailed");case k.FINISHED:case k.PART_CONTENT:if(!p.url)throw new ht("audioNotReceived");return{translated:!0,url:p.url,remainingTime:p.remainingTime??-1};case k.WAITING:return{translated:!1,remainingTime:p.remainingTime};case k.LONG_WAITING:case k.LONG_WAITING_2:return r.startsWith("https://youtu.be/")&&n?(await this.requestVtransFailAudio(r),await this.requestVtransAudio(r,p.translationId),await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a,shouldSendFailedAudio:!1})):{translated:!1,remainingTime:p.remainingTime??-1};default:throw A.error("Unknown response",p),new bt("Unknown response from Yandex",p)}}async translateVideoVOTImpl({url:t,videoId:e,service:o,requestLang:i=this.requestLang,responseLang:a=this.responseLang,headers:n={}}){const r=function(t,e,o){return t===S.patreon?{service:"mux",videoId:new URL(o).pathname.slice(1)}:{service:t,videoId:e}}(o,e,t),s=await this.requestVOT(this.paths.videoTranslation,{provider:"yandex",service:r.service,videoId:r.videoId,fromLang:i,toLang:a,rawVideo:t},n);if(!s.success)throw new ht("requestTranslationFailed",s);const l=s.data;switch(l.status){case"failed":throw new bt("Yandex couldn't translate video",l);case"success":if(!l.translatedUrl)throw new ht("audioNotReceived");return{translated:!0,url:l.translatedUrl,remainingTime:-1};case"waiting":return{translated:!1,remainingTime:l.remainingTime,message:l.message}}}async requestVtransFailAudio(t){const e=await this.requestJSON(this.paths.videoTranslationFailAudio,JSON.stringify({video_url:t}),void 0,"PUT");if(!e.data||"string"==typeof e.data||1!==e.data.status)throw new bt("Failed to request to fake video translation fail audio js",e);return e}async requestVtransAudio(t,e,o={}){const{secretKey:i,uuid:a}=await this.getSession("video-translation"),n=C.encodeTranslationAudioRequest(t,e),r=await V(n),s=await this.request(this.paths.videoTranslationAudio,n,{"Vtrans-Signature":r,"Sec-Vtrans-Sk":i,"Sec-Vtrans-Token":`${r}:${a}:${this.paths.videoTranslationAudio}:${this.componentVersion}`,...o},"PUT");if(!s.success)throw new bt("Failed to request video translation audio",s);return C.decodeTranslationAudioResponse(s.data)}async translateVideo({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={}}){const{url:n,videoId:r,host:s}=t;return this.isCustomLink(n)?await this.translateVideoVOTImpl({url:n,videoId:r,service:s,requestLang:e,responseLang:o,headers:a}):await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a})}async getSubtitles({videoData:t,requestLang:e=this.requestLang,headers:o={}}){const{url:i}=t;if(this.isCustomLink(i))return{waiting:!1,subtitles:[]};const{secretKey:a,uuid:n}=await this.getSession("video-translation"),r=C.encodeSubtitlesRequest(i,e),s=await V(r),l=await this.request(this.paths.videoSubtitles,r,{"Vsubs-Signature":await V(r),"Sec-Vsubs-Sk":a,"Sec-Vsubs-Token":`${s}:${n}:${this.paths.videoSubtitles}:${this.componentVersion}`,...o});if(!l.success)throw new bt("Failed to request video subtitles",l);return C.decodeSubtitlesResponse(l.data)}async pingStream({pingId:t,headers:e={}}){const{secretKey:o,uuid:i}=await this.getSession("video-translation"),a=C.encodeStreamPingRequest(t),n=await V(a),r=await this.request(this.paths.streamPing,a,{"Vtrans-Signature":await V(a),"Sec-Vtrans-Sk":o,"Sec-Vtrans-Token":`${n}:${i}:${this.paths.streamPing}:${this.componentVersion}`,...e});if(!r.success)throw new bt("Failed to request stream ping",r);return!0}async translateStream({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,headers:a={}}){const{url:n}=t;if(this.isCustomLink(n))throw new ht("VOTStreamNotSupportedUrl");const{secretKey:r,uuid:s}=await this.getSession("video-translation"),l=C.encodeStreamRequest(n,e,o),d=await V(l),u=await this.request(this.paths.streamTranslation,l,{"Vtrans-Signature":await V(l),"Sec-Vtrans-Sk":r,"Sec-Vtrans-Token":`${d}:${s}:${this.paths.streamTranslation}:${this.componentVersion}`,...a});if(!u.success)throw new bt("Failed to request stream translation",u);const c=C.decodeStreamResponse(u.data),h=c.interval;switch(h){case i.NO_CONNECTION:case i.TRANSLATING:return{translated:!1,interval:h,message:h===i.NO_CONNECTION?"streamNoConnectionToServer":"translationTakeFewMinutes"};case i.STREAMING:return{translated:!0,interval:h,pingId:c.pingId,result:c.translatedInfo};default:throw A.error("Unknown response",c),new bt("Unknown response from Yandex",c)}}async createSession(t){const e=function(){let t="";for(let e=0;e<32;e++)t+="0123456789ABCDEF"[Math.floor(16*Math.random())];return t}(),o=C.encodeYandexSessionRequest(e,t),i=await this.request(this.paths.createSession,o,{"Vtrans-Signature":await V(o)});if(!i.success)throw new bt("Failed to request create session",i);return{...C.decodeYandexSessionResponse(i.data),uuid:e}}}class wt extends yt{async request(t,e,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,...o},body:Array.from(e)}),{"Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,"Content-Type":"application/json",Accept:"application/json",...o},body:e}),{Accept:"application/json","Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}}var xt;function St(t,e=","){const o=t/1e3,i=Math.floor(o/3600),a=Math.floor(o%3600/60),n=Math.floor(o%60),r=Math.floor(t%1e3);return`${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}${e}${r.toString().padStart(3,"0")}`}function kt(t){const e=t.split(" ")?.[0]?.split(":");e.length<3&&e.unshift("00");const[o,i,a]=e;return 36e5*+o+6e4*+i+ +a.replace(/[,.]/,"")}function Tt(t,e="srt"){const o="vtt"===e,i=o?".":",",a=t.subtitles.map(((t,e)=>(o?"":`${e+1}\n`)+`${St(t.startMs,i)} --\x3e ${St(t.startMs+t.durationMs,i)}\n${t.text}\n\n`)).join("").trim();return o?`WEBVTT\n\n${a}`:a}function Ct(t,e="srt"){const o=function(t){return"string"!=typeof t?"json":/(WEBVTT)(\r?\n\r?\n)/.exec(t)?"vtt":"srt"}(t);return o===e?t:"json"===o?Tt(t,e):(t=function(t,e="srt"){const o=t.split(/\r?\n\r?\n/g);"vtt"===e&&o.shift();const i=+("srt"===e);return{containsTokens:!1,subtitles:o.reduce(((t,e)=>{const o=e.trim().split("\n"),a=o[i],n=o.slice(i+1).join("\n");if(!(2===o.length&&e.includes(" --\x3e ")||a?.includes(" --\x3e ")))return 0===t.length||(t[t.length-1].text+=`\n\n${o.join("\n")}`),t;const[r,s]=a.split(" --\x3e "),l=kt(r),d=kt(s)-l;return t.push({text:n,startMs:l,durationMs:d,speakerId:"0"}),t}),[])}}(t,o),"json"===e?t:Tt(t,e))}!function(t){t.Channel="Channel",t.Video="Video"}(xt||(xt={}));const Pt=globalThis,Lt=Pt.trustedTypes,At=Lt?Lt.createPolicy("lit-html",{createHTML:t=>t}):void 0,It="$lit$",_t=`lit$${Math.random().toFixed(9).slice(2)}$`,Vt="?"+_t,Ot=`<${Vt}>`,Mt=document,Et=()=>Mt.createComment(""),Bt=t=>null===t||"object"!=typeof t&&"function"!=typeof t,Nt=Array.isArray,Rt=t=>Nt(t)||"function"==typeof t?.[Symbol.iterator],$t="[ \t\n\f\r]",Dt=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Ft=/-->/g,qt=/>/g,Ut=RegExp(`>|${$t}(?:([^\\s"'>=/]+)(${$t}*=${$t}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),Ht=/'/g,zt=/"/g,Wt=/^(?:script|style|textarea|title)$/i,jt=t=>(e,...o)=>({_$litType$:t,strings:e,values:o}),Gt=jt(1),Yt=jt(2),Jt=(jt(3),Symbol.for("lit-noChange")),Kt=Symbol.for("lit-nothing"),Zt=new WeakMap,Xt=Mt.createTreeWalker(Mt,129);function Qt(t,e){if(!Nt(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==At?At.createHTML(e):e}const te=(t,e)=>{const o=t.length-1,i=[];let a,n=2===e?"":3===e?"":"",r=Dt;for(let e=0;e"===l[0]?(r=a??Dt,d=-1):void 0===l[1]?d=-2:(d=r.lastIndex-l[2].length,s=l[1],r=void 0===l[3]?Ut:'"'===l[3]?zt:Ht):r===zt||r===Ht?r=Ut:r===Ft||r===qt?r=Dt:(r=Ut,a=void 0);const c=r===Ut&&t[e+1].startsWith("/>")?" ":"";n+=r===Dt?o+Ot:d>=0?(i.push(s),o.slice(0,d)+It+o.slice(d)+_t+c):o+_t+(-2===d?e:c)}return[Qt(t,n+(t[o]||"")+(2===e?"":3===e?"":"")),i]};class ee{constructor({strings:t,_$litType$:e},o){let i;this.parts=[];let a=0,n=0;const r=t.length-1,s=this.parts,[l,d]=te(t,e);if(this.el=ee.createElement(l,o),Xt.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(i=Xt.nextNode())&&s.length0){i.textContent=Lt?Lt.emptyScript:"";for(let o=0;o2||""!==o[0]||""!==o[1]?(this._$AH=Array(o.length-1).fill(new String),this.strings=o):this._$AH=Kt}_$AI(t,e=this,o,i){const a=this.strings;let n=!1;if(void 0===a)t=oe(this,t,e,0),n=!Bt(t)||t!==this._$AH&&t!==Jt,n&&(this._$AH=t);else{const i=t;let r,s;for(t=a[0],r=0;r{const i=o?.renderBefore??e;let a=i._$litPart$;if(void 0===a){const t=o?.renderBefore??null;i._$litPart$=a=new ae(e.insertBefore(Et(),t),t,void 0,o??{})}return a._$AI(t),a};function he(t){return String(t).split("").map((t=>t.charCodeAt(0)))}function pe(t){return new Uint8Array(he(t))}function ge(t){const e=new ArrayBuffer(2*t.length),o=new Uint8Array(e);return new Uint16Array(e).set(he(t)),o}function me(t){const e=255;return[t>>>24&e,t>>>16&e,t>>>8&e,t&e]}function ve(t){return 11+t}function fe(t,e,o,i){return 11+e+1+1+(i?2+2*(o+1):o+1)+t}function be(t){let e=0;return t.forEach((t=>{e+=2+2*t[0].length+2+2+2*t[1].length+2})),11+e}function ye(t,e){const o=2*e;let i=0;return t.forEach((t=>{i+=2+2*t[0].length+2+4})),18+o+2+i}class we{_setIntegerFrame(t,e){const o=parseInt(e,10);this.frames.push({name:t,value:o,size:ve(o.toString().length)})}_setStringFrame(t,e){const o=e.toString();let i=13+2*o.length;"TDAT"===t&&(i=ve(o.length)),this.frames.push({name:t,value:o,size:i})}_setPictureFrame(t,e,o,i){const a=function(t){if(!t||!t.length)return null;if(255===t[0]&&216===t[1]&&255===t[2])return"image/jpeg";if(137===t[0]&&80===t[1]&&78===t[2]&&71===t[3])return"image/png";if(71===t[0]&&73===t[1]&&70===t[2])return"image/gif";if(87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])return"image/webp";const e=73===t[0]&&73===t[1]&&42===t[2]&&0===t[3],o=77===t[0]&&77===t[1]&&0===t[2]&&42===t[3];return e||o?"image/tiff":66===t[0]&&77===t[1]?"image/bmp":0===t[0]&&0===t[1]&&1===t[2]&&0===t[3]?"image/x-icon":null}(new Uint8Array(e)),n=o.toString();if(!a)throw new Error("Unknown picture MIME type");o||(i=!1),this.frames.push({name:"APIC",value:e,pictureType:t,mimeType:a,useUnicodeEncoding:i,description:n,size:fe(e.byteLength,a.length,n.length,i)})}_setLyricsFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"USLT",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setCommentFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"COMM",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setPrivateFrame(t,e){const o=t.toString();var i,a;this.frames.push({name:"PRIV",value:e,id:o,size:(i=o.length,a=e.byteLength,10+i+1+a)})}_setUserStringFrame(t,e){const o=t.toString(),i=e.toString();var a,n;this.frames.push({name:"TXXX",description:o,value:i,size:(a=o.length,n=i.length,13+2*a+2+2+2*n)})}_setUrlLinkFrame(t,e){const o=e.toString();var i;this.frames.push({name:t,value:o,size:(i=o.length,10+i)})}_setPairedTextFrame(t,e){this.frames.push({name:t,value:e,size:be(e)})}_setSynchronisedLyricsFrame(t,e,o,i,a){const n=a.toString(),r=i.split("").map((t=>t.charCodeAt(0)));this.frames.push({name:"SYLT",value:e,language:r,description:n,type:t,timestampFormat:o,size:ye(e,n.length)})}constructor(t){if(!t||"object"!=typeof t||!("byteLength"in t))throw new Error("First argument should be an instance of ArrayBuffer or Buffer");this.arrayBuffer=t,this.padding=4096,this.frames=[],this.url=""}setFrame(t,e){switch(t){case"TPE1":case"TCOM":case"TCON":{if(!Array.isArray(e))throw new Error(`${t} frame value should be an array of strings`);const o="TCON"===t?";":"/",i=e.join(o);this._setStringFrame(t,i);break}case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TMED":case"TPUB":case"TCOP":case"TKEY":case"TEXT":case"TDAT":case"TSRC":this._setStringFrame(t,e);break;case"TBPM":case"TLEN":case"TYER":this._setIntegerFrame(t,e);break;case"USLT":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("lyrics"in e))throw new Error("USLT frame value should be an object with keys description and lyrics");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setLyricsFrame(e.language,e.description,e.lyrics);break;case"APIC":if("object"!=typeof e||!("type"in e)||!("data"in e)||!("description"in e))throw new Error("APIC frame value should be an object with keys type, data and description");if(e.type<0||e.type>20)throw new Error("Incorrect APIC frame picture type");this._setPictureFrame(e.type,e.data,e.description,!!e.useUnicodeEncoding);break;case"TXXX":if("object"!=typeof e||!("description"in e)||!("value"in e))throw new Error("TXXX frame value should be an object with keys description and value");this._setUserStringFrame(e.description,e.value);break;case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":this._setUrlLinkFrame(t,e);break;case"COMM":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("text"in e))throw new Error("COMM frame value should be an object with keys description and text");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setCommentFrame(e.language,e.description,e.text);break;case"PRIV":if("object"!=typeof e||!("id"in e)||!("data"in e))throw new Error("PRIV frame value should be an object with keys id and data");this._setPrivateFrame(e.id,e.data);break;case"IPLS":if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Error("IPLS frame value should be an array of pairs");this._setPairedTextFrame(t,e);break;case"SYLT":if("object"!=typeof e||!("type"in e)||!("text"in e)||!("timestampFormat"in e))throw new Error("SYLT frame value should be an object with keys type, text and timestampFormat");if(!Array.isArray(e.text)||!Array.isArray(e.text[0]))throw new Error("SYLT frame text value should be an array of pairs");if(e.type<0||e.type>6)throw new Error("Incorrect SYLT frame content type");if(e.timestampFormat<1||e.timestampFormat>2)throw new Error("Incorrect SYLT frame time stamp format");e.language=e.language||"eng",e.description=e.description||"",this._setSynchronisedLyricsFrame(e.type,e.text,e.timestampFormat,e.language,e.description);break;default:throw new Error(`Unsupported frame ${t}`)}return this}removeTag(){if(this.arrayBuffer.byteLength<10)return;const t=new Uint8Array(this.arrayBuffer),e=t[3],o=((i=[t[6],t[7],t[8],t[9]])[0]<<21)+(i[1]<<14)+(i[2]<<7)+i[3]+10;var i,a;73!==(a=t)[0]||68!==a[1]||51!==a[2]||e<2||e>4||(this.arrayBuffer=new Uint8Array(t.subarray(o)).buffer)}addTag(){this.removeTag();const t=[255,254],e=10+this.frames.reduce(((t,e)=>t+e.size),0)+this.padding,o=new ArrayBuffer(this.arrayBuffer.byteLength+e),i=new Uint8Array(o);let a=0,n=[];return n=[73,68,51,3],i.set(n,a),a+=n.length,a++,a++,n=function(t){const e=127;return[t>>>21&e,t>>>14&e,t>>>7&e,t&e]}(e-10),i.set(n,a),a+=n.length,this.frames.forEach((e=>{switch(n=pe(e.name),i.set(n,a),a+=n.length,n=me(e.size-10),i.set(n,a),a+=n.length,a+=2,e.name){case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":n=pe(e.value),i.set(n,a),a+=n.length;break;case"TPE1":case"TCOM":case"TCON":case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TKEY":case"TMED":case"TPUB":case"TCOP":case"TEXT":case"TSRC":n=[1].concat(t),i.set(n,a),a+=n.length,n=ge(e.value),i.set(n,a),a+=n.length;break;case"TXXX":case"USLT":case"COMM":n=[1],"USLT"!==e.name&&"COMM"!==e.name||(n=n.concat(e.language)),n=n.concat(t),i.set(n,a),a+=n.length,n=ge(e.description),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=ge(e.value),i.set(n,a),a+=n.length;break;case"TBPM":case"TLEN":case"TDAT":case"TYER":a++,n=pe(e.value),i.set(n,a),a+=n.length;break;case"PRIV":n=pe(e.id),i.set(n,a),a+=n.length,a++,i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"APIC":n=[e.useUnicodeEncoding?1:0],i.set(n,a),a+=n.length,n=pe(e.mimeType),i.set(n,a),a+=n.length,n=[0,e.pictureType],i.set(n,a),a+=n.length,e.useUnicodeEncoding?(n=[].concat(t),i.set(n,a),a+=n.length,n=ge(e.description),i.set(n,a),a+=n.length,a+=2):(n=pe(e.description),i.set(n,a),a+=n.length,a++),i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"IPLS":n=[1],i.set(n,a),a+=n.length,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=ge(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=ge(e[1].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length}));break;case"SYLT":n=[1].concat(e.language).concat(e.timestampFormat).concat(e.type),i.set(n,a),a+=n.length,n=[].concat(t),i.set(n,a),a+=n.length,n=ge(e.description),i.set(n,a),a+=n.length,a+=2,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=ge(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length,n=me(e[1]),i.set(n,a),a+=n.length}))}})),a+=this.padding,i.set(new Uint8Array(this.arrayBuffer),a),this.arrayBuffer=o,o}getBlob(){return new Blob([this.arrayBuffer],{type:"audio/mpeg"})}getURL(){return this.url||(this.url=URL.createObjectURL(this.getBlob())),this.url}revokeURL(){URL.revokeObjectURL(this.url)}}const xe={async translate(t,e){try{const o=await nt(`${j.yandex}?${new URLSearchParams({text:t,lang:e})}`,{timeout:3e3});if(o instanceof Error)throw o;const i=await o.json();if(200!==i.code)throw i.message;return i.text[0]}catch(e){return console.error("Error translating text:",e),t}},async detect(t){try{const e=await nt(`${W.yandex}?${new URLSearchParams({text:t})}`,{timeout:3e3});if(e instanceof Error)throw e;const o=await e.json();if(200!==o.code)throw o.message;return o.lang??"en"}catch(t){return console.error("Error getting lang from text:",t),"en"}}},Se={async detect(t){try{const e=await nt(W.rustServer,{method:"POST",body:t});if(e instanceof Error)throw e;return await e.text()}catch(t){return console.error("Error getting lang from text:",t),"en"}}},ke={async translate(t,e="auto",o="ru"){try{const i=await nt(j.deepl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({text:t,source_lang:e,target_lang:o})});if(i instanceof Error)throw i;const a=await i.json();if(200!==a.code)throw a.message;return a.data}catch(e){return console.error("Error translating text:",e),t}}};const Te=Object.keys(j),Ce=Object.keys(W).map((t=>"rustServer"===t?"rust-server":t));async function Pe(t,e,o,i){if(!window.location.hostname.includes("m.youtube.com")&&t?.getAudioTrack){const e=t.getAudioTrack(),o=e?.getLanguageInfo();if("und"!==o?.id)return E(o.id.split(".")[0])}const a=e?.captions?.playerCaptionsTracklistRenderer?.captionTracks;if(a?.length){const t=a.find((t=>"asr"===t.kind));if(t&&t.languageCode)return E(t.languageCode)}const n=function(t,e){return`${t} ${e?e.split("\n").filter((t=>!ot.test(t))).join(" "):""}`.slice(0,450).replace(/[^\p{L}\s]+|\s+/gu," ").trim()}(o,i);return $.log(`Detecting language text: ${n}`),async function(t){switch(await Y.get("detectService",z)){case"yandex":return await xe.detect(t);case"rust-server":return await Se.detect(t);default:return"en"}}(n)}function Le(){return/^m\.youtube\.com$/.test(window.location.hostname)}function Ae(){return window.location.pathname.startsWith("/shorts/")&&!Le()?document.querySelector("#shorts-player"):document.querySelector("#movie_player")}function Ie(){const t=Ae();return t?.getPlayerResponse?t?.getPlayerResponse?.call()??null:t?.data?.playerResponse??null}function _e(){const t=Ae();return t?.getVideoData?t?.getVideoData?.call()??null:t?.data?.playerResponse?.videoDetails??null}const Ve={isMobile:Le,getPlayer:Ae,getPlayerResponse:Ie,getPlayerData:_e,getVideoVolume:function(){const t=Ae();return t?.getVolume?t.getVolume.call()/100:1},getSubtitles:function(){const t=Ie(),e=t?.captions?.playerCaptionsTracklistRenderer;if(!e)return[];let o=e.captionTracks??[];const i=e.translationLanguages??[],a=Z.lang,n=i.find((t=>t.languageCode===a)),r=o.find((t=>"asr"===t?.kind))?.languageCode??"en";return o=o.reduce(((t,e)=>{if(!("languageCode"in e))return t;const o=e.languageCode?E(e.languageCode):void 0,i=e?.url||e?.baseUrl;if(!o||!i)return t;const s=`${i.startsWith("http")?i:`${window.location.origin}/${i}`}&fmt=json3`;return t.push({source:"youtube",language:o,isAutoGenerated:"asr"===e?.kind,url:s}),n&&e.isTranslatable&&e.languageCode===r&&a!==o&&t.push({source:"youtube",language:a,isAutoGenerated:"asr"===e?.kind,translatedFromLanguage:o,url:`${s}&tlang=${a}`}),t}),[]),$.log("youtube subtitles:",o),o},getVideoData:async function(){const t=Ae(),e=Ie(),o=_e(),{title:i}=o??{},{shortDescription:a,isLive:n,title:r}=e?.videoDetails??{};let s=r?await Pe(t,e,r,a):"en";s=dt.includes(s)?s:"en";const l={isLive:!!n,title:r,localizedTitle:i,description:a,detectedLanguage:s};return $.log("youtube video data:",l),console.log("[VOT] Detected language: ",l.detectedLanguage),l},setVideoVolume:function(t){const e=Ae();if(e?.setVolume)return e.setVolume(Math.round(100*t)),!0},videoSeek:function(t,e){$.log("videoSeek",e);const o=(Ae()?.getProgressState()?.seekableEnd||t.currentTime)-e;t.currentTime=o},isMuted:function(){const t=Ae();return!!t?.isMuted&&t.isMuted.call()},isMusic:function(){const t=_e().author,e=_e().title.toUpperCase(),o=e.match(/\w+/g),i=document.body.querySelector("ytd-watch-flexy")?.playerData;return[e,document.URL,t,i?.microformat?.playerMicroformatRenderer.category,i?.title].some((t=>t?.toUpperCase().includes("MUSIC")))||document.body.querySelector("#upload-info #channel-name .badge-style-type-verified-artist")||t&&/(VEVO|Topic|Records|RECORDS|Recordings|AMV)$/.test(t)||t&&/(MUSIC|ROCK|SOUNDS|SONGS)/.test(t.toUpperCase())||o?.length&&["🎵","♫","SONG","SONGS","SOUNDTRACK","LYRIC","LYRICS","AMBIENT","MIX","VEVO","CLIP","KARAOKE","OPENING","COVER","COVERED","VOCAL","INSTRUMENTAL","ORCHESTRAL","DUBSTEP","DJ","DNB","BASS","BEAT","ALBUM","PLAYLIST","DUBSTEP","CHILL","RELAX","CLASSIC","CINEMATIC"].some((t=>o.includes(t)))||["OFFICIAL VIDEO","OFFICIAL AUDIO","FEAT.","FT.","LIVE RADIO","DANCE VER","HIP HOP","ROCK N ROLL","HOUR VER","HOURS VER","INTRO THEME"].some((t=>e.includes(t)))||o?.length&&["OP","ED","MV","OST","NCS","BGM","EDM","GMV","AMV","MMD","MAD"].some((t=>o.includes(t)))}};function Oe(t){const e=t.startMs+t.durationMs;return t.tokens.reduce(((o,i,a)=>{const n=t.tokens[a+1];let r;o.length>0&&(r=o[o.length-1]);const s=r?.alignRange?.end??0,l=s+i.text.length;if(i.alignRange={start:s,end:l},o.push(i),n){const t=i.startMs+i.durationMs,a=n.startMs?n.startMs-t:e-t;o.push({text:" ",startMs:t,durationMs:a,alignRange:{start:l,end:l+1}})}return o}),[])}function Me(t,e){const o=t.text.split(/([\n \t])/).reduce(((t,o)=>{if(o.length){const i=t[t.length-1]??e,a=i?.alignRange?.end??0,n=a+o.length;t.push({text:o,alignRange:{start:a,end:n}})}return t}),[]),i=Math.floor(t.durationMs/o.length),a=t.startMs+t.durationMs;return o.map(((e,n)=>{const r=n===o.length-1,s=t.startMs+i*n;return{...e,startMs:s,durationMs:r?a-s:i}}))}async function Ee(t){const{source:e,isAutoGenerated:o,format:i,url:a}=t,n=(async()=>{try{const t=await nt(a,{timeout:5e3});if(["vtt","srt"].includes(i)){return Ct(await t.text(),"json")}return await t.json()}catch(t){return console.error("[VOT] Failed to fetch subtitles.",t),{containsTokens:!1,subtitles:[]}}})();let r=await n;return"youtube"===e&&(r=function(t,e=!1){const o={containsTokens:e,subtitles:[]};if("object"!=typeof t||!Array.isArray(t.events))return console.error("[VOT] Failed to format youtube subtitles",t),o;for(let i=0;it.events[i+1].tStartMs&&(n=t.events[i+1].tStartMs-a.tStartMs);const r=[];let s=n;for(let t=0;tt.text)).join(" ");l&&o.subtitles.push({text:l,startMs:a.tStartMs,durationMs:n,...e?{tokens:r}:{},speakerId:"0"})}return o}(r,o)),r.subtitles=function(t,e){const o=[];let i;const{source:a,isAutoGenerated:n}=e;for(let e=0;esetTimeout((()=>e(new Error("Timeout"))),5e3)));try{const e=await Promise.race([t.getSubtitles({videoData:{host:o,url:i,videoId:n,duration:r},requestLang:a}),d]);console.log("[VOT] Subtitles response: ",e),e.waiting&&console.error("[VOT] Failed to get yandex subtitles");let s=e.subtitles??[];return s=s.reduce(((t,e)=>(e.language&&!t.find((t=>"yandex"===t.source&&t.language===e.language&&!t.translatedFromLanguage))&&t.push({source:"yandex",language:e.language,url:e.url}),e.translatedLanguage&&t.push({source:"yandex",language:e.translatedLanguage,translatedFromLanguage:e.language,url:e.translatedUrl}),t)),[]),[...s,...l].sort(((t,e)=>{if(t.source!==e.source)return"yandex"===t.source?-1:1;if(t.language!==e.language&&(t.language===Q||e.language===Q))return t.language===Q?-1:1;if("yandex"===t.source){if(t.translatedFromLanguage!==e.translatedFromLanguage)return t.translatedFromLanguage&&e.translatedFromLanguage?t.translatedFromLanguage===a?-1:1:t.language===e.language?t.translatedFromLanguage?1:-1:t.translatedFromLanguage?-1:1;if(!t.translatedFromLanguage)return t.language===a?-1:1}return"yandex"!==t.source&&t.isAutoGenerated!==e.isAutoGenerated?t.isAutoGenerated?1:-1:0}))}catch(t){throw"Timeout"===t.message?console.error("[VOT] Failed to get yandex subtitles. Reason: timeout"):console.error("[VOT] Error in getSubtitles function",t),t}}class Ne{constructor(t,e,o){this.video=t,this.container="youtube"===o.host&&"mobile"!==o.additionalData?e.parentElement:e,this.site=o,this.subtitlesContainer=this.createSubtitlesContainer(),this.position={left:25,top:75},this.dragging={active:!1,offset:{x:0,y:0}},this.subtitles=null,this.lastContent=null,this.highlightWords=!1,this.fontSize=20,this.opacity=.2,this.maxLength=300,this.maxLengthRegexp=/.{1,300}(?:\s|$)/g,this.bindEvents(),this.updateContainerRect()}createSubtitlesContainer(){const t=document.createElement("vot-block");return t.classList.add("vot-subtitles-widget"),this.container.appendChild(t),t}bindEvents(){this.onMouseDownBound=t=>this.onMouseDown(t),this.onMouseUpBound=()=>this.onMouseUp(),this.onMouseMoveBound=t=>this.onMouseMove(t),this.onTimeUpdateBound=this.debounce((()=>this.update()),100),document.addEventListener("mousedown",this.onMouseDownBound),document.addEventListener("mouseup",this.onMouseUpBound),document.addEventListener("mousemove",this.onMouseMoveBound),this.video?.addEventListener("timeupdate",this.onTimeUpdateBound),this.resizeObserver=new ResizeObserver((()=>this.onResize())),this.resizeObserver.observe(this.container)}onMouseDown(t){if(this.subtitlesContainer.contains(t.target)){const e=this.subtitlesContainer.getBoundingClientRect(),o=this.container.getBoundingClientRect();this.dragging={active:!0,offset:{x:t.clientX-e.left,y:t.clientY-e.top},containerOffset:{x:o.left,y:o.top}}}}onMouseUp(){this.dragging.active=!1}onMouseMove(t){if(this.dragging.active){t.preventDefault();const{width:e,height:o}=this.container.getBoundingClientRect(),i=this.dragging.containerOffset;this.position={left:(t.clientX-this.dragging.offset.x-i.x)/e*100,top:(t.clientY-this.dragging.offset.y-i.y)/o*100},this.applySubtitlePosition()}}onResize(){this.updateContainerRect()}updateContainerRect(){this.containerRect=this.container.getBoundingClientRect(),this.applySubtitlePosition()}applySubtitlePosition(){const{width:t,height:e}=this.containerRect,{offsetWidth:o,offsetHeight:i}=this.subtitlesContainer,a=(t-o)/t*100,n=(e-i)/e*100;this.position.left=Math.max(0,Math.min(this.position.left,a)),this.position.top=Math.max(0,Math.min(this.position.top,n)),this.subtitlesContainer.style.left=`${this.position.left}%`,this.subtitlesContainer.style.top=`${this.position.top}%`}setContent(t){t&&this.video?(this.subtitles=t,this.update()):(this.subtitles=null,ce(null,this.subtitlesContainer))}setMaxLength(t){"number"==typeof t&&t&&(this.maxLength=t,this.maxLengthRegexp=new RegExp(`.{1,${t}}(?:\\s|$)`,"g"),this.update())}setHighlightWords(t){this.highlightWords=Boolean(t),this.update()}setFontSize(t){this.fontSize=t;const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&(e.style.fontSize=`${this.fontSize}px`)}setOpacity(t){this.opacity=((100-+t)/100).toFixed(2);const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&e.style.setProperty("--vot-subtitles-opacity",this.opacity)}update(){if(!this.video||!this.subtitles)return;const t=1e3*this.video.currentTime,e=this.subtitles.subtitles?.findLast((e=>e.startMs${i}`,this.subtitlesContainer))}processTokens(t){if(t.at(-1).alignRange.end<=this.maxLength)return t;let e=[],o=[],i=0;for(const a of t)i+=a.text.length,o.push(a),i>this.maxLength&&(e.push(this.trimChunk(o)),o=[],i=0);o.length&&e.push(this.trimChunk(o));const a=1e3*this.video.currentTime;return e.find((t=>t[0].startMs{const o=this.highlightWords&&(e>t.startMs+t.durationMs/2||e>t.startMs-100&&t.startMs+t.durationMs/2-e<275);return Gt`${t.text.replace("\\n","
")}
`}))}debounce(t,e){let o;return(...i)=>{clearTimeout(o),o=setTimeout((()=>t.apply(this,i)),e)}}release(){document.removeEventListener("mousedown",this.onMouseDownBound),document.removeEventListener("mouseup",this.onMouseUpBound),document.removeEventListener("mousemove",this.onMouseMoveBound),this.video?.removeEventListener("timeupdate",this.onTimeUpdateBound),this.resizeObserver.disconnect(),this.subtitlesContainer.remove()}}o("./src/styles/main.scss");const Re="#UNDEFINED",$e=Yt` -`,be={easing:"linear",delay:function(t,e){return 200*e}};function ye(t){const e=document.createElement("vot-block");return e.classList.add("vot-icon-button"),re(t,e),e}function we(t){const e=+t.value,o=+t.min,a=(e-o)/(+t.max-o);t.parentElement.setAttribute("style",`--vot-progress: ${a}`)}function xe(t,e="",o=" ",a=!1){const n=document.createElement("vot-block");n.classList.add("vot-textfield");const i=document.createElement(a?"textarea":"input");i.placeholder=o,i.value=e,t||i.classList.add("vot-show-placeholer");const r=document.createElement("span");return r.append(t),n.append(i,r),{container:n,input:i,label:r}}function Se(t){const e=document.createElement("vot-block");e.classList.add("vot-dialog-container"),e.hidden=!0;const o=document.createElement("vot-block");o.classList.add("vot-dialog-backdrop");const a=document.createElement("vot-block");a.classList.add("vot-dialog");const n=document.createElement("vot-block");n.classList.add("vot-dialog-content-wrapper");const i=document.createElement("vot-block");i.classList.add("vot-dialog-header-container");const r=document.createElement("vot-block");r.classList.add("vot-dialog-body-container");const s=document.createElement("vot-block");s.classList.add("vot-dialog-footer-container");const l=document.createElement("vot-block");l.classList.add("vot-dialog-title-container");const d=ye(Ht``,De={easing:"linear",delay:function(t,e){return 200*e}};function Fe(t){const e=document.createElement("vot-block");return e.classList.add("vot-icon-button"),ce(t,e),e}function qe(t){const e=+t.value,o=+t.min,i=(e-o)/(+t.max-o);t.parentElement.setAttribute("style",`--vot-progress: ${i}`)}function Ue(t,e="",o=" ",i=!1){const a=document.createElement("vot-block");a.classList.add("vot-textfield");const n=document.createElement(i?"textarea":"input");n.placeholder=o,n.value=e,t||n.classList.add("vot-show-placeholer");const r=document.createElement("span");return r.append(t),a.append(n,r),{container:a,input:n,label:r}}function He(t){const e=document.createElement("vot-block");e.classList.add("vot-dialog-container"),e.hidden=!0;const o=document.createElement("vot-block");o.classList.add("vot-dialog-backdrop");const i=document.createElement("vot-block");i.classList.add("vot-dialog");const a=document.createElement("vot-block");a.classList.add("vot-dialog-content-wrapper");const n=document.createElement("vot-block");n.classList.add("vot-dialog-header-container");const r=document.createElement("vot-block");r.classList.add("vot-dialog-body-container");const s=document.createElement("vot-block");s.classList.add("vot-dialog-footer-container");const l=document.createElement("vot-block");l.classList.add("vot-dialog-title-container");const d=Fe(Yt` - `);d.classList.add("vot-dialog-close-button"),o.onclick=d.onclick=()=>{e.hidden=!0};const u=document.createElement("vot-block");return u.classList.add("vot-dialog-title"),u.append(t),e.append(o,a),a.append(n),n.append(i,r,s),i.append(l,d),l.append(u),{container:e,backdrop:o,dialog:a,contentWrapper:n,headerContainer:i,bodyContainer:r,footerContainer:s,titleContainer:l,closeButton:d,title:u}}function ke(t,e,o,a={}){const{onSelectCb:n=function(){},labelElement:i=""}=a;let r=[];const s=document.createElement("vot-block");s.classList.add("vot-select"),i&&s.append(i);const l=document.createElement("vot-block");l.classList.add("vot-select-outer");const d=document.createElement("span");d.classList.add("vot-select-title"),d.textContent=t,void 0===t&&(d.textContent=o.find((t=>!0===t.selected))?.label);const u=document.createElement("vot-block");u.classList.add("vot-select-arrow-icon"),re(fe,u),l.append(d,u),l.onclick=()=>{const t=Se(e);t.container.classList.add("vot-dialog-temp"),t.container.hidden=!1,document.documentElement.appendChild(t.container);const a=document.createElement("vot-block");a.classList.add("vot-select-content-list");for(const t of o){const e=document.createElement("vot-block");e.classList.add("vot-select-content-item"),e.textContent=t.label,e.dataset.votSelected=t.selected,e.dataset.votValue=t.value,t.disabled&&(e.inert=!0),e.onclick=async i=>{if(i.target.inert)return;const r=a.childNodes;for(let t of r)t.dataset.votSelected=!1;for(let e of o)e.selected=e.value===t.value;e.dataset.votSelected=!0,d.textContent=t.label,await n(i)},a.appendChild(e)}const i=xe(z.get("searchField"));i.input.oninput=t=>{const e=t.target.value.toLowerCase();for(let t=0;t{t.container.remove(),r=[]}},s.append(l);return{container:s,title:d,arrowIcon:u,labelElement:i,setTitle:t=>{d.textContent=t},setSelected:t=>{const e=Array.from(r).filter((t=>!t.inert));for(let o=0;o{o=t}}}const Te={createHeader:function(t,e=4){const o=document.createElement("vot-block");return o.classList.add("vot-header",`vot-header-level-${e}`),o.append(t),o},createInformation:function(t,e){const o=document.createElement("vot-block");o.classList.add("vot-info");const a=document.createElement("vot-block");re(t,a);const n=document.createElement("vot-block");return re(e,n),o.append(a,n),{container:o,header:a,value:n}},createButton:function(t){const e=document.createElement("vot-block");return e.classList.add("vot-button"),e.append(t),e},createTextButton:function(t){const e=document.createElement("vot-block");return e.classList.add("vot-text-button"),e.append(t),e},createOutlinedButton:function(t){const e=document.createElement("vot-block");return e.classList.add("vot-outlined-button"),e.append(t),e},createIconButton:ye,createCheckbox:function(t,e=!1){const o=document.createElement("label");o.classList.add("vot-checkbox");const a=document.createElement("input");a.type="checkbox",a.checked=Boolean(e);const n=document.createElement("span");return n.append(t),o.append(a,n),{container:o,input:a,label:n}},createSlider:function(t,e=50,o=0,a=100){const n=document.createElement("vot-block");n.classList.add("vot-slider");const i=document.createElement("input");i.type="range",i.min=o,i.max=a,i.value=e;const r=document.createElement("span");return re(t,r),n.append(i,r),i.addEventListener("input",(t=>we(t.target))),we(i),{container:n,input:i,label:r}},createTextfield:xe,createDialog:Se,createVOTButton:function(t){const e=document.createElement("vot-block");e.classList.add("vot-segmented-button");const o=document.createElement("vot-block");o.classList.add("vot-segment"),o.classList.add("vot-translate-button"),re(Ht``);d.classList.add("vot-dialog-close-button"),o.onclick=d.onclick=()=>{e.hidden=!0};const u=document.createElement("vot-block");return u.classList.add("vot-dialog-title"),u.append(t),e.append(o,i),i.append(a),a.append(n,r,s),n.append(l,d),l.append(u),{container:e,backdrop:o,dialog:i,contentWrapper:a,headerContainer:n,bodyContainer:r,footerContainer:s,titleContainer:l,closeButton:d,title:u}}function ze(t,e,o,i={}){const{onSelectCb:a=function(){},labelElement:n=""}=i;let r=[];const s=document.createElement("vot-block");s.classList.add("vot-select"),n&&s.append(n);const l=document.createElement("vot-block");l.classList.add("vot-select-outer");const d=document.createElement("span");d.classList.add("vot-select-title"),d.textContent=t,void 0===t&&(d.textContent=o.find((t=>!0===t.selected))?.label);const u=document.createElement("vot-block");u.classList.add("vot-select-arrow-icon"),ce($e,u),l.append(d,u),l.onclick=()=>{const t=He(e);t.container.classList.add("vot-dialog-temp"),t.container.hidden=!1,document.documentElement.appendChild(t.container);const i=document.createElement("vot-block");i.classList.add("vot-select-content-list");for(const t of o){const e=document.createElement("vot-block");e.classList.add("vot-select-content-item"),e.textContent=t.label,e.dataset.votSelected=t.selected,e.dataset.votValue=t.value,t.disabled&&(e.inert=!0),e.onclick=async n=>{if(n.target.inert)return;const r=i.childNodes;for(let t of r)t.dataset.votSelected=!1;for(let e of o)e.selected=e.value===t.value;e.dataset.votSelected=!0,d.textContent=t.label,await a(n)},i.appendChild(e)}const n=Ue(Z.get("searchField"));n.input.oninput=t=>{const e=t.target.value.toLowerCase();for(let t=0;t{t.container.remove(),r=[]}},s.append(l);return{container:s,title:d,arrowIcon:u,labelElement:n,setTitle:t=>{d.textContent=t},setSelected:t=>{const e=Array.from(r).filter((t=>!t.inert));for(let o=0;o{o=t}}}const We={createHeader:function(t,e=4){const o=document.createElement("vot-block");return o.classList.add("vot-header",`vot-header-level-${e}`),o.append(t),o},createInformation:function(t,e){const o=document.createElement("vot-block");o.classList.add("vot-info");const i=document.createElement("vot-block");ce(t,i);const a=document.createElement("vot-block");return ce(e,a),o.append(i,a),{container:o,header:i,value:a}},createButton:function(t){const e=document.createElement("vot-block");return e.classList.add("vot-button"),e.append(t),e},createTextButton:function(t){const e=document.createElement("vot-block");return e.classList.add("vot-text-button"),e.append(t),e},createOutlinedButton:function(t){const e=document.createElement("vot-block");return e.classList.add("vot-outlined-button"),e.append(t),e},createIconButton:Fe,createCheckbox:function(t,e=!1){const o=document.createElement("label");o.classList.add("vot-checkbox");const i=document.createElement("input");i.type="checkbox",i.checked=Boolean(e);const a=document.createElement("span");return a.append(t),o.append(i,a),{container:o,input:i,label:a}},createSlider:function(t,e=50,o=0,i=100){const a=document.createElement("vot-block");a.classList.add("vot-slider");const n=document.createElement("input");n.type="range",n.min=o,n.max=i,n.value=e;const r=document.createElement("span");return ce(t,r),a.append(n,r),n.addEventListener("input",(t=>qe(t.target))),qe(n),{container:a,input:n,label:r}},createTextfield:Ue,createDialog:He,createVOTButton:function(t){const e=document.createElement("vot-block");e.classList.add("vot-segmented-button");const o=document.createElement("vot-block");o.classList.add("vot-segment"),o.classList.add("vot-translate-button"),ce(Yt` - `,o);const a=document.createElement("vot-block");a.classList.add("vot-separator");const n=document.createElement("vot-block");n.classList.add("vot-segment-only-icon"),re(Ht``,o);const i=document.createElement("vot-block");i.classList.add("vot-separator");const a=document.createElement("vot-block");a.classList.add("vot-segment-only-icon"),ce(Yt` - `,n);const i=document.createElement("vot-block");i.classList.add("vot-separator");const r=document.createElement("vot-block");r.classList.add("vot-segment-only-icon"),re(Ht``,a);const n=document.createElement("vot-block");n.classList.add("vot-separator");const r=document.createElement("vot-block");r.classList.add("vot-segment-only-icon"),ce(Yt` - `,r);const s=document.createElement("span");return s.classList.add("vot-segment-label"),s.append(t),e.append(o,a,n,i,r),o.append(s),{container:e,translateButton:o,separator:a,pipButton:n,separator2:i,menuButton:r,label:s}},createVOTMenu:function(t){const e=document.createElement("vot-block");e.classList.add("vot-menu"),e.hidden=!0;const o=document.createElement("vot-block");o.classList.add("vot-menu-content-wrapper");const a=document.createElement("vot-block");a.classList.add("vot-menu-header-container");const n=document.createElement("vot-block");n.classList.add("vot-menu-body-container");const i=document.createElement("vot-block");i.classList.add("vot-menu-footer-container");const r=document.createElement("vot-block");r.classList.add("vot-menu-title-container");const s=document.createElement("vot-block");return s.classList.add("vot-menu-title"),s.append(t),e.append(o),o.append(a,n,i),a.append(r),r.append(s),{container:e,contentWrapper:o,headerContainer:a,bodyContainer:n,footerContainer:i,titleContainer:r,title:s}},createVOTSelectLabel:function(t){const e=document.createElement("span");return e.classList.add("vot-select-label"),e.textContent=t,e},createVOTSelect:ke,createVOTLanguageSelect:function(t){const{fromTitle:e=ve,fromDialogTitle:o=ve,fromItems:a=[],fromOnSelectCB:n=null,toTitle:i=ve,toDialogTitle:r=ve,toItems:s=[],toOnSelectCB:l=null}=t,d=document.createElement("vot-block");d.classList.add("vot-lang-select");const u=ke(e,o,a,{onSelectCb:n}),c=document.createElement("vot-block");c.classList.add("vot-lang-select-icon"),re(Ht``,r);const s=document.createElement("span");return s.classList.add("vot-segment-label"),s.append(t),e.append(o,i,a,n,r),o.append(s),{container:e,translateButton:o,separator:i,pipButton:a,separator2:n,menuButton:r,label:s}},createVOTMenu:function(t){const e=document.createElement("vot-block");e.classList.add("vot-menu"),e.hidden=!0;const o=document.createElement("vot-block");o.classList.add("vot-menu-content-wrapper");const i=document.createElement("vot-block");i.classList.add("vot-menu-header-container");const a=document.createElement("vot-block");a.classList.add("vot-menu-body-container");const n=document.createElement("vot-block");n.classList.add("vot-menu-footer-container");const r=document.createElement("vot-block");r.classList.add("vot-menu-title-container");const s=document.createElement("vot-block");return s.classList.add("vot-menu-title"),s.append(t),e.append(o),o.append(i,a,n),i.append(r),r.append(s),{container:e,contentWrapper:o,headerContainer:i,bodyContainer:a,footerContainer:n,titleContainer:r,title:s}},createVOTSelectLabel:function(t){const e=document.createElement("span");return e.classList.add("vot-select-label"),e.textContent=t,e},createVOTSelect:ze,createVOTLanguageSelect:function(t){const{fromTitle:e=Re,fromDialogTitle:o=Re,fromItems:i=[],fromOnSelectCB:a=null,toTitle:n=Re,toDialogTitle:r=Re,toItems:s=[],toOnSelectCB:l=null}=t,d=document.createElement("vot-block");d.classList.add("vot-lang-select");const u=ze(e,o,i,{onSelectCb:a}),c=document.createElement("vot-block");c.classList.add("vot-lang-select-icon"),ce(Yt` - `,c);const h=ke(i,r,s,{onSelectCb:l});return d.append(u.container,c,h.container),{container:d,fromSelect:u,icon:c,toSelect:h}},updateSlider:we,animateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),a=t.querySelector(".vot-loader-main");anime.timeline({...be,targets:[o,a],duration:250}).add({"fill-opacity":0,"stroke-width":2,d:"M 12 1.5 C 17.799 1.5 22.5 6.201 22.5 12 C 22.5 17.799 17.799 22.5 12 22.5 C 6.201 22.5 1.5 17.799 1.5 12 C 1.5 6.201 6.201 1.5 12 1.5 Z",duration:0}).add({targets:o,stroke:`rgb(${e})`,"stroke-opacity":0,duration:0},0).add({targets:a,stroke:"#888888","stroke-opacity":.25},0);const n=anime.timeline({targets:o,easing:"easeInOutSine",duration:1e3,autoplay:!1}).add({strokeOpacity:1,duration:0},0).add({strokeDashoffset:[anime.setDashoffset,0]},0);return t=>{n.seek(n.duration*(t/100))}},afterAnimateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),a=t.querySelector(".vot-loader-main");anime.timeline({...be,targets:a,duration:600}).add({d:"M 9.0596 14.8571 L 9.7667 15.5642 L 10.4738 14.8571 L 17.0071 8.3238 C 17.0457 8.2852 17.0937 8.25 17.2333 8.25 C 17.373 8.25 17.421 8.2852 17.4596 8.3238 C 17.4981 8.3624 17.5333 8.4104 17.5333 8.55 C 17.5333 8.6896 17.4981 8.7376 17.4596 8.7762 L 9.9929 16.2429 C 9.9011 16.3346 9.8397 16.35 9.7667 16.35 C 9.6937 16.35 9.6322 16.3346 9.5404 16.2429 L 6.0738 12.7762 C 6.0352 12.7376 6 12.6897 6 12.55 C 6 12.4103 6.0352 12.3624 6.0738 12.3238 C 6.1124 12.2852 6.1603 12.25 6.3 12.25 C 6.4397 12.25 6.4876 12.2852 6.5262 12.3238 L 9.0596 14.8571 Z",duration:0}).add({strokeDashoffset:[anime.setDashoffset,0],stroke:`rgb(${e})`,"stroke-opacity":1}),setTimeout((()=>{anime.timeline({...be,targets:a,duration:600}).add({d:"M12 15.575C11.8667 15.575 11.7417 15.5542 11.625 15.5125C11.5083 15.4708 11.4 15.4 11.3 15.3L7.7 11.7C7.5 11.5 7.40417 11.2667 7.4125 11C7.42083 10.7333 7.51667 10.5 7.7 10.3C7.9 10.1 8.1375 9.99583 8.4125 9.9875C8.6875 9.97917 8.925 10.075 9.125 10.275L11 12.15V5C11 4.71667 11.0958 4.47917 11.2875 4.2875C11.4792 4.09583 11.7167 4 12 4C12.2833 4 12.5208 4.09583 12.7125 4.2875C12.9042 4.47917 13 4.71667 13 5V12.15L14.875 10.275C15.075 10.075 15.3125 9.97917 15.5875 9.9875C15.8625 9.99583 16.1 10.1 16.3 10.3C16.4833 10.5 16.5792 10.7333 16.5875 11C16.5958 11.2667 16.5 11.5 16.3 11.7L12.7 15.3C12.6 15.4 12.4917 15.4708 12.375 15.5125C12.2583 15.5542 12.1333 15.575 12 15.575ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V16C4 15.7167 4.09583 15.4792 4.2875 15.2875C4.47917 15.0958 4.71667 15 5 15C5.28333 15 5.52083 15.0958 5.7125 15.2875C5.90417 15.4792 6 15.7167 6 16V18H18V16C18 15.7167 18.0958 15.4792 18.2875 15.2875C18.4792 15.0958 18.7167 15 19 15C19.2833 15 19.5208 15.0958 19.7125 15.2875C19.9042 15.4792 20 15.7167 20 16V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z",duration:100}).add({targets:o,d:"",duration:200},0).add({targets:a,"stroke-width":"0",stroke:`rgba(${e}), 0)`,"fill-opacity":"1","stroke-dasharray":"0","stroke-dashoffset":"0",duration:0})}),2e3)},createDetails:function(t){const e=document.createElement("vot-block");e.classList.add("vot-details");const o=document.createElement("vot-block");o.append(t);const a=document.createElement("vot-block");return a.classList.add("vot-details-arrow-icon"),re(fe,a),e.append(o,a),{container:e,header:o,arrowIcon:a}}};const Ce={async translate(t,e){try{const o=await Q(`${F.yandex}?${new URLSearchParams({text:t,lang:e})}`,{timeout:3e3});if(o instanceof Error)throw o;const a=await o.json();if(200!==a.code)throw a.message;return a.text[0]}catch(e){return console.error("Error translating text:",e),t}},async detect(t){try{const e=await Q(`${D.yandex}?${new URLSearchParams({text:t})}`,{timeout:3e3});if(e instanceof Error)throw e;const o=await e.json();if(200!==o.code)throw o.message;return o.lang??"en"}catch(t){return console.error("Error getting lang from text:",t),"en"}}},Le={async detect(t){try{const e=await Q(D.rustServer,{method:"POST",body:t});if(e instanceof Error)throw e;return await e.text()}catch(t){return console.error("Error getting lang from text:",t),"en"}}},Ve={async translate(t,e="auto",o="ru"){try{const a=await Q(F.deepl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({text:t,source_lang:e,target_lang:o})});if(a instanceof Error)throw a;const n=await a.json();if(200!==n.code)throw n.message;return n.data}catch(e){return console.error("Error translating text:",e),t}}};const Ae=Object.keys(F),Ie=Object.keys(D).map((t=>"rustServer"===t?"rust-server":t));async function Oe(t,e,o,a){if(!window.location.hostname.includes("m.youtube.com")&&t?.getAudioTrack){const e=t.getAudioTrack(),o=e?.getLanguageInfo();if("und"!==o?.id)return G(o.id.split(".")[0])}const n=e?.captions?.playerCaptionsTracklistRenderer?.captionTracks;if(n?.length){const t=n.find((t=>"asr"===t.kind));if(t&&t.languageCode)return G(t.languageCode)}const i=function(t,e){return`${t} ${e?e.split("\n").filter((t=>!J.test(t))).join(" "):""}`.slice(0,450).replace(/[^\p{L}\s]+|\s+/gu," ").trim()}(o,a);return M.log(`Detecting language text: ${i}`),async function(t){switch(await q.get("detectService",B)){case"yandex":return await Ce.detect(t);case"rust-server":return await Le.detect(t);default:return"en"}}(i)}function Pe(){return/^m\.youtube\.com$/.test(window.location.hostname)}function Me(){return window.location.pathname.startsWith("/shorts/")&&!Pe()?document.querySelector("#shorts-player"):document.querySelector("#movie_player")}function Ee(){const t=Me();return t?.getPlayerResponse?t?.getPlayerResponse?.call()??null:t?.data?.playerResponse??null}function _e(){const t=Me();return t?.getVideoData?t?.getVideoData?.call()??null:t?.data?.playerResponse?.videoDetails??null}const $e={isMobile:Pe,getPlayer:Me,getPlayerResponse:Ee,getPlayerData:_e,getVideoVolume:function(){const t=Me();return t?.getVolume?t.getVolume.call()/100:1},getSubtitles:function(){const t=Ee(),e=t?.captions?.playerCaptionsTracklistRenderer;if(!e)return[];let o=e.captionTracks??[];const a=e.translationLanguages??[],n=z.lang,i=a.find((t=>t.languageCode===n)),r=o.find((t=>"asr"===t?.kind))?.languageCode??"en";return o=o.reduce(((t,e)=>{if(!("languageCode"in e))return t;const o=e.languageCode?G(e.languageCode):void 0,a=e?.url||e?.baseUrl;if(!o||!a)return t;const s=`${a.startsWith("http")?a:`${window.location.origin}/${a}`}&fmt=json3`;return t.push({source:"youtube",language:o,isAutoGenerated:"asr"===e?.kind,url:s}),i&&e.isTranslatable&&e.languageCode===r&&n!==o&&t.push({source:"youtube",language:n,isAutoGenerated:"asr"===e?.kind,translatedFromLanguage:o,url:`${s}&tlang=${n}`}),t}),[]),M.log("youtube subtitles:",o),o},getVideoData:async function(){const t=Me(),e=Ee(),o=_e(),{title:a}=o??{},{shortDescription:n,isLive:i,title:r}=e?.videoDetails??{};let s=r?await Oe(t,e,r,n):"en";s=at.includes(s)?s:"en";const l={isLive:!!i,title:r,localizedTitle:a,description:n,detectedLanguage:s};return M.log("youtube video data:",l),console.log("[VOT] Detected language: ",l.detectedLanguage),l},setVideoVolume:function(t){const e=Me();if(e?.setVolume)return e.setVolume(Math.round(100*t)),!0},videoSeek:function(t,e){M.log("videoSeek",e);const o=(Me()?.getProgressState()?.seekableEnd||t.currentTime)-e;t.currentTime=o},isMuted:function(){const t=Me();return!!t?.isMuted&&t.isMuted.call()},isMusic:function(){const t=_e().author,e=_e().title.toUpperCase(),o=e.match(/\w+/g),a=document.body.querySelector("ytd-watch-flexy")?.playerData;return[e,document.URL,t,a?.microformat?.playerMicroformatRenderer.category,a?.title].some((t=>t?.toUpperCase().includes("MUSIC")))||document.body.querySelector("#upload-info #channel-name .badge-style-type-verified-artist")||t&&/(VEVO|Topic|Records|RECORDS|Recordings|AMV)$/.test(t)||t&&/(MUSIC|ROCK|SOUNDS|SONGS)/.test(t.toUpperCase())||o?.length&&["🎵","♫","SONG","SONGS","SOUNDTRACK","LYRIC","LYRICS","AMBIENT","MIX","VEVO","CLIP","KARAOKE","OPENING","COVER","COVERED","VOCAL","INSTRUMENTAL","ORCHESTRAL","DUBSTEP","DJ","DNB","BASS","BEAT","ALBUM","PLAYLIST","DUBSTEP","CHILL","RELAX","CLASSIC","CINEMATIC"].some((t=>o.includes(t)))||["OFFICIAL VIDEO","OFFICIAL AUDIO","FEAT.","FT.","LIVE RADIO","DANCE VER","HIP HOP","ROCK N ROLL","HOUR VER","HOURS VER","INTRO THEME"].some((t=>e.includes(t)))||o?.length&&["OP","ED","MV","OST","NCS","BGM","EDM","GMV","AMV","MMD","MAD"].some((t=>o.includes(t)))}};function Ne(t){const e=t.startMs+t.durationMs;return t.tokens.reduce(((o,a,n)=>{const i=t.tokens[n+1];let r;o.length>0&&(r=o[o.length-1]);const s=r?.alignRange?.end??0,l=s+a.text.length;if(a.alignRange={start:s,end:l},o.push(a),i){const t=a.startMs+a.durationMs,n=i.startMs?i.startMs-t:e-t;o.push({text:" ",startMs:t,durationMs:n,alignRange:{start:l,end:l+1}})}return o}),[])}function Re(t,e){const o=t.text.split(/([\n \t])/).reduce(((t,o)=>{if(o.length){const a=t[t.length-1]??e,n=a?.alignRange?.end??0,i=n+o.length;t.push({text:o,alignRange:{start:n,end:i}})}return t}),[]),a=Math.floor(t.durationMs/o.length),n=t.startMs+t.durationMs;return o.map(((e,i)=>{const r=i===o.length-1,s=t.startMs+a*i;return{...e,startMs:s,durationMs:r?n-s:a}}))}async function Be(t){const{source:e,isAutoGenerated:o,format:a,url:n}=t,i=(async()=>{try{const t=await Q(n,{timeout:5e3});if(["vtt","srt"].includes(a)){return wt(await t.text(),"json")}return await t.json()}catch(t){return console.error("[VOT] Failed to fetch subtitles.",t),{containsTokens:!1,subtitles:[]}}})();let r=await i;return"youtube"===e&&(r=function(t,e=!1){const o={containsTokens:e,subtitles:[]};if("object"!=typeof t||!Array.isArray(t.events))return console.error("[VOT] Failed to format youtube subtitles",t),o;for(let a=0;at.events[a+1].tStartMs&&(i=t.events[a+1].tStartMs-n.tStartMs);const r=[];let s=i;for(let t=0;tt.text)).join(" ");l&&o.subtitles.push({text:l,startMs:n.tStartMs,durationMs:i,...e?{tokens:r}:{},speakerId:"0"})}return o}(r,o)),r.subtitles=function(t,e){const o=[];let a;const{source:n,isAutoGenerated:i}=e;for(let e=0;esetTimeout((()=>e(new Error("Timeout"))),5e3)));try{const e=await Promise.race([t.getSubtitles({videoData:{host:o,url:a,videoId:i,duration:r},requestLang:n}),d]);console.log("[VOT] Subtitles response: ",e),e.waiting&&console.error("[VOT] Failed to get yandex subtitles");let s=e.subtitles??[];return s=s.reduce(((t,e)=>(e.language&&!t.find((t=>"yandex"===t.source&&t.language===e.language&&!t.translatedFromLanguage))&&t.push({source:"yandex",language:e.language,url:e.url}),e.translatedLanguage&&t.push({source:"yandex",language:e.translatedLanguage,translatedFromLanguage:e.language,url:e.translatedUrl}),t)),[]),[...s,...l].sort(((t,e)=>{if(t.source!==e.source)return"yandex"===t.source?-1:1;if(t.language!==e.language&&(t.language===j||e.language===j))return t.language===j?-1:1;if("yandex"===t.source){if(t.translatedFromLanguage!==e.translatedFromLanguage)return t.translatedFromLanguage&&e.translatedFromLanguage?t.translatedFromLanguage===n?-1:1:t.language===e.language?t.translatedFromLanguage?1:-1:t.translatedFromLanguage?-1:1;if(!t.translatedFromLanguage)return t.language===n?-1:1}return"yandex"!==t.source&&t.isAutoGenerated!==e.isAutoGenerated?t.isAutoGenerated?1:-1:0}))}catch(t){throw"Timeout"===t.message?console.error("[VOT] Failed to get yandex subtitles. Reason: timeout"):console.error("[VOT] Error in getSubtitles function",t),t}}class Fe{constructor(t,e,o){this.video=t,this.container="youtube"===o.host&&"mobile"!==o.additionalData?e.parentElement:e,this.site=o,this.subtitlesContainer=this.createSubtitlesContainer(),this.position={left:25,top:75},this.dragging={active:!1,offset:{x:0,y:0}},this.subtitles=null,this.lastContent=null,this.highlightWords=!1,this.fontSize=20,this.opacity=.2,this.maxLength=300,this.maxLengthRegexp=/.{1,300}(?:\s|$)/g,this.bindEvents(),this.updateContainerRect()}createSubtitlesContainer(){const t=document.createElement("vot-block");return t.classList.add("vot-subtitles-widget"),this.container.appendChild(t),t}bindEvents(){this.onMouseDownBound=t=>this.onMouseDown(t),this.onMouseUpBound=()=>this.onMouseUp(),this.onMouseMoveBound=t=>this.onMouseMove(t),this.onTimeUpdateBound=this.debounce((()=>this.update()),100),document.addEventListener("mousedown",this.onMouseDownBound),document.addEventListener("mouseup",this.onMouseUpBound),document.addEventListener("mousemove",this.onMouseMoveBound),this.video?.addEventListener("timeupdate",this.onTimeUpdateBound),this.resizeObserver=new ResizeObserver((()=>this.onResize())),this.resizeObserver.observe(this.container)}onMouseDown(t){if(this.subtitlesContainer.contains(t.target)){const e=this.subtitlesContainer.getBoundingClientRect(),o=this.container.getBoundingClientRect();this.dragging={active:!0,offset:{x:t.clientX-e.left,y:t.clientY-e.top},containerOffset:{x:o.left,y:o.top}}}}onMouseUp(){this.dragging.active=!1}onMouseMove(t){if(this.dragging.active){t.preventDefault();const{width:e,height:o}=this.container.getBoundingClientRect(),a=this.dragging.containerOffset;this.position={left:(t.clientX-this.dragging.offset.x-a.x)/e*100,top:(t.clientY-this.dragging.offset.y-a.y)/o*100},this.applySubtitlePosition()}}onResize(){this.updateContainerRect()}updateContainerRect(){this.containerRect=this.container.getBoundingClientRect(),this.applySubtitlePosition()}applySubtitlePosition(){const{width:t,height:e}=this.containerRect,{offsetWidth:o,offsetHeight:a}=this.subtitlesContainer,n=(t-o)/t*100,i=(e-a)/e*100;this.position.left=Math.max(0,Math.min(this.position.left,n)),this.position.top=Math.max(0,Math.min(this.position.top,i)),this.subtitlesContainer.style.left=`${this.position.left}%`,this.subtitlesContainer.style.top=`${this.position.top}%`}setContent(t){t&&this.video?(this.subtitles=t,this.update()):(this.subtitles=null,re(null,this.subtitlesContainer))}setMaxLength(t){"number"==typeof t&&t&&(this.maxLength=t,this.maxLengthRegexp=new RegExp(`.{1,${t}}(?:\\s|$)`,"g"),this.update())}setHighlightWords(t){this.highlightWords=Boolean(t),this.update()}setFontSize(t){this.fontSize=t;const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&(e.style.fontSize=`${this.fontSize}px`)}setOpacity(t){this.opacity=((100-+t)/100).toFixed(2);const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&e.style.setProperty("--vot-subtitles-opacity",this.opacity)}update(){if(!this.video||!this.subtitles)return;const t=1e3*this.video.currentTime,e=this.subtitles.subtitles?.findLast((e=>e.startMs${a}`,this.subtitlesContainer))}processTokens(t){if(t.at(-1).alignRange.end<=this.maxLength)return t;let e=[],o=[],a=0;for(const n of t)a+=n.text.length,o.push(n),a>this.maxLength&&(e.push(this.trimChunk(o)),o=[],a=0);o.length&&e.push(this.trimChunk(o));const n=1e3*this.video.currentTime;return e.find((t=>t[0].startMs{const o=this.highlightWords&&(e>t.startMs+t.durationMs/2||e>t.startMs-100&&t.startMs+t.durationMs/2-e<275);return Ut`${t.text.replace("\\n","
")}
`}))}debounce(t,e){let o;return(...a)=>{clearTimeout(o),o=setTimeout((()=>t.apply(this,a)),e)}}release(){document.removeEventListener("mousedown",this.onMouseDownBound),document.removeEventListener("mouseup",this.onMouseUpBound),document.removeEventListener("mousemove",this.onMouseMoveBound),this.video?.removeEventListener("timeupdate",this.onTimeUpdateBound),this.resizeObserver.disconnect(),this.subtitlesContainer.remove()}}o("./node_modules/requestidlecallback-polyfill/index.js");class qe{constructor(){this.listeners=new Set}hasListener(t){return this.listeners.has(t)}dispatchToListener(t,...e){try{t(...e)}catch(t){console.error("[VOT]",t)}}addListener(t){if(this.hasListener(t))throw new Error("[VOT] The listener has already been added.");this.listeners.add(t)}removeListener(t){if(!this.hasListener(t))throw new Error("[VOT] The listener has not been added yet.");this.listeners.delete(t)}dispatch(...t){for(const e of Array.from(this.listeners))this.dispatchToListener(e,...t)}}const Ue=new Set(["advertise","promo","sponsor","banner","commercial","preroll","midroll","postroll","ad-container","sponsored"]),He=(()=>{const t=Array.from(Ue).join("|");return new RegExp(t,"i")})(),ze=t=>{const e=[];for(let o=0;o({label:z.get("langs")[t]??t.toUpperCase(),value:t,selected:e===t})))}const Ke=t=>t?z.get("VOTChangeHotkeyWithCurrent").replace("{0}",t.replace("Key","")):z.get("VOTCreateTranslationHotkey");class Je{translateFromLang="en";translateToLang=j;timer;videoData="";firstPlay=!0;audio=new Audio;audioContext=function(){const t=window.AudioContext||window.webkitAudioContext;return t?new t:void 0}();hls=K();votClient;videoTranslations=[];videoTranslationTTL=7200;cachedTranslation;downloadTranslationUrl=null;autoRetry;streamPing;votOpts;volumeOnStart;tempOriginalVolume;tempVolume;firstSyncVolume=!0;subtitlesList=[];subtitlesListVideoId=null;dragging;constructor(t,e,o){M.log("[VideoHandler] add video:",t,"container:",e,this),this.video=t,this.container=e,this.site=o,this.init()}async translateVideoImpl(t,e,o,a=null){if(clearTimeout(this.autoRetry),M.log(t,`Translate video (requestLang: ${e}, responseLang: ${o})`),await dt(this.site,this.video)!==t.videoId)return null;try{const n=await this.votClient.translateVideo({videoData:t,requestLang:e,responseLang:o,translationHelp:a});if(M.log("Translate video result",n),n.translated&&n.remainingTime<1)return M.log("Video translation finished with this data: ",n),n;await this.updateTranslationErrorMsg(n.remainingTime>0?function(t){const e=Math.floor(t/60),o=Math.floor(t%60);return e>=60?z.get("translationTakeMoreThanHour"):1===e||0===e&&o>0?z.get("translationTakeAboutMinute"):11!==e&&e%10==1?z.get("translationTakeApproximatelyMinute2").replace("{0}",e):![12,13,14].includes(e)&&[2,3,4].includes(e%10)?z.get("translationTakeApproximatelyMinute").replace("{0}",e):z.get("translationTakeApproximatelyMinutes").replace("{0}",e)}(n.remainingTime):n.message??z.get("translationTakeFewMinutes"))}catch(t){return console.error("[VOT] Failed to translate video",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}return new Promise((n=>{const i=this.subtitlesList.some((t=>"yandex"===t.source))?2e4:3e4;this.autoRetry=setTimeout((async()=>{const i=await this.translateVideoImpl(t,e,o,a);(!i||i.translated&&i.remainingTime<1)&&n(i)}),i)}))}async translateStreamImpl(t,e,o){if(clearTimeout(this.autoRetry),M.log(t,`Translate stream (requestLang: ${e}, responseLang: ${o})`),await dt(this.site,this.video)!==t.videoId)return null;try{const a=await this.votClient.translateStream({videoData:t,requestLang:e,responseLang:o});if(M.log("Translate stream result",a),!a.translated&&10===a.interval)return await this.updateTranslationErrorMsg(z.get("translationTakeFewMinutes")),new Promise((n=>{this.autoRetry=setTimeout((async()=>{const a=await this.translateStreamImpl(t,e,o);a&&!a.translated&&10===a.interval||n(a)}),1e3*a.interval)}));if(a.message)throw M.log(`Stream translation aborted! Message: ${a.message}`),new ct("streamNoConnectionToServer");if(!a.result)throw M.log("Failed to find translation result! Data:",a),new ct("audioNotReceived");return M.log("Stream translated successfully. Running...",a),this.streamPing=setInterval((async()=>{M.log("Ping stream translation",a.pingId),this.votClient.pingStream({pingId:a.pingId})}),1e3*a.interval),a}catch(t){return console.error("[VOT] Failed to translate stream",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}}async autoTranslate(){if(this.firstPlay&&1===this.data.autoTranslate&&this.videoData.videoId){this.firstPlay=!1;try{await this.translateExecutor(this.videoData.videoId)}catch(t){console.error("[VOT]",t),this.transformBtn("error","VOTLocalizedError"===t?.name?t.localizedMessage:t)}}}async init(){if(this.initialized)return;const t={autoTranslate:q.get("autoTranslate",0),dontTranslateLanguage:q.get("dontTranslateLanguage",j),dontTranslateYourLang:q.get("dontTranslateYourLang",1),autoSetVolumeYandexStyle:q.get("autoSetVolumeYandexStyle",1),autoVolume:q.get("autoVolume",N),buttonPos:q.get("buttonPos","default"),showVideoSlider:q.get("showVideoSlider",1),syncVolume:q.get("syncVolume",0),downloadWithName:q.get("downloadWithName",1),subtitlesMaxLength:q.get("subtitlesMaxLength",300),highlightWords:q.get("highlightWords",0),subtitlesFontSize:q.get("subtitlesFontSize",20),subtitlesOpacity:q.get("subtitlesOpacity",20),subtitlesDownloadFormat:q.get("subtitlesDownloadFormat","srt"),responseLanguage:q.get("responseLanguage",j),defaultVolume:q.get("defaultVolume",100),audioProxy:q.get("audioProxy",0),bypassMediaCSP:q.get("bypassMediaCSP",Number(!!this.audioContext)),showPiPButton:q.get("showPiPButton",0),translateAPIErrors:q.get("translateAPIErrors",1),translationService:q.get("translationService",R),detectService:q.get("detectService",B),hotkeyButton:q.get("hotkeyButton",null),m3u8ProxyHost:q.get("m3u8ProxyHost",E),translateProxyEnabled:q.get("translateProxyEnabled",0),proxyWorkerHost:q.get("proxyWorkerHost",_),audioBooster:q.get("audioBooster",0),localeHash:q.get("locale-hash",""),localeUpdatedAt:q.get("locale-updated-at",0)};this.data=Object.fromEntries(await Promise.all(Object.entries(t).map((async([t,e])=>[t,await e])))),console.log("[VOT] data from db: ",this.data),"m3u8-proxy.toil.cc"===this.data.m3u8ProxyHost&&(this.data.m3u8ProxyHost=E,await q.set("m3u8ProxyHost",E),console.log(`[VOT] Old m3u8 proxy host converted to new ${this.data.m3u8ProxyHost} media-proxy`)),"vot.toil.cc"===this.data.proxyWorkerHost&&(this.data.proxyWorkerHost=_,await q.set("proxyWorkerHost",_),console.log(`[VOT] Old proxy worker host converted to new ${this.data.proxyWorkerHost}`)),!this.data.translateProxyEnabled&&GM_info?.scriptHandler&&je.includes(GM_info.scriptHandler)&&(this.data.translateProxyEnabled=1,await q.set("translateProxyEnabled",1),M.log("translateProxyEnabled",this.data.translateProxyEnabled)),M.log("Extension compatibility passed..."),this.votOpts={headers:this.data.translateProxyEnabled?{}:{"sec-ch-ua":null,"sec-ch-ua-mobile":null,"sec-ch-ua-platform":null},fetchFn:Q,hostVOT:$,host:this.data.translateProxyEnabled?this.data.proxyWorkerHost:"api.browser.yandex.ru"},this.votClient=new(this.data.translateProxyEnabled?mt:gt)(this.votOpts),this.subtitlesWidget=new Fe(this.video,this.container,this.site),this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength),this.subtitlesWidget.setHighlightWords(this.data.highlightWords),this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize),this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity),this.initUI(),this.initUIEvents(),this.initAudioBooster(),this.videoData=await this.getVideoData(),this.setSelectMenuValues(this.videoData.detectedLanguage,this.data.responseLanguage??"ru"),this.translateToLang=this.data.responseLanguage??"ru",this.initExtraEvents(),await Promise.all([this.updateSubtitles(),this.autoTranslate()]),this.initialized=!0}transformBtn(t,e){this.votButton.container.dataset.status=t;const o="error"===t&&e.includes(z.get("translationTake"));this.setLoadingBtn(o),this.votButton.label.textContent=e,this.votButton.container.title="error"===t?e:""}setLoadingBtn(t=!1){this.votButton.container.dataset.loading=t}initAudioBooster(){this.audio.crossOrigin="anonymous",this.audioContext&&(this.gainNode=this.audioContext.createGain(),this.gainNode.connect(this.audioContext.destination),this.audioSource=this.audioContext.createMediaElementSource(this.audio),this.audioSource.connect(this.gainNode))}initUI(){this.votButton=Te.createVOTButton(z.get("translateVideo")),this.votButton.container.style.opacity=0,this.data?.buttonPos&&"default"!==this.data?.buttonPos&&this.container.clientWidth>550?(this.votButton.container.dataset.direction="column",this.votButton.container.dataset.position=this.data?.buttonPos):(this.votButton.container.dataset.direction="row",this.votButton.container.dataset.position="default"),this.container.appendChild(this.votButton.container),this.votButton.pipButton.hidden=!Y()||!this.data?.showPiPButton,this.votButton.separator2.hidden=!Y()||!this.data?.showPiPButton,this.votButton.container.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()})),this.votMenu=Te.createVOTMenu(z.get("VOTSettings")),this.votMenu.container.dataset.position=this.container.clientWidth&&this.container.clientWidth>550?this.data?.buttonPos:"default",this.container.appendChild(this.votMenu.container),this.votDownloadButton=Te.createIconButton(Ht``,c);const h=ze(n,r,s,{onSelectCb:l});return d.append(u.container,c,h.container),{container:d,fromSelect:u,icon:c,toSelect:h}},updateSlider:qe,animateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),i=t.querySelector(".vot-loader-main");anime.timeline({...De,targets:[o,i],duration:250}).add({"fill-opacity":0,"stroke-width":2,d:"M 12 1.5 C 17.799 1.5 22.5 6.201 22.5 12 C 22.5 17.799 17.799 22.5 12 22.5 C 6.201 22.5 1.5 17.799 1.5 12 C 1.5 6.201 6.201 1.5 12 1.5 Z",duration:0}).add({targets:o,stroke:`rgb(${e})`,"stroke-opacity":0,duration:0},0).add({targets:i,stroke:"#888888","stroke-opacity":.25},0);const a=anime.timeline({targets:o,easing:"easeInOutSine",duration:1e3,autoplay:!1}).add({strokeOpacity:1,duration:0},0).add({strokeDashoffset:[anime.setDashoffset,0]},0);return t=>{a.seek(a.duration*(t/100))}},afterAnimateLoader:function(t,e="139, 180, 245"){const o=t.querySelector(".vot-loader-helper"),i=t.querySelector(".vot-loader-main");anime.timeline({...De,targets:i,duration:600}).add({d:"M 9.0596 14.8571 L 9.7667 15.5642 L 10.4738 14.8571 L 17.0071 8.3238 C 17.0457 8.2852 17.0937 8.25 17.2333 8.25 C 17.373 8.25 17.421 8.2852 17.4596 8.3238 C 17.4981 8.3624 17.5333 8.4104 17.5333 8.55 C 17.5333 8.6896 17.4981 8.7376 17.4596 8.7762 L 9.9929 16.2429 C 9.9011 16.3346 9.8397 16.35 9.7667 16.35 C 9.6937 16.35 9.6322 16.3346 9.5404 16.2429 L 6.0738 12.7762 C 6.0352 12.7376 6 12.6897 6 12.55 C 6 12.4103 6.0352 12.3624 6.0738 12.3238 C 6.1124 12.2852 6.1603 12.25 6.3 12.25 C 6.4397 12.25 6.4876 12.2852 6.5262 12.3238 L 9.0596 14.8571 Z",duration:0}).add({strokeDashoffset:[anime.setDashoffset,0],stroke:`rgb(${e})`,"stroke-opacity":1}),setTimeout((()=>{anime.timeline({...De,targets:i,duration:600}).add({d:"M12 15.575C11.8667 15.575 11.7417 15.5542 11.625 15.5125C11.5083 15.4708 11.4 15.4 11.3 15.3L7.7 11.7C7.5 11.5 7.40417 11.2667 7.4125 11C7.42083 10.7333 7.51667 10.5 7.7 10.3C7.9 10.1 8.1375 9.99583 8.4125 9.9875C8.6875 9.97917 8.925 10.075 9.125 10.275L11 12.15V5C11 4.71667 11.0958 4.47917 11.2875 4.2875C11.4792 4.09583 11.7167 4 12 4C12.2833 4 12.5208 4.09583 12.7125 4.2875C12.9042 4.47917 13 4.71667 13 5V12.15L14.875 10.275C15.075 10.075 15.3125 9.97917 15.5875 9.9875C15.8625 9.99583 16.1 10.1 16.3 10.3C16.4833 10.5 16.5792 10.7333 16.5875 11C16.5958 11.2667 16.5 11.5 16.3 11.7L12.7 15.3C12.6 15.4 12.4917 15.4708 12.375 15.5125C12.2583 15.5542 12.1333 15.575 12 15.575ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V16C4 15.7167 4.09583 15.4792 4.2875 15.2875C4.47917 15.0958 4.71667 15 5 15C5.28333 15 5.52083 15.0958 5.7125 15.2875C5.90417 15.4792 6 15.7167 6 16V18H18V16C18 15.7167 18.0958 15.4792 18.2875 15.2875C18.4792 15.0958 18.7167 15 19 15C19.2833 15 19.5208 15.0958 19.7125 15.2875C19.9042 15.4792 20 15.7167 20 16V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z",duration:100}).add({targets:o,d:"",duration:200},0).add({targets:i,"stroke-width":"0",stroke:`rgba(${e}), 0)`,"fill-opacity":"1","stroke-dasharray":"0","stroke-dashoffset":"0",duration:0})}),2e3)},createDetails:function(t){const e=document.createElement("vot-block");e.classList.add("vot-details");const o=document.createElement("vot-block");o.append(t);const i=document.createElement("vot-block");return i.classList.add("vot-details-arrow-icon"),ce($e,i),e.append(o,i),{container:e,header:o,arrowIcon:i}}};o("./node_modules/requestidlecallback-polyfill/index.js");class je{constructor(){this.listeners=new Set}hasListener(t){return this.listeners.has(t)}dispatchToListener(t,...e){try{t(...e)}catch(t){console.error("[VOT]",t)}}addListener(t){if(this.hasListener(t))throw new Error("[VOT] The listener has already been added.");this.listeners.add(t)}removeListener(t){if(!this.hasListener(t))throw new Error("[VOT] The listener has not been added yet.");this.listeners.delete(t)}dispatch(...t){for(const e of Array.from(this.listeners))this.dispatchToListener(e,...t)}}const Ge=new Set(["advertise","promo","sponsor","banner","commercial","preroll","midroll","postroll","ad-container","sponsored"]),Ye=(()=>{const t=Array.from(Ge).join("|");return new RegExp(t,"i")})(),Je=t=>{const e=[];for(let o=0;o=0||(o=(t.length-i)/2);const a=2*o;this.ensureCapacity(o+this._frameCount);const n=this.endIndex;this.vector.set(t.subarray(i,i+a),n),this._frameCount+=o}putBuffer(t,e,o=0){e=e||0,o>=0||(o=t.frameCount-e),this.putSamples(t.vector,t.position+e,o)}receive(t){t>=0&&!(t>this._frameCount)||(t=this.frameCount),this._frameCount-=t,this._position+=t}receiveSamples(t,e=0){const o=2*e,i=this.startIndex;t.set(this._vector.subarray(i,i+o)),this.receive(e)}extract(t,e=0,o=0){const i=this.startIndex+2*e,a=2*o;t.set(this._vector.subarray(i,i+a))}ensureCapacity(t=0){const e=parseInt(2*t);if(this._vector.length0&&(this._vector.set(this._vector.subarray(this.startIndex,this.endIndex)),this._position=0)}}class Xe{constructor(t){t?(this._inputBuffer=new Ze,this._outputBuffer=new Ze):this._inputBuffer=this._outputBuffer=null}get inputBuffer(){return this._inputBuffer}set inputBuffer(t){this._inputBuffer=t}get outputBuffer(){return this._outputBuffer}set outputBuffer(t){this._outputBuffer=t}clear(){this._inputBuffer.clear(),this._outputBuffer.clear()}}class Qe extends Xe{constructor(t){super(t),this.reset(),this._rate=1}set rate(t){this._rate=t}reset(){this.slopeCount=0,this.prevSampleL=0,this.prevSampleR=0}clone(){const t=new Qe;return t.rate=this._rate,t}process(){const t=this._inputBuffer.frameCount;this._outputBuffer.ensureAdditionalCapacity(t/this._rate+1);const e=this.transpose(t);this._inputBuffer.receive(),this._outputBuffer.put(e)}transpose(t=0){if(0===t)return 0;const e=this._inputBuffer.vector,o=this._inputBuffer.startIndex,i=this._outputBuffer.vector,a=this._outputBuffer.endIndex;let n=0,r=0;for(;this.slopeCount<1;)i[a+2*r]=(1-this.slopeCount)*this.prevSampleL+this.slopeCount*e[o],i[a+2*r+1]=(1-this.slopeCount)*this.prevSampleR+this.slopeCount*e[o+1],r+=1,this.slopeCount+=this._rate;if(this.slopeCount-=1,1!==t)t:for(;;){for(;this.slopeCount>1;)if(this.slopeCount-=1,n+=1,n>=t-1)break t;const s=o+2*n;i[a+2*r]=(1-this.slopeCount)*e[s]+this.slopeCount*e[s+2],i[a+2*r+1]=(1-this.slopeCount)*e[s+1]+this.slopeCount*e[s+3],r+=1,this.slopeCount+=this._rate}return this.prevSampleL=e[o+2*t-2],this.prevSampleR=e[o+2*t-1],r}}class to{constructor(t){this._pipe=t}get pipe(){return this._pipe}get inputBuffer(){return this._pipe.inputBuffer}get outputBuffer(){return this._pipe.outputBuffer}fillInputBuffer(){throw new Error("fillInputBuffer() not overridden")}fillOutputBuffer(t=0){for(;this.outputBuffer.frameCountthis._position)throw new RangeError("New position may not be greater than current position");const e=this.outputBufferPosition-(this._position-t);if(e<0)throw new RangeError("New position falls outside of history buffer");this.outputBufferPosition=e,this._position=t}get sourcePosition(){return this._sourcePosition}set sourcePosition(t){this.clear(),this._sourcePosition=t}onEnd(){this.callback()}fillInputBuffer(t=0){const e=new Float32Array(2*t),o=this.sourceSound.extract(e,t,this._sourcePosition);this._sourcePosition+=o,this.inputBuffer.putSamples(e,0,o)}extract(t,e=0){this.fillOutputBuffer(this.outputBufferPosition+e);const o=Math.min(e,this.outputBuffer.frameCount-this.outputBufferPosition);this.outputBuffer.extract(t,this.outputBufferPosition,o);const i=this.outputBufferPosition+o;return this.outputBufferPosition=Math.min(this.historyBufferSize,i),this.outputBuffer.receive(Math.max(i-this.historyBufferSize,0)),this._position+=o,o}handleSampleData(t){this.extract(t.data,4096)}clear(){super.clear(),this.outputBufferPosition=0}}const io=[[124,186,248,310,372,434,496,558,620,682,744,806,868,930,992,1054,1116,1178,1240,1302,1364,1426,1488,0],[-100,-75,-50,-25,25,50,75,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-20,-15,-10,-5,5,10,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-4,-3,-2,-1,1,2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],ao=-10/1.5;class no extends Xe{constructor(t){super(t),this._quickSeek=!0,this.midBufferDirty=!1,this.midBuffer=null,this.overlapLength=0,this.autoSeqSetting=!0,this.autoSeekSetting=!0,this._tempo=1,this.setParameters(44100,0,0,8)}clear(){super.clear(),this.clearMidBuffer()}clearMidBuffer(){this.midBufferDirty&&(this.midBufferDirty=!1,this.midBuffer=null)}setParameters(t,e,o,i){t>0&&(this.sampleRate=t),i>0&&(this.overlapMs=i),e>0?(this.sequenceMs=e,this.autoSeqSetting=!1):this.autoSeqSetting=!0,o>0?(this.seekWindowMs=o,this.autoSeekSetting=!1):this.autoSeekSetting=!0,this.calculateSequenceParameters(),this.calculateOverlapLength(this.overlapMs),this.tempo=this._tempo}set tempo(t){let e;this._tempo=t,this.calculateSequenceParameters(),this.nominalSkip=this._tempo*(this.seekWindowLength-this.overlapLength),this.skipFract=0,e=Math.floor(this.nominalSkip+.5),this.sampleReq=Math.max(e+this.overlapLength,this.seekWindowLength)+this.seekLength}get tempo(){return this._tempo}get inputChunkSize(){return this.sampleReq}get outputChunkSize(){return this.overlapLength+Math.max(0,this.seekWindowLength-2*this.overlapLength)}calculateOverlapLength(t=0){let e;e=this.sampleRate*t/1e3,e=e<16?16:e,e-=e%8,this.overlapLength=e,this.refMidBuffer=new Float32Array(2*this.overlapLength),this.midBuffer=new Float32Array(2*this.overlapLength)}checkLimits(t,e,o){return to?o:t}calculateSequenceParameters(){let t,e;this.autoSeqSetting&&(t=150+-50*this._tempo,t=this.checkLimits(t,50,125),this.sequenceMs=Math.floor(t+.5)),this.autoSeekSetting&&(e=28.333333333333332+ao*this._tempo,e=this.checkLimits(e,15,25),this.seekWindowMs=Math.floor(e+.5)),this.seekWindowLength=Math.floor(this.sampleRate*this.sequenceMs/1e3),this.seekLength=Math.floor(this.sampleRate*this.seekWindowMs/1e3)}set quickSeek(t){this._quickSeek=t}clone(){const t=new no;return t.tempo=this._tempo,t.setParameters(this.sampleRate,this.sequenceMs,this.seekWindowMs,this.overlapMs),t}seekBestOverlapPosition(){return this._quickSeek?this.seekBestOverlapPositionStereoQuick():this.seekBestOverlapPositionStereo()}seekBestOverlapPositionStereo(){let t,e,o,i=0;for(this.preCalculateCorrelationReferenceStereo(),t=0,e=Number.MIN_VALUE;ie&&(e=o,t=i);return t}seekBestOverlapPositionStereoQuick(){let t,e,o,i,a,n=0;for(this.preCalculateCorrelationReferenceStereo(),e=Number.MIN_VALUE,t=0,i=0,a=0;n<4;n+=1){let r=0;for(;io[n][r]&&(a=i+io[n][r],!(a>=this.seekLength));)o=this.calculateCrossCorrelationStereo(2*a,this.refMidBuffer),o>e&&(e=o,t=a),r+=1;i=t}return t}preCalculateCorrelationReferenceStereo(){let t,e,o=0;for(;o=this.sampleReq;){t=this.seekBestOverlapPosition(),this._outputBuffer.ensureAdditionalCapacity(this.overlapLength),this.overlap(Math.floor(t)),this._outputBuffer.put(this.overlapLength),e=this.seekWindowLength-2*this.overlapLength,e>0&&this._outputBuffer.putBuffer(this._inputBuffer,t+this.overlapLength,e);const i=this._inputBuffer.startIndex+2*(t+this.seekWindowLength-this.overlapLength);this.midBuffer.set(this._inputBuffer.vector.subarray(i,i+2*this.overlapLength)),this.skipFract+=this.nominalSkip,o=Math.floor(this.skipFract),this.skipFract-=o,this._inputBuffer.receive(o)}}}const ro=function(t,e){return(t>e?t-e:e-t)>1e-10};class so{constructor(){this.transposer=new Qe(!1),this.stretch=new no(!1),this._inputBuffer=new Ze,this._intermediateBuffer=new Ze,this._outputBuffer=new Ze,this._rate=0,this._tempo=0,this.virtualPitch=1,this.virtualRate=1,this.virtualTempo=1,this.calculateEffectiveRateAndTempo()}clear(){this.transposer.clear(),this.stretch.clear()}clone(){const t=new so;return t.rate=this.rate,t.tempo=this.tempo,t}get rate(){return this._rate}set rate(t){this.virtualRate=t,this.calculateEffectiveRateAndTempo()}set rateChange(t){this._rate=1+.01*t}get tempo(){return this._tempo}set tempo(t){this.virtualTempo=t,this.calculateEffectiveRateAndTempo()}set tempoChange(t){this.tempo=1+.01*t}set pitch(t){this.virtualPitch=t,this.calculateEffectiveRateAndTempo()}set pitchOctaves(t){this.pitch=Math.exp(.69314718056*t),this.calculateEffectiveRateAndTempo()}set pitchSemitones(t){this.pitchOctaves=t/12}get inputBuffer(){return this._inputBuffer}get outputBuffer(){return this._outputBuffer}calculateEffectiveRateAndTempo(){const t=this._tempo,e=this._rate;this._tempo=this.virtualTempo/this.virtualPitch,this._rate=this.virtualRate*this.virtualPitch,ro(this._tempo,t)&&(this.stretch.tempo=this._tempo),ro(this._rate,e)&&(this.transposer.rate=this._rate),this._rate>1?this._outputBuffer!=this.transposer.outputBuffer&&(this.stretch.inputBuffer=this._inputBuffer,this.stretch.outputBuffer=this._intermediateBuffer,this.transposer.inputBuffer=this._intermediateBuffer,this.transposer.outputBuffer=this._outputBuffer):this._outputBuffer!=this.stretch.outputBuffer&&(this.transposer.inputBuffer=this._inputBuffer,this.transposer.outputBuffer=this._intermediateBuffer,this.stretch.inputBuffer=this._intermediateBuffer,this.stretch.outputBuffer=this._outputBuffer)}process(){this._rate>1?(this.stretch.process(),this.transposer.process()):(this.transposer.process(),this.stretch.process())}}class lo{constructor(t){this.buffer=t,this._position=0}get dualChannel(){return this.buffer.numberOfChannels>1}get position(){return this._position}set position(t){this._position=t}extract(t,e=0,o=0){this.position=o;let i=this.buffer.getChannelData(0),a=this.dualChannel?this.buffer.getChannelData(1):this.buffer.getChannelData(0),n=0;for(;n=e?t:new Array(e-t.length+1).join(o)+t}(parseInt(t-60*e),2)}`},co=function(t){const e=this.timePlayed,o=this.sampleRate;if(this.sourcePosition=t,this.timePlayed=t/o,e!==this.timePlayed){const t=new CustomEvent("play",{detail:{timePlayed:this.timePlayed,formattedTimePlayed:this.formattedTimePlayed,percentagePlayed:this.percentagePlayed}});this._node.dispatchEvent(t)}};class ho{constructor(t,e,o,i=eo){this._soundtouch=new so;const a=new lo(e);this.timePlayed=0,this.sourcePosition=0,this._filter=new oo(a,this._soundtouch,i),this._node=function(t,e,o=eo,i=4096){const a=t.createScriptProcessor(i,2,2),n=new Float32Array(2*i);return a.onaudioprocess=t=>{let a=t.outputBuffer.getChannelData(0),r=t.outputBuffer.getChannelData(1),s=e.extract(n,i);o(e.sourcePosition),0===s&&e.onEnd();let l=0;for(;lco.call(this,t)),o),this.tempo=1,this.rate=1,this.duration=e.duration,this.sampleRate=t.sampleRate,this.listeners=[]}get formattedDuration(){return uo(this.duration)}get formattedTimePlayed(){return uo(this.timePlayed)}get percentagePlayed(){return 100*this._filter.sourcePosition/(this.duration*this.sampleRate)}set percentagePlayed(t){this._filter.sourcePosition=parseInt(t*this.duration*this.sampleRate),this.sourcePosition=this._filter.sourcePosition,this.timePlayed=this.sourcePosition/this.sampleRate}get node(){return this._node}set pitch(t){this._soundtouch.pitch=t}set pitchSemitones(t){this._soundtouch.pitchSemitones=t}set rate(t){this._soundtouch.rate=t}set tempo(t){this._soundtouch.tempo=t}connect(t){this._node.connect(t)}disconnect(){this._node.disconnect()}on(t,e){this.listeners.push({name:t,cb:e}),this._node.addEventListener(t,(t=>e(t.detail)))}off(t=null){let e=this.listeners;t&&(e=e.filter((e=>e.name===t))),e.forEach((t=>{this._node.removeEventListener(t.name,(e=>t.cb(e.detail)))}))}}const po=(...t)=>{if(Ke.debug)return console.log(`%c✦ chaimu.js v${Ke.version} ✦`,"background: #000; color: #fff; padding: 0 8px",...t)},go=["playing","ratechange","play","waiting","pause","seeked"];function mo(){const t=window.AudioContext||window.webkitAudioContext;return t?new t:void 0}class vo{static name="BasePlayer";chaimu;_src;fetch;constructor(t,e){this.chaimu=t,this._src=e,this.fetch=Ke.fetchFn}async init(){return new Promise((t=>t(this)))}clear(){return new Promise((t=>t(this)))}lipSync(t=!1){return this}handleVideoEvent=t=>(po(`handle video ${t.type}`),this.lipSync(t.type),this);removeVideoEvents(){for(const t of go)this.chaimu.video.removeEventListener(t,this.handleVideoEvent);return this}addVideoEvents(){for(const t of go)this.chaimu.video.addEventListener(t,this.handleVideoEvent);return this}async play(){return new Promise((t=>t(this)))}async pause(){return new Promise((t=>t(this)))}get name(){return this.constructor.name}set src(t){this._src=t}get src(){return this._src}get currentSrc(){return this._src}set volume(t){}get volume(){return 0}get playbackRate(){return 0}set playbackRate(t){}get currentTime(){return 0}}class fo extends vo{static name="AudioPlayer";audio;gainNode;audioSource;constructor(t,e){super(t,e),this.audio=new Audio(e),this.audio.crossOrigin="anonymous"}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.audioSource&&(this.audioSource.disconnect(this.gainNode),this.gainNode.disconnect()),this.gainNode=this.chaimu.audioContext.createGain(),this.gainNode.connect(this.chaimu.audioContext.destination),this.audioSource=this.chaimu.audioContext.createMediaElementSource(this.audio),this.audioSource.connect(this.gainNode),this):this}async init(){return new Promise((t=>(this.initAudioBooster(),t(this))))}audioErrorHandle=t=>{console.error("[AudioPlayer]",t)};lipSync(t=!1){if(po("[AudioPlayer] lipsync video",this.chaimu.video),!this.chaimu.video)return this;if(this.audio.currentTime=this.chaimu.video.currentTime,this.audio.playbackRate=this.chaimu.video.playbackRate,!t)return po("[AudioPlayer] lipsync mode isn't set"),this;switch(po(`[AudioPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"seeked":return this.chaimu.video.paused||this.syncPlay(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async clear(){return new Promise((t=>(this.audio.pause(),this.audio.src="",this.audio.removeAttribute("src"),t(this))))}syncPlay(){return po("[AudioPlayer] sync play called"),this.audio.play().catch(this.audioErrorHandle),this}async play(){return po("[AudioPlayer] play called"),await this.audio.play().catch(this.audioErrorHandle),this}async pause(){return new Promise((t=>(po("[AudioPlayer] pause called"),this.audio.pause(),t(this))))}set src(t){this._src=t,t?this.audio.src=t:this.clear()}get src(){return this._src}get currentSrc(){return this.audio.currentSrc}set volume(t){this.gainNode?this.gainNode.gain.value=t:this.audio.volume=t}get volume(){return this.gainNode?this.gainNode.gain.value:this.audio.volume}get playbackRate(){return this.audio.playbackRate}set playbackRate(t){this.audio.playbackRate=t}get currentTime(){return this.audio.currentTime}}class bo extends vo{static name="ChaimuPlayer";audioBuffer;sourceNode;gainNode;audioShifter;cleanerRunned=!1;async fetchAudio(){if(!this._src)throw new Error("No audio source provided");if(!this.chaimu.audioContext)throw new Error("No audio context available");po(`[ChaimuPlayer] Fetching audio from ${this._src}...`);try{const t=await this.fetch(this._src);po("[ChaimuPlayer] Decoding fetched audio...");const e=await t.arrayBuffer();this.audioBuffer=await this.chaimu.audioContext.decodeAudioData(e)}catch(t){throw new Error(`Failed to fetch audio file, because ${t.message}`)}return this}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.gainNode.disconnect(),this.gainNode=this.chaimu.audioContext.createGain(),this):this}async init(){return await this.fetchAudio(),this.initAudioBooster(),this}lipSync(t=!1){if(po("[ChaimuPlayer] lipsync video",this.chaimu.video,this),!this.chaimu.video)return this;if(!t)return po("[ChaimuPlayer] lipsync mode isn't set"),this;switch(po(`[ChaimuPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"ratechange":case"seeked":return this.chaimu.video.paused||this.start(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async reopenCtx(){if(!this.chaimu.audioContext)throw new Error("No audio context available");try{await this.chaimu.audioContext.close()}catch{}return this}async clear(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(po("clear audio context"),this.cleanerRunned=!0,await this.pause(),!this.gainNode)return this.cleanerRunned=!1,this;this.sourceNode&&(this.sourceNode.stop(),this.sourceNode.disconnect(this.gainNode),this.sourceNode=void 0),this.audioShifter&&(this.audioShifter._node.disconnect(this.gainNode),this.audioShifter=void 0),this.gainNode.disconnect();const t=this.volume;return this.gainNode=void 0,await this.reopenCtx(),this.chaimu.audioContext=mo(),this.initAudioBooster(),this.volume=t,this.cleanerRunned=!1,this}async start(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(!this.audioBuffer)throw new Error("The player isn't initialized");return!this.gainNode||this.audioShifter&&this.audioShifter.duration({label:Z.get("langs")[t]??t.toUpperCase(),value:t,selected:e===t})))}const So=t=>t?Z.get("VOTChangeHotkeyWithCurrent").replace("{0}",t.replace("Key","")):Z.get("VOTCreateTranslationHotkey");class ko{translateFromLang="en";translateToLang=Q;timer;videoData="";firstPlay=!0;audioContext=mo();hls=et();votClient;audioPlayer;videoTranslations=[];videoTranslationTTL=7200;cachedTranslation;downloadTranslationUrl=null;autoRetry;streamPing;votOpts;volumeOnStart;tempOriginalVolume;tempVolume;firstSyncVolume=!0;subtitlesList=[];subtitlesListVideoId=null;dragging;constructor(t,e,o){$.log("[VideoHandler] add video:",t,"container:",e,this),this.video=t,this.container=e,this.site=o,this.init()}async translateVideoImpl(t,e,o,i=null){if(clearTimeout(this.autoRetry),$.log(t,`Translate video (requestLang: ${e}, responseLang: ${o})`),await vt(this.site,this.video)!==t.videoId)return null;try{const a=await this.votClient.translateVideo({videoData:t,requestLang:e,responseLang:o,translationHelp:i});if($.log("Translate video result",a),a.translated&&a.remainingTime<1)return $.log("Video translation finished with this data: ",a),a;await this.updateTranslationErrorMsg(a.remainingTime>0?function(t){let e=Math.floor(t/60),o=Math.floor(t%60);return o/60>=.66&&(e+=1,o=0),e>=60?Z.get("translationTakeMoreThanHour"):1===e||0===e&&o>0?Z.get("translationTakeAboutMinute"):11!==e&&e%10==1?Z.get("translationTakeApproximatelyMinute2").replace("{0}",e):![12,13,14].includes(e)&&[2,3,4].includes(e%10)?Z.get("translationTakeApproximatelyMinute").replace("{0}",e):Z.get("translationTakeApproximatelyMinutes").replace("{0}",e)}(a.remainingTime):a.message??Z.get("translationTakeFewMinutes"))}catch(t){return console.error("[VOT] Failed to translate video",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}return new Promise((a=>{const n=this.subtitlesList.some((t=>"yandex"===t.source))?2e4:3e4;this.autoRetry=setTimeout((async()=>{const n=await this.translateVideoImpl(t,e,o,i);(!n||n.translated&&n.remainingTime<1)&&a(n)}),n)}))}async translateStreamImpl(t,e,o){if(clearTimeout(this.autoRetry),$.log(t,`Translate stream (requestLang: ${e}, responseLang: ${o})`),await vt(this.site,this.video)!==t.videoId)return null;try{const i=await this.votClient.translateStream({videoData:t,requestLang:e,responseLang:o});if($.log("Translate stream result",i),!i.translated&&10===i.interval)return await this.updateTranslationErrorMsg(Z.get("translationTakeFewMinutes")),new Promise((a=>{this.autoRetry=setTimeout((async()=>{const i=await this.translateStreamImpl(t,e,o);i&&!i.translated&&10===i.interval||a(i)}),1e3*i.interval)}));if(i.message)throw $.log(`Stream translation aborted! Message: ${i.message}`),new ht("streamNoConnectionToServer");if(!i.result)throw $.log("Failed to find translation result! Data:",i),new ht("audioNotReceived");return $.log("Stream translated successfully. Running...",i),this.streamPing=setInterval((async()=>{$.log("Ping stream translation",i.pingId),this.votClient.pingStream({pingId:i.pingId})}),1e3*i.interval),i}catch(t){return console.error("[VOT] Failed to translate stream",t),await this.updateTranslationErrorMsg(t.data?.message??t),null}}async autoTranslate(){if(this.firstPlay&&1===this.data.autoTranslate&&this.videoData.videoId){this.firstPlay=!1;try{await this.translateExecutor(this.videoData.videoId)}catch(t){console.error("[VOT]",t),this.transformBtn("error","VOTLocalizedError"===t?.name?t.localizedMessage:t)}}}getPreferAudio(){return!this.audioContext||(!this.data.newAudioPlayer||(!!this.videoData.isStream||!(this.data.newAudioPlayer&&!this.data.onlyBypassMediaCSP)&&!this.site.needBypassCSP))}createPlayer(){const t=this.getPreferAudio();return $.log("preferAudio:",t),this.audioPlayer=new yo({video:this.video,debug:!1,fetchFn:nt,preferAudio:t}),this}async init(){if(this.initialized)return;const t={autoTranslate:Y.get("autoTranslate",0),dontTranslateLanguage:Y.get("dontTranslateLanguage",Q),dontTranslateYourLang:Y.get("dontTranslateYourLang",1),autoSetVolumeYandexStyle:Y.get("autoSetVolumeYandexStyle",1),autoVolume:Y.get("autoVolume",U),buttonPos:Y.get("buttonPos","default"),showVideoSlider:Y.get("showVideoSlider",1),syncVolume:Y.get("syncVolume",0),downloadWithName:Y.get("downloadWithName",1),subtitlesMaxLength:Y.get("subtitlesMaxLength",300),highlightWords:Y.get("highlightWords",0),subtitlesFontSize:Y.get("subtitlesFontSize",20),subtitlesOpacity:Y.get("subtitlesOpacity",20),subtitlesDownloadFormat:Y.get("subtitlesDownloadFormat","srt"),responseLanguage:Y.get("responseLanguage",Q),defaultVolume:Y.get("defaultVolume",100),audioProxy:Y.get("audioProxy",0),onlyBypassMediaCSP:Y.get("onlyBypassMediaCSP",Number(!!this.audioContext)),newAudioPlayer:Y.get("newAudioPlayer",Number(!!this.audioContext)),showPiPButton:Y.get("showPiPButton",0),translateAPIErrors:Y.get("translateAPIErrors",1),translationService:Y.get("translationService",H),detectService:Y.get("detectService",z),hotkeyButton:Y.get("hotkeyButton",null),m3u8ProxyHost:Y.get("m3u8ProxyHost",D),translateProxyEnabled:Y.get("translateProxyEnabled",0),proxyWorkerHost:Y.get("proxyWorkerHost",F),audioBooster:Y.get("audioBooster",0),localeHash:Y.get("locale-hash",""),localeUpdatedAt:Y.get("locale-updated-at",0)};this.data=Object.fromEntries(await Promise.all(Object.entries(t).map((async([t,e])=>[t,await e])))),console.log("[VOT] data from db: ",this.data),"m3u8-proxy.toil.cc"===this.data.m3u8ProxyHost&&(this.data.m3u8ProxyHost=D,await Y.set("m3u8ProxyHost",D),console.log(`[VOT] Old m3u8 proxy host converted to new ${this.data.m3u8ProxyHost} media-proxy`)),"vot.toil.cc"===this.data.proxyWorkerHost&&(this.data.proxyWorkerHost=F,await Y.set("proxyWorkerHost",F),console.log(`[VOT] Old proxy worker host converted to new ${this.data.proxyWorkerHost}`)),!this.data.translateProxyEnabled&&GM_info?.scriptHandler&&G.includes(GM_info.scriptHandler)&&(this.data.translateProxyEnabled=1,await Y.set("translateProxyEnabled",1),$.log("translateProxyEnabled",this.data.translateProxyEnabled)),$.log("Extension compatibility passed..."),this.votOpts={headers:this.data.translateProxyEnabled?{}:{"sec-ch-ua":null,"sec-ch-ua-mobile":null,"sec-ch-ua-platform":null},fetchFn:nt,hostVOT:q,host:this.data.translateProxyEnabled?this.data.proxyWorkerHost:"api.browser.yandex.ru"},this.votClient=new(this.data.translateProxyEnabled?wt:yt)(this.votOpts),this.subtitlesWidget=new Ne(this.video,this.container,this.site),this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength),this.subtitlesWidget.setHighlightWords(this.data.highlightWords),this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize),this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity),this.initUI(),this.initUIEvents(),this.videoData=await this.getVideoData(),this.createPlayer(),this.setSelectMenuValues(this.videoData.detectedLanguage,this.data.responseLanguage??"ru"),this.translateToLang=this.data.responseLanguage??"ru",this.initExtraEvents(),await Promise.all([this.updateSubtitles(),this.autoTranslate()]),this.initialized=!0}transformBtn(t,e){this.votButton.container.dataset.status=t;const o="error"===t&&e.includes(Z.get("translationTake"));return this.setLoadingBtn(o),this.votButton.label.textContent=e,this.votButton.container.title="error"===t?e:"",this}setLoadingBtn(t=!1){return this.votButton.container.dataset.loading=t,this}initUI(){this.votButton=We.createVOTButton(Z.get("translateVideo")),this.votButton.container.style.opacity=0,this.data?.buttonPos&&"default"!==this.data?.buttonPos&&this.container.clientWidth>550?(this.votButton.container.dataset.direction="column",this.votButton.container.dataset.position=this.data?.buttonPos):(this.votButton.container.dataset.direction="row",this.votButton.container.dataset.position="default"),this.container.appendChild(this.votButton.container),this.votButton.pipButton.hidden=!tt()||!this.data?.showPiPButton,this.votButton.separator2.hidden=!tt()||!this.data?.showPiPButton,this.votButton.container.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()})),this.votMenu=We.createVOTMenu(Z.get("VOTSettings")),this.votMenu.container.dataset.position=this.container.clientWidth&&this.container.clientWidth>550?this.data?.buttonPos:"default",this.container.appendChild(this.votMenu.container),this.votDownloadButton=We.createIconButton(Yt` - `),this.votDownloadButton.hidden=!0,this.votMenu.headerContainer.appendChild(this.votDownloadButton),this.votDownloadSubtitlesButton=Te.createIconButton(Ht``),this.votDownloadButton.hidden=!0,this.votMenu.headerContainer.appendChild(this.votDownloadButton),this.votDownloadSubtitlesButton=We.createIconButton(Yt` - `),this.votDownloadSubtitlesButton.hidden=!0,this.votMenu.headerContainer.appendChild(this.votDownloadSubtitlesButton),this.votSettingsButton=Te.createIconButton(Ht``),this.votDownloadSubtitlesButton.hidden=!0,this.votMenu.headerContainer.appendChild(this.votDownloadSubtitlesButton),this.votSettingsButton=We.createIconButton(Yt` - `),this.votMenu.headerContainer.appendChild(this.votSettingsButton),this.votTranslationLanguageSelect=Te.createVOTLanguageSelect({fromTitle:z.get("langs")[this.video.detectedLanguage],fromDialogTitle:z.get("videoLanguage"),fromItems:Ye(at,this.videoData.detectedLanguage),fromOnSelectCB:async t=>{M.log("[fromOnSelectCB] select from language",t.target.dataset.votValue),this.videoData=await this.getVideoData(),this.setSelectMenuValues(t.target.dataset.votValue,this.videoData.responseLanguage)},toTitle:z.get("langs")[this.video.responseLanguage],toDialogTitle:z.get("translationLanguage"),toItems:Ye(nt,this.videoData.responseLanguage),toOnSelectCB:async t=>{const e=t.target.dataset.votValue;M.log("[toOnSelectCB] select to language",e),this.data.responseLanguage=this.translateToLang=e,await q.set("responseLanguage",this.data.responseLanguage),M.log("Response Language value changed. New value: ",this.data.responseLanguage),this.videoData=await this.getVideoData(),this.setSelectMenuValues(this.videoData.detectedLanguage,this.data.responseLanguage)}}),this.votMenu.bodyContainer.appendChild(this.votTranslationLanguageSelect.container),this.votSubtitlesSelect=Te.createVOTSelect(z.get("VOTSubtitlesDisabled"),z.get("VOTSubtitles"),[{label:z.get("VOTSubtitlesDisabled"),value:"disabled",selected:!0,disabled:!1}],{onSelectCb:async t=>{await this.changeSubtitlesLang(t.target.dataset.votValue)},labelElement:Te.createVOTSelectLabel(z.get("VOTSubtitles"))}),this.votMenu.bodyContainer.appendChild(this.votSubtitlesSelect.container),this.votVideoVolumeSlider=Te.createSlider(Ut`${z.get("VOTVolume")}: - ${100*this.getVideoVolume()}%`,100*this.getVideoVolume()),this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||"success"!==this.votButton.container.dataset.status,this.votMenu.bodyContainer.appendChild(this.votVideoVolumeSlider.container),this.votVideoTranslationVolumeSlider=Te.createSlider(Ut`${z.get("VOTVolumeTranslation")}: - ${this.data?.defaultVolume??100}%`,this.data?.defaultVolume??100,0,this.data.audioBooster?900:100),this.votVideoTranslationVolumeSlider.container.hidden="success"!==this.votButton.container.dataset.status,this.votMenu.bodyContainer.appendChild(this.votVideoTranslationVolumeSlider.container),this.votMenu.container.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()})),this.votSettingsDialog=Te.createDialog(z.get("VOTSettings")),document.documentElement.appendChild(this.votSettingsDialog.container),this.votTranslationHeader=Te.createHeader(z.get("translationSettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votTranslationHeader),this.votAutoTranslateCheckbox=Te.createCheckbox(z.get("VOTAutoTranslate"),this.data?.autoTranslate??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votAutoTranslateCheckbox.container),this.votDontTranslateYourLangSelect=Te.createVOTSelect(z.get("langs")[this.data.dontTranslateLanguage],z.get("VOTDontTranslateYourLang"),Ye(at,this.data.dontTranslateLanguage),{onSelectCb:async t=>{this.data.dontTranslateLanguage=t.target.dataset.votValue,await q.set("dontTranslateLanguage",this.data.dontTranslateLanguage)},labelElement:Te.createCheckbox(z.get("VOTDontTranslateYourLang"),this.data?.dontTranslateYourLang??!0).container}),this.votSettingsDialog.bodyContainer.appendChild(this.votDontTranslateYourLangSelect.container),this.changehotkeyButton=Te.createOutlinedButton(Ke(this.data.hotkeyButton)),this.votSettingsDialog.bodyContainer.appendChild(this.changehotkeyButton),this.votAutoSetVolumeCheckbox=Te.createCheckbox(`${z.get("VOTAutoSetVolume")}`,this.data?.autoSetVolumeYandexStyle??!0),this.votSettingsDialog.bodyContainer.appendChild(this.votAutoSetVolumeCheckbox.container),this.votAutoSetVolumeSlider=Te.createSlider(Ut`${Math.round(100*(this.data?.autoVolume??N))}%`,Math.round(100*(this.data?.autoVolume??N)),0,100),this.votSettingsDialog.bodyContainer.appendChild(this.votAutoSetVolumeSlider.container),this.votShowVideoSliderCheckbox=Te.createCheckbox(z.get("VOTShowVideoSlider"),this.data?.showVideoSlider??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votShowVideoSliderCheckbox.container),this.votAudioBoosterCheckbox=Te.createCheckbox(z.get("VOTAudioBooster"),this.data?.audioBooster??!1),this.audioContext||(this.votAudioBoosterCheckbox.input.disabled=!0,this.votAudioBoosterCheckbox.container.title=z.get("VOTNeedWebAudioAPI")),this.votSettingsDialog.bodyContainer.appendChild(this.votAudioBoosterCheckbox.container),this.votSyncVolumeCheckbox=Te.createCheckbox(z.get("VOTSyncVolume"),this.data?.syncVolume??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votSyncVolumeCheckbox.container),this.votDownloadWithNameCheckbox=Te.createCheckbox(z.get("VOTDownloadWithName"),this.data?.downloadWithName??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votDownloadWithNameCheckbox.container),this.votTranslationServiceSelect=Te.createVOTSelect(this.data.translationService.toUpperCase(),z.get("VOTTranslationService"),Ye(Ae,this.data.translationService),{onSelectCb:async t=>{this.data.translationService=t.target.dataset.votValue,await q.set("translationService",this.data.translationService)},labelElement:Te.createCheckbox(z.get("VOTTranslateAPIErrors"),this.data.translateAPIErrors??!0).container}),this.votTranslationServiceSelect.container.hidden="ru"===z.lang,this.votSettingsDialog.bodyContainer.appendChild(this.votTranslationServiceSelect.container),this.votDetectServiceSelect=Te.createVOTSelect(this.data.detectService.toUpperCase(),z.get("VOTDetectService"),Ye(Ie,this.data.detectService),{onSelectCb:async t=>{this.data.detectService=t.target.dataset.votValue,await q.set("detectService",this.data.detectService)},labelElement:Te.createVOTSelectLabel(z.get("VOTDetectService"))}),this.votSettingsDialog.bodyContainer.appendChild(this.votDetectServiceSelect.container),this.votSubtitlesHeader=Te.createHeader(z.get("subtitlesSettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votSubtitlesHeader),this.votSubtitlesDetails=Te.createDetails(z.get("VOTSubtitlesDesign")),this.votSettingsDialog.bodyContainer.appendChild(this.votSubtitlesDetails.container),this.votProxyHeader=Te.createHeader(z.get("proxySettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votProxyHeader),this.votM3u8ProxyHostTextfield=Te.createTextfield(z.get("VOTM3u8ProxyHost"),this.data?.m3u8ProxyHost,E),this.votSettingsDialog.bodyContainer.appendChild(this.votM3u8ProxyHostTextfield.container),this.votProxyWorkerHostTextfield=Te.createTextfield(z.get("VOTProxyWorkerHost"),this.data?.proxyWorkerHost,_),this.votSettingsDialog.bodyContainer.appendChild(this.votProxyWorkerHostTextfield.container),this.votAudioProxyCheckbox=Te.createCheckbox(z.get("VOTAudioProxy"),this.data?.audioProxy??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votAudioProxyCheckbox.container),this.votBypassMediaCSPCheckbox=Te.createCheckbox(z.get("VOTBypassMediaCSP")+(this.site.needBypassCSP?` (${z.get("VOTMediaCSPEnabledOnSite")})`:""),this.data?.bypassMediaCSP??!1),this.audioContext||(this.votBypassMediaCSPCheckbox.input.disabled=!0,this.votBypassMediaCSPCheckbox.container.title=z.get("VOTNeedWebAudioAPI")),this.votSettingsDialog.bodyContainer.appendChild(this.votBypassMediaCSPCheckbox.container),this.votAboutHeader=Te.createHeader(z.get("about")),this.votSettingsDialog.bodyContainer.appendChild(this.votAboutHeader),this.votLanguageSelect=Te.createVOTSelect(z.get("langs")[q.syncGet("locale-lang-override","auto")],z.get("VOTMenuLanguage"),Ye(H,q.syncGet("locale-lang-override","auto")),{onSelectCb:async t=>{await q.set("locale-lang-override",t.target.dataset.votValue)},labelElement:Te.createVOTSelectLabel(z.get("VOTMenuLanguage"))}),this.votSettingsDialog.bodyContainer.appendChild(this.votLanguageSelect.container),this.votShowPiPButtonCheckbox=Te.createCheckbox(z.get("VOTShowPiPButton"),this.data?.showPiPButton??!1),this.votShowPiPButtonCheckbox.container.hidden=!Y(),this.votSettingsDialog.bodyContainer.appendChild(this.votShowPiPButtonCheckbox.container),this.votVersionInfo=Te.createInformation(`${z.get("VOTVersion")}:`,GM_info.script.version),this.votSettingsDialog.bodyContainer.appendChild(this.votVersionInfo.container),this.votAuthorsInfo=Te.createInformation(`${z.get("VOTAuthors")}:`,GM_info.script.author),this.votSettingsDialog.bodyContainer.appendChild(this.votAuthorsInfo.container),this.votLoaderInfo=Te.createInformation(`${z.get("VOTLoader")}:`,`${GM_info.scriptHandler} v${GM_info.version}`),this.votSettingsDialog.bodyContainer.appendChild(this.votLoaderInfo.container),this.votBrowserInfo=Te.createInformation(`${z.get("VOTBrowser")}:`,`${We.browser.name} ${We.browser.version} (${We.os.name} ${We.os.version})`),this.votSettingsDialog.bodyContainer.appendChild(this.votBrowserInfo.container),this.votLocaleInfo=Te.createInformation(`${z.get("VOTLocaleHash")}:`,Ut`${this.data.localeHash}
(${z.get("VOTUpdatedAt")} - ${new Date(1e3*this.data.localeUpdatedAt).toLocaleString()})`),this.votSettingsDialog.bodyContainer.appendChild(this.votLocaleInfo.container),this.votUpdateLocaleFilesButton=Te.createOutlinedButton(z.get("VOTUpdateLocaleFiles")),this.votSettingsDialog.bodyContainer.appendChild(this.votUpdateLocaleFilesButton),this.votResetSettingsButton=Te.createButton(z.get("resetSettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votResetSettingsButton)}async handleTranslationBtnClick(){if(this.audio.src||this.playSound)return M.log("[click translationBtn] audio.src is not empty"),void this.stopTranslate();if(this.hls.url)return M.log("[click translationBtn] hls is not empty"),void this.stopTranslate();try{if(M.log("[click translationBtn] trying execute translation"),!this.videoData.videoId)throw new ct("VOTNoVideoIDFound");"vk"===this.site.host&&"clips"===this.site.additionalData&&(this.videoData=await this.getVideoData()),await this.translateExecutor(this.videoData.videoId)}catch(t){console.error("[VOT]",t),"VOTLocalizedError"===t?.name?this.transformBtn("error",t.localizedMessage):this.transformBtn("error",t?.message)}}initUIEvents(){this.votButton.translateButton.addEventListener("click",(async()=>{await this.handleTranslationBtnClick()})),this.votButton.pipButton.addEventListener("click",(()=>{(async()=>{this.video!==document.pictureInPictureElement?await this.video.requestPictureInPicture():await document.exitPictureInPicture()})()})),this.votButton.menuButton.addEventListener("click",(()=>{this.votMenu.container.hidden=!this.votMenu.container.hidden})),this.votButton.container.addEventListener("mousedown",(()=>{this.dragging=!0})),this.container.addEventListener("mouseup",(()=>{this.dragging=!1})),this.container.addEventListener("mousemove",(async t=>{if(this.dragging){t.preventDefault();const e=t.clientX/this.container.clientWidth*100,o=this.container.clientWidth>550,a=e<=44?"left":e>=66?"right":"default";this.data.buttonPos=o?a:"default",this.votButton.container.dataset.direction="default"===this.data.buttonPos?"row":"column",this.votButton.container.dataset.position=this.data.buttonPos,this.votMenu.container.dataset.position=this.data.buttonPos,o&&await q.set("buttonPos",this.data.buttonPos)}})),this.votDownloadButton.addEventListener("click",(async()=>{if(!this.downloadTranslationUrl)return;if(!this.data.downloadWithName)return window.open(this.downloadTranslationUrl,"_blank").focus();const t=document.querySelector("#vot-loader-download"),e=getComputedStyle(this.votMenu.container).getPropertyValue("--vot-primary-rgb"),o=Te.animateLoader(t,e),a=await Q(this.downloadTranslationUrl),n=a.body.getReader(),i=+a.headers.get("Content-Length");let r=0;const s=[];for(;;){const{done:t,value:e}=await n.read();if(t)break;s.push(e),r+=e.length,o(Math.round(r/i*100))}Te.afterAnimateLoader(t,e);const l=new Blob(s),d=X(this.videoData.title??this.videoData.videoId),u=await l.arrayBuffer(),c=new me(u);c.setFrame("TIT2",d),c.addTag(),Z(c.getBlob(),`${d}.mp3`)})),this.votDownloadSubtitlesButton.addEventListener("click",(async()=>{const t=this.data.subtitlesDownloadFormat,e=wt(this.yandexSubtitles,t);Z(new Blob(["json"===t?JSON.stringify(e):e],{type:"text/plain"}),`${this.data.downloadWithName?X(this.videoData.title??this.videoData.videoId):`subtitles_${this.videoData.videoId}`}.${t}`)})),this.votSettingsButton.addEventListener("click",(()=>{this.votSettingsDialog.container.hidden=!this.votSettingsDialog.container.hidden,(document.fullscreenElement||document.webkitFullscreenElement)&&(document.webkitExitFullscreen&&document.webkitExitFullscreen(),document.exitFullscreen&&document.exitFullscreen())})),this.votVideoVolumeSlider.input.addEventListener("input",(t=>{const e=Number(t.target.value);this.votVideoVolumeSlider.label.querySelector("strong").textContent=`${e}%`,this.setVideoVolume(e/100),this.data.syncVolume&&this.syncVolumeWrapper("video",e)})),this.votVideoTranslationVolumeSlider.input.addEventListener("input",(t=>{(async()=>{this.data.defaultVolume=Number(t.target.value),await q.set("defaultVolume",this.data.defaultVolume),this.votVideoTranslationVolumeSlider.label.querySelector("strong").textContent=`${this.data.defaultVolume}%`,this.setAudioVolume(this.data.defaultVolume/100),this.data.syncVolume&&(this.syncVolumeWrapper("translation",this.data.defaultVolume),["youtube","googledrive"].includes(this.site.host)&&"mobile"!==this.site.additionalData&&this.setVideoVolume(this.tempOriginalVolume/100))})()}));{this.votAutoTranslateCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.autoTranslate=Number(t.target.checked),await Promise.all([q.set("autoTranslate",this.data.autoTranslate),this.autoTranslate()]),M.log("autoTranslate value changed. New value: ",this.data.autoTranslate)})()})),this.votDontTranslateYourLangSelect.labelElement.addEventListener("change",(t=>{(async()=>{this.data.dontTranslateYourLang=Number(t.target.checked),await q.set("dontTranslateYourLang",this.data.dontTranslateYourLang),M.log("dontTranslateYourLang value changed. New value: ",this.data.dontTranslateYourLang)})()}));const t=async t=>{await q.set("hotkeyButton",t),this.data.hotkeyButton=t,this.changehotkeyButton.textContent=Ke(t)},e=o=>{const a="Escape"===o.code?null:o.code;t(a),document.removeEventListener("keydown",e)};this.changehotkeyButton.addEventListener("click",(()=>{this.changehotkeyButton.textContent=z.get("VOTPressNewHotkey"),document.addEventListener("keydown",e)})),this.votAutoSetVolumeCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.autoSetVolumeYandexStyle=Number(t.target.checked),await q.set("autoSetVolumeYandexStyle",this.data.autoSetVolumeYandexStyle),M.log("autoSetVolumeYandexStyle value changed. New value: ",this.data.autoSetVolumeYandexStyle)})()})),this.votAutoSetVolumeSlider.input.addEventListener("input",(t=>{(async()=>{const e=Number(t.target.value);this.data.autoVolume=(e/100).toFixed(2),await q.set("autoVolume",this.data.autoVolume),this.votAutoSetVolumeSlider.label.querySelector("strong").textContent=`${e}%`})()})),this.votShowVideoSliderCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.showVideoSlider=Number(t.target.checked),await q.set("showVideoSlider",this.data.showVideoSlider),M.log("showVideoSlider value changed. New value: ",this.data.showVideoSlider),this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||"success"!==this.votButton.container.dataset.status})()})),this.votAudioBoosterCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.audioBooster=Number(t.target.checked),await q.set("audioBooster",this.data.audioBooster),M.log("audioBooster value changed. New value: ",this.data.audioBooster);const e=this.votVideoTranslationVolumeSlider.input.value;this.votVideoTranslationVolumeSlider.input.max=this.data.audioBooster?900:100,this.data.audioBooster||(this.votVideoTranslationVolumeSlider.input.value=e>100?100:e,this.votVideoTranslationVolumeSlider.input.dispatchEvent(new Event("input")))})()})),this.votSyncVolumeCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.syncVolume=Number(t.target.checked),await q.set("syncVolume",this.data.syncVolume),M.log("syncVolume value changed. New value: ",this.data.syncVolume)})()})),this.votDownloadWithNameCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.downloadWithName=Number(t.target.checked),await q.set("downloadWithName",this.data.downloadWithName),M.log("downloadWithName value changed. New value: ",this.data.downloadWithName)})()})),this.votTranslationServiceSelect.labelElement.addEventListener("change",(t=>{(async()=>{this.data.translateAPIErrors=Number(t.target.checked),await q.set("translateAPIErrors",this.data.translateAPIErrors),M.log("translateAPIErrors value changed. New value: ",this.data.translateAPIErrors)})()})),this.votSubtitlesDetails.container.addEventListener("click",(()=>{this.votSubtitlesDialog=Te.createDialog(z.get("VOTSubtitlesDesign")),this.votSubtitlesDialog.container.classList.add("vot-dialog-temp"),this.votSubtitlesDialog.container.hidden=!1,this.votSubtitlesDialog.backdrop.onclick=this.votSubtitlesDialog.closeButton.onclick=()=>{this.votSubtitlesDialog.container.remove()},this.votSubtitlesHighlightWordsCheckbox=Te.createCheckbox(z.get("VOTHighlightWords"),this.data?.highlightWords??!1),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesHighlightWordsCheckbox.container),this.votSubtitlesDownloadFormatSelect=Te.createVOTSelect(this.data.subtitlesDownloadFormat.toUpperCase(),z.get("VOTSubtitlesDownloadFormat"),Ye(it,this.data.subtitlesDownloadFormat),{onSelectCb:async t=>{this.data.subtitlesDownloadFormat=t.target.dataset.votValue,await q.set("subtitlesDownloadFormat",this.data.subtitlesDownloadFormat)},labelElement:Te.createVOTSelectLabel(z.get("VOTSubtitlesDownloadFormat"))}),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesDownloadFormatSelect.container),this.votSubtitlesMaxLengthSlider=Te.createSlider(Ut`${z.get("VOTSubtitlesMaxLength")}: - ${this.data?.subtitlesMaxLength??300}`,this.data?.subtitlesMaxLength??300,50,300),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesMaxLengthSlider.container),this.votSubtitlesFontSizeSlider=Te.createSlider(Ut`${z.get("VOTSubtitlesFontSize")}: - ${this.data?.subtitlesFontSize??20}`,this.data?.subtitlesFontSize??20,8,50),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesFontSizeSlider.container),this.votSubtitlesOpacitySlider=Te.createSlider(Ut`${z.get("VOTSubtitlesOpacity")}: - ${this.data?.subtitlesOpacity??20}`,this.data?.subtitlesOpacity??20,0,100),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesOpacitySlider.container),this.votSubtitlesHighlightWordsCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.highlightWords=Number(t.target.checked),await q.set("highlightWords",this.data.highlightWords),M.log("highlightWords value changed. New value: ",this.data.highlightWords),this.subtitlesWidget.setHighlightWords(this.data.highlightWords)})()})),this.votSubtitlesMaxLengthSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesMaxLength=Number(t.target.value),await q.set("subtitlesMaxLength",this.data.subtitlesMaxLength),this.votSubtitlesMaxLengthSlider.label.querySelector("strong").textContent=`${this.data.subtitlesMaxLength}`,this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength)})()})),this.votSubtitlesFontSizeSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesFontSize=Number(t.target.value),await q.set("subtitlesFontSize",this.data.subtitlesFontSize),this.votSubtitlesFontSizeSlider.label.querySelector("strong").textContent=`${this.data.subtitlesFontSize}`,this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize)})()})),this.votSubtitlesOpacitySlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesOpacity=Number(t.target.value),await q.set("subtitlesOpacity",this.data.subtitlesOpacity),this.votSubtitlesOpacitySlider.label.querySelector("strong").textContent=`${this.data.subtitlesOpacity}`,this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity)})()})),document.documentElement.appendChild(this.votSubtitlesDialog.container)})),this.votShowPiPButtonCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.showPiPButton=Number(t.target.checked),await q.set("showPiPButton",this.data.showPiPButton),M.log("showPiPButton value changed. New value: ",this.data.showPiPButton),this.votButton.pipButton.hidden=!Y()||!this.data.showPiPButton,this.votButton.separator2.hidden=!Y()||!this.data.showPiPButton})()})),this.votM3u8ProxyHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.m3u8ProxyHost=t.target.value||E,await q.set("m3u8ProxyHost",this.data.m3u8ProxyHost),M.log("m3u8ProxyHost value changed. New value: ",this.data.m3u8ProxyHost)})()})),this.votProxyWorkerHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.proxyWorkerHost=t.target.value||_,await q.set("proxyWorkerHost",this.data.proxyWorkerHost),M.log("proxyWorkerHost value changed. New value: ",this.data.proxyWorkerHost),this.data.translateProxyEnabled&&(this.votClient.host=this.data.proxyWorkerHost)})()})),this.votAudioProxyCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.audioProxy=Number(t.target.checked),await q.set("audioProxy",this.data.audioProxy),M.log("audioProxy value changed. New value: ",this.data.audioProxy)})()})),this.votBypassMediaCSPCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.bypassMediaCSP=Number(t.target.checked),await q.set("bypassMediaCSP",this.data.bypassMediaCSP),M.log("bypassMediaCSP value changed. New value: ",this.data.bypassMediaCSP),this.stopTranslate()})()})),this.votUpdateLocaleFilesButton.addEventListener("click",(()=>{(async()=>{await q.set("locale-hash",""),await z.update(!0),window.location.reload()})()})),this.votResetSettingsButton.addEventListener("click",(()=>{(async()=>{z.reset();const t=await q.list();for(let e=0;e{this.extraEvents.push({element:t,event:e,handler:o}),t.addEventListener(e,o)},e=(e,o,a)=>{for(const n of o)t(e,n,a)};if(this.resizeObserver=new ResizeObserver((t=>{for(let e=0;e550;this.votButton.container.dataset.position=this.votMenu.container.dataset.position=e?this.data?.buttonPos:"default",this.votButton.container.dataset.direction=this.data?.buttonPos&&"default"!==this.data?.buttonPos&&e?"column":"row"})),this.resizeObserver.observe(this.video),this.votMenu.container.setAttribute("style",`--vot-container-height: ${this.video.getBoundingClientRect().height}px`),["youtube","googledrive"].includes(this.site.host)&&"mobile"!==this.site.additionalData){this.syncVolumeObserver=new MutationObserver((t=>{if(this.audio.src&&this.data.syncVolume)for(let e=0;e{const e=t.target,o=this.votButton.container,a=this.votMenu.container,n=this.container,i=this.votSettingsDialog.container,r=document.querySelector(".vot-dialog-temp"),s=o.contains(e),l=a.contains(e),d=n.contains(e),u=i.contains(e),c=r?.contains(e)??!1;M.log(`[document click] ${s} ${l} ${d} ${u} ${c}`),s||l||u||c||(d||this.logout(0),this.votMenu.container.hidden=!0)})),document.addEventListener("keydown",(async t=>{const e=t.code,o=document.activeElement;["input","textarea"].includes(o.tagName.toLowerCase())||o.isContentEditable||e!==this.data.hotkeyButton||await this.handleTranslationBtnClick()}));let o=this.site.eventSelector?document.querySelector(this.site.eventSelector):this.container;o&&e(o,["mousemove","mouseout"],this.resetTimer),t(this.votButton.container,"mousemove",this.changeOpacityOnEvent),t(this.votMenu.container,"mousemove",this.changeOpacityOnEvent),e(document,["touchstart","touchmove","touchend"],this.changeOpacityOnEvent),t(this.votButton.container,"mousedown",(t=>{t.stopImmediatePropagation()})),t(this.votMenu.container,"mousedown",(t=>{t.stopImmediatePropagation()})),"youtube"===this.site.host&&(this.container.draggable=!1),"googledrive"===this.site.host&&(this.container.style.height="100%"),t(this.video,"canplay",(async()=>{"rutube"===this.site.host&&this.video.src||await this.setCanPlay()})),t(this.video,"emptied",(async()=>{this.video.src&&await dt(this.site,this.video)===this.videoData.videoId||(M.log("lipsync mode is emptied"),this.videoData="",this.stopTranslation())})),["rutube","ok"].includes(this.site.host)||t(this.video,"volumechange",(()=>{this.syncVideoVolumeSlider()})),"youtube"!==this.site.host||this.site.additionalData||t(document,"yt-page-data-updated",(async()=>{M.log("yt-page-data-updated"),window.location.pathname.includes("/shorts/")&&await this.setCanPlay()}))}async setCanPlay(){await dt(this.site,this.video)!==this.videoData.videoId&&(await this.handleSrcChanged(),await this.autoTranslate(),M.log("lipsync mode is canplay"))}logout(t){this.votMenu.container.hidden&&(this.votButton.container.style.opacity=t)}resetTimer=()=>{clearTimeout(this.timer),this.logout(1),this.timer=setTimeout((()=>{this.logout(0)}),1e3)};changeOpacityOnEvent=t=>{clearTimeout(this.timer),this.logout(1),t.stopPropagation()};async changeSubtitlesLang(t){if(M.log("[onchange] subtitles",t),this.votSubtitlesSelect.setSelected(t),"disabled"===t)this.votSubtitlesSelect.setTitle(z.get("VOTSubtitlesDisabled")),this.subtitlesWidget.setContent(null),this.votDownloadSubtitlesButton.hidden=!0,this.yandexSubtitles=null;else{const e=this.subtitlesList.at(parseInt(t));if(1===this.data.audioProxy&&e.url.startsWith("https://brosubs.s3-private.mds.yandex.net/vtrans/")){const t=e.url.replace("https://brosubs.s3-private.mds.yandex.net/vtrans/","");e.url=`https://${this.data.proxyWorkerHost}/video-subtitles/subtitles-proxy/${t}`,console.log(`[VOT] Subs proxied via ${e.url}`)}this.yandexSubtitles=await Be(e),this.subtitlesWidget.setContent(this.yandexSubtitles),this.votDownloadSubtitlesButton.hidden=!1}}async updateSubtitlesLangSelect(){const t=[{label:z.get("VOTSubtitlesDisabled"),value:"disabled",selected:!0,disabled:!1},...this.subtitlesList.map(((t,e)=>({label:(z.get("langs")[t.language]??t.language.toUpperCase())+(t.translatedFromLanguage?` ${z.get("VOTTranslatedFrom")} ${z.get("langs")[t.translatedFromLanguage]??t.translatedFromLanguage.toUpperCase()}`:"")+("yandex"!==t.source?`, ${window.location.hostname}`:"")+(t.isAutoGenerated?` (${z.get("VOTAutogenerated")})`:""),value:e,selected:!1,disabled:!1})))];this.votSubtitlesSelect.updateItems(t),await this.changeSubtitlesLang(t[0].value)}async updateSubtitles(){if(await this.changeSubtitlesLang("disabled"),!this.videoData.videoId)return console.error(`[VOT] ${z.getDefault("VOTNoVideoIDFound")}`),this.subtitlesList=[],this.subtitlesListVideoId=null,this.votButton.container.hidden=!0,void await this.updateSubtitlesLangSelect();if(this.votButton.container.hidden=!1,this.subtitlesListVideoId!==this.videoData.videoId){try{this.subtitlesList=await De(this.votClient,this.videoData)}catch(t){M.log("Error with yandex server, try auto-fix...",t),this.votOpts={fetchFn:Q,hostVOT:$,host:this.data.proxyWorkerHost},this.votClient=new mt(this.votOpts),this.subtitlesList=await De(this.votClient,this.videoData),await q.set("translateProxyEnabled",1)}this.subtitlesList?this.subtitlesListVideoId=this.videoData.videoId:await this.changeSubtitlesLang("disabled"),await this.updateSubtitlesLangSelect()}}getVideoVolume(){let t=this.video?.volume;return["youtube","googledrive"].includes(this.site.host)&&(t=$e.getVideoVolume()??t),t}setVideoVolume(t){if(["youtube","googledrive"].includes(this.site.host)){if($e.setVideoVolume(t))return}this.video.volume=t}getAudioVolume(){return this.gainNode?this.gainNode.gain.value:this.audio.volume}setAudioVolume(t){return this.gainNode?this.gainNode.gain.value=t:this.audio.volume=t}isMuted(){return["youtube","googledrive"].includes(this.site.host)?$e.isMuted():this.video?.muted}syncVideoVolumeSlider(){const t=this.isMuted()?0:100*this.getVideoVolume(),e=Math.round(t);this.votVideoVolumeSlider.input.value=e,this.votVideoVolumeSlider.label.querySelector("strong").textContent=`${e}%`,Te.updateSlider(this.votVideoVolumeSlider.input),1===this.data.syncVolume&&(this.tempOriginalVolume=Number(e))}setSelectMenuValues(t,e){this.votTranslationLanguageSelect.fromSelect.setTitle(z.get("langs")[t]),this.votTranslationLanguageSelect.toSelect.setTitle(z.get("langs")[e]),this.votTranslationLanguageSelect.fromSelect.setSelected(t),this.votTranslationLanguageSelect.toSelect.setSelected(e),console.log(`[VOT] Set translation from ${t} to ${e}`),this.videoData.detectedLanguage=t,this.videoData.responseLanguage=e}syncVolumeWrapper(t,e){const o="translation"===t?this.votVideoVolumeSlider:this.votVideoTranslationVolumeSlider,a=Number(o.input.value),n=function(t,e,o,a){let n=e;return e>a?(n=o+(e-a),n=n>100?100:Math.max(n,0),t.volume=n/100):e100?100:Math.max(n,0),t.volume=n/100),n}("translation"===t?this.video:this.audio,e,a,"translation"===t?this.tempVolume:this.tempOriginalVolume);o.input.value=n,o.label.querySelector("strong").textContent=`${n}%`,Te.updateSlider(o.input),this.tempOriginalVolume="translation"===t?n:e,this.tempVolume="translation"===t?e:n}async getVideoData(){const{duration:t,url:e,videoId:o,host:a,title:n,translationHelp:i,detectedLanguage:r,subtitles:s}=await ut(this.site,this.video),l={translationHelp:i??null,isStream:!1,duration:this.video?.duration||t||y.defaultDuration,videoId:o,url:e,host:a,detectedLanguage:r??this.translateFromLang,responseLanguage:this.translateToLang,subtitles:s,title:n};if("youtube"===this.site.host){const t=await $e.getVideoData();l.isStream=t.isLive,t.title&&(l.detectedLanguage=t.detectedLanguage,l.title=t.localizedTitle)}else if(["rutube","ok.ru","mail_ru"].includes(this.site.host))l.detectedLanguage="ru";else if("youku"===this.site.host)l.detectedLanguage="zh";else if("vk"===this.site.host){const t=document.getElementsByTagName("track")?.[0]?.srclang;l.detectedLanguage=t||"auto"}else"weverse"===this.site.host?l.detectedLanguage="ko":["bilibili","bitchute","rumble","peertube","dailymotion","trovo","yandexdisk","coursehunter","archive","nineanimetv","directlink"].includes(this.site.host)&&(l.detectedLanguage="auto");return l}videoValidator(){if(["youtube","ok.ru","vk"].includes(this.site.host)&&(M.log("VideoValidator videoData: ",this.videoData),1===this.data.dontTranslateYourLang&&this.videoData.detectedLanguage===this.data.dontTranslateLanguage))throw new ct("VOTDisableFromYourLang");if(!this.videoData.isStream&&this.videoData.duration>14400)throw new ct("VOTVideoIsTooLong");return!0}lipsyncAudioContext(t=!1){if(this.playSound&&(this.playSound.playbackRate.value=this.video.playbackRate),t)if("play"!=t){if(["pause","stop","waiting"].includes(t)){M.log(`lipsync mode is ${t}`);try{this.playSound.stop()}catch{}return this.playSound=this.audioContext.createBufferSource(),this.playSound.buffer=this.audioBuffer,void this.playSound.connect(this.gainNode)}if("playing"==t){M.log("lipsync mode is playing");try{this.playSound.start(0,this.audio.currentTime)}catch{}}}else{M.log("lipsync mode is play");try{this.playSound.start(0,this.audio.currentTime)}catch{}}else M.log("lipsync mode is not set")}lipsyncAudio(t=!1){if(t)if("play"!=t){if(["pause","stop","waiting"].includes(t))return M.log(`lipsync mode is ${t}`),void this.audio.pause();"playing"==t&&(M.log("lipsync mode is playing"),this.audio.play())}else{M.log("lipsync mode is play");const t=this.audio.play();void 0!==t&&t.catch((async t=>{if(console.error("[VOT]",t),"NotAllowedError"===t.name)throw this.transformBtn("error",z.get("grantPermissionToAutoPlay")),new ct("grantPermissionToAutoPlay");"NotSupportedError"===t.name&&(this.data.audioProxy=1,await q.set("audioProxy",1))}))}else M.log("lipsync mode is not set")}lipSync(t=!1){if(M.log("lipsync video",this.video),this.video)return this.audio.currentTime=this.video.currentTime,this.audio.playbackRate=this.video.playbackRate,this.needBypassCSP()?this.lipsyncAudioContext(t):this.lipsyncAudio(t)}handleVideoEvent=t=>{M.log(`video ${t.type}`),this.lipSync(t.type)};needBypassCSP=()=>this.data.bypassMediaCSP&&this.site.needBypassCSP;stopTranslate(){for(const t of Ge)this.video.removeEventListener(t,this.handleVideoEvent);if(this.playSound)try{this.playSound.stop(),this.playSound=null}catch{}this.audio.pause(),this.audio.src="",this.audio.removeAttribute("src"),this.votVideoVolumeSlider.container.hidden=!0,this.votVideoTranslationVolumeSlider.container.hidden=!0,this.votDownloadButton.hidden=!0,this.downloadTranslationUrl=null,this.transformBtn("none",z.get("translateVideo")),M.log(`Volume on start: ${this.volumeOnStart}`),this.volumeOnStart&&this.setVideoVolume(this.volumeOnStart),this.volumeOnStart="",clearInterval(this.streamPing),clearTimeout(this.autoRetry),this.hls?.destroy(),this.hls=K(),this.firstSyncVolume=!0}async translateExecutor(t){M.log("Run translateFunc",t),await this.translateFunc(t,this.videoData.isStream,this.videoData.detectedLanguage,this.videoData.responseLanguage,this.videoData.translationHelp)}async updateTranslationErrorMsg(t){const e=z.get("translationTake"),o=z.lang;if("VOTLocalizedError"===t?.name)this.transformBtn("error",t.localizedMessage);else if(t instanceof Error)this.transformBtn("error",t?.message);else if(1!==this.data.translateAPIErrors||t.includes(e)||"ru"===o)this.transformBtn("error",t);else{this.setLoadingBtn(!0);const e=await async function(t,e="",o="ru"){switch(await q.get("translationService",R)){case"yandex":{const a=e&&o?`${e}-${o}`:o;return await Ce.translate(t,a)}case"deepl":return await Ve.translate(t,e,o);default:return t}}(t,"ru",o);this.transformBtn("error",e)}["Подготавливаем перевод","Видео передано в обработку","Ожидаем перевод видео","Загружаем переведенное аудио"].includes(t)&&this.setLoadingBtn(!0)}afterUpdateTranslation(t){this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||"success"!==this.votButton.container.dataset.status,this.votVideoTranslationVolumeSlider.container.hidden="success"!==this.votButton.container.dataset.status,1===this.data.autoSetVolumeYandexStyle&&(this.votVideoVolumeSlider.input.value=100*this.data.autoVolume,this.votVideoVolumeSlider.label.querySelector("strong").textContent=100*this.data.autoVolume+"%",Te.updateSlider(this.votVideoVolumeSlider.input)),this.votDownloadButton.hidden=!1,this.downloadTranslationUrl=t}async validateAudioUrl(t){try{const e=await Q(t,{method:"HEAD",timeout:5e3});if(M.log("Test audio response",e),404===e.status){M.log("Yandex returned not valid audio, trying to fix...");let e=await this.translateVideoImpl(this.videoData,this.videoData.detectedLanguage="auto",this.videoData.responseLanguage,this.videoData.translationHelp);this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage),t=e.url,M.log("Fixed audio audioUrl",t)}else M.log("Valid audioUrl",t)}catch(t){"Timeout"===t.message?(M.log("Request timed out. Handling timeout error..."),this.data.audioProxy=1,await q.set("audioProxy",1)):M.log("Test audio error:",t)}return t}async configurePlaySound(t){try{M.log("[VOT] Trying bypass audio CSP...");const e=await Q(t),o=await e.arrayBuffer();this.audioBuffer=await this.audioContext.decodeAudioData(o),this.playSound=this.audioContext.createBufferSource(),this.playSound.buffer=this.audioBuffer,this.playSound.connect(this.gainNode)}catch(t){console.error("[VOT] Failed to bypass CSP",t),"Timeout"===t.message&&(M.log("Request timed out. Handling timeout error..."),this.data.audioProxy=1,await q.set("audioProxy",1))}}async updateTranslation(t){if(this.cachedTranslation?.url===this.audio.currentSrc?(M.log("[translateFunc] Audio src is the same"),this.audio.src=t):t=await this.validateAudioUrl(t),1===this.data.audioProxy&&t.startsWith("https://vtrans.s3-private.mds.yandex.net/tts/prod/")){const e=t.replace("https://vtrans.s3-private.mds.yandex.net/tts/prod/","");t=`https://${this.data.proxyWorkerHost}/video-translation/audio-proxy/${e}`,console.log(`[VOT] Audio proxied via ${t}`)}if(this.needBypassCSP()?await this.configurePlaySound(t):this.audio.src=t,this.volumeOnStart||(this.volumeOnStart=this.getVideoVolume()),this.setupAudioSettings(),"twitter"===this.site.host)document.querySelector('button[data-testid="app-bar-back"][role="button"]').addEventListener("click",this.stopTranslation);this.video&&!this.video.paused&&this.lipSync("play");for(const t of Ge)this.video.addEventListener(t,this.handleVideoEvent);this.transformBtn("success",z.get("disableTranslate")),this.afterUpdateTranslation(t)}async translateFunc(t,e,o,a,n){if(console.log("[VOT] Video Data: ",this.videoData),M.log("Run videoValidator"),this.videoValidator(),this.setLoadingBtn(!0),e){let t=await this.translateStreamImpl(this.videoData,o,a);if(!t)return void M.log("Skip translation");this.transformBtn("success",z.get("disableTranslate"));const e=this.setHLSSource(t.result.url);if("youtube"===this.site.host&&$e.videoSeek(this.video,10),this.setupAudioSettings(),!this.video.src&&!this.video.currentSrc&&!this.video.srcObject)return this.stopTranslation();this.video&&!this.video.paused&&this.lipSync("play");for(const t of Ge)this.video.addEventListener(t,this.handleVideoEvent);return this.afterUpdateTranslation(e)}if(this.cachedTranslation=this.videoTranslations.find((e=>e.videoId===t&&e.expires>tt()&&e.from===o&&e.to===a)),this.cachedTranslation)return await this.updateTranslation(this.cachedTranslation.url),void M.log("[translateFunc] Cached translation was received");let i=await this.translateVideoImpl(this.videoData,o,a,n);M.log("[translateRes]",i),i?(await this.updateTranslation(i.url),this.subtitlesList.some((t=>"yandex"===t.source&&t.translatedFromLanguage===this.videoData.detectedLanguage&&t.language===this.videoData.responseLanguage))||(this.subtitlesList=await De(this.votClient,this.videoData),await this.updateSubtitlesLangSelect()),this.videoTranslations.push({videoId:t,from:o,to:a,url:this.downloadTranslationUrl,expires:tt()+this.videoTranslationTTL})):M.log("Skip translation")}setupHLS(t){this.hls.on(Hls.Events.MEDIA_ATTACHED,(function(){M.log("audio and hls.js are now bound together !")})),this.hls.on(Hls.Events.MANIFEST_PARSED,(function(t){M.log("manifest loaded, found "+t?.levels?.length+" quality level")})),this.hls.loadSource(t),this.hls.attachMedia(this.audio),this.hls.on(Hls.Events.ERROR,(function(t){if(t.fatal)switch(t.type){case Hls.ErrorTypes.MEDIA_ERROR:console.log("fatal media error encountered, try to recover"),this.hls.recoverMediaError();break;case Hls.ErrorTypes.NETWORK_ERROR:console.error("fatal network error encountered",t);break;default:this.hls.destroy()}})),M.log(this.hls)}setHLSSource(t){const e=`https://${this.data.m3u8ProxyHost}/?all=yes&origin=${encodeURIComponent("https://strm.yandex.ru")}&referer=${encodeURIComponent("https://strm.yandex.ru")}&url=${encodeURIComponent(t)}`;if(this.hls)this.setupHLS(e);else{if(!this.audio.canPlayType("application/vnd.apple.mpegurl"))throw new ct("audioFormatNotSupported");this.audio.src=e}return e}setupAudioSettings(){"number"==typeof this.data.defaultVolume&&this.setAudioVolume(this.data.defaultVolume/100),"number"==typeof this.data.autoSetVolumeYandexStyle&&this.data.autoSetVolumeYandexStyle&&this.setVideoVolume(this.data.autoVolume)}stopTranslation=()=>{this.stopTranslate(),this.syncVideoVolumeSlider()};async handleSrcChanged(){M.log("[VideoHandler] src changed",this),this.firstPlay=!0,this.stopTranslation();const t=!this.video.src&&!this.video.currentSrc&&!this.video.srcObject;this.votButton.container.hidden=t,t&&(this.votMenu.container.hidden=t),this.site.selector||(this.container=this.video.parentElement),this.container.contains(this.votButton.container)||this.container.append(this.votButton.container,this.votMenu.container),await Promise.all([this.videoData=await this.getVideoData(),this.updateSubtitles(),this.translateToLang=this.data.responseLanguage??"ru"]),this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage)}async release(){M.log("[VideoHandler] release"),this.initialized=!1,this.releaseExtraEvents(),this.subtitlesWidget.release(),this.votButton.container.remove(),this.votMenu.container.remove()}}const Ze=new class{constructor(){this.videoCache=new Set,this.onVideoAdded=new qe,this.onVideoRemoved=new qe,this.observer=new MutationObserver(this.handleMutations),this.intersectionObserver=new IntersectionObserver(this.handleIntersections,{threshold:.1})}handleMutations=t=>{window.requestIdleCallback((()=>{for(let e=0;e{for(let e=0;e{if(!t)return;const a=t.querySelectorAll("video");for(let t=0;t{this.videoCache.has(t)||(this.videoCache.add(t),this.intersectionObserver.observe(t))};handleIntersectingVideo=t=>{this.intersectionObserver.unobserve(t),(t=>{if(He.test(t.className)||He.test(t.title))return!0;let e=t.parentElement;for(;e;){if(He.test(e.className)||He.test(e.id))return!0;e=e.parentElement}return!1})(t)||(t=>t.hasAttribute("muted")&&!t.classList.contains("vjs-tech")&&!t.preload)(t)?M.log("The promotional/muted video was ignored",t):((t,e)=>{const o=()=>{(t=>t.readyState>=3)(t)?e(t):requestAnimationFrame(o)};o()})(t,this.handleVideoAdded)};handleVideoAdded=t=>{this.onVideoAdded.dispatch(t)};handleVideoRemoved=t=>{document.contains(t)||(this.videoCache.delete(t),this.onVideoRemoved.dispatch(t))}},Xe=new WeakMap;function Qe(t,e){if(t.shadowRoot){let o=t.selector?Array.from(document.querySelectorAll(t.selector)).find((t=>t.shadowRoot.contains(e))):e.parentElement;return o&&o.shadowRoot?o.parentElement:o}const o=We.browser.version?.split(".")?.[0];if(t.selector?.includes(":not")&&t.selector?.includes("*")&&o&&("Chrome"===We.browser.name&&Number(o)<88||"Firefox"===We.browser.name&&Number(o)<84)){const o=t.selector.split(" *")[0];return o?Array.from(document.querySelectorAll(o)).find((t=>t.contains(e))):e.parentElement}return t.selector?Array.from(document.querySelectorAll(t.selector)).find((t=>t.contains(e))):e.parentElement}(async function(){M.log("Loading extension..."),await z.update(),M.log(`Selected menu language: ${z.lang}`),"https://9animetv.to"===window.location.origin&&window.addEventListener("message",(t=>{if("https://rapid-cloud.co"===t.origin&&"getVideoId"===t.data){const t=/[^/]+$/.exec(window.location.href)?.[0],e=document.querySelector("#iframe-embed")?.contentWindow;e.postMessage(`getVideoId:${t}`,"https://rapid-cloud.co/")}})),Ze.onVideoAdded.addListener((t=>{for(const e of function(){if(/(http(s)?:\/\/)(127\.0\.0\.1|localhost)/.exec(window.location.href))return[];const t=window.location.hostname,e=new URL(window.location),o=o=>o instanceof RegExp?o.test(t):"string"==typeof o?t.includes(o):"function"==typeof o&&o(e);return I.filter((t=>(Array.isArray(t.match)?t.match.some(o):o(t.match))&&t.host&&t.url))}()){if(!e)continue;let o=Qe(e,t);if(o&&(("rumble"!==e.host||t.style.display)&&(["peertube","directlink"].includes(e.host)&&(e.url=window.location.origin),!Xe.has(t)))){Xe.set(t,new Je(t,o,e));break}}})),Ze.onVideoRemoved.addListener((async t=>{Xe.has(t)&&(await Xe.get(t).release(),Xe.delete(t))})),Ze.enable()})().catch((t=>{console.error("[VOT]",t)}))})()})(); \ No newline at end of file + `),this.votMenu.headerContainer.appendChild(this.votSettingsButton),this.votTranslationLanguageSelect=We.createVOTLanguageSelect({fromTitle:Z.get("langs")[this.video.detectedLanguage],fromDialogTitle:Z.get("videoLanguage"),fromItems:xo(dt,this.videoData.detectedLanguage),fromOnSelectCB:async t=>{$.log("[fromOnSelectCB] select from language",t.target.dataset.votValue),this.videoData=await this.getVideoData(),this.setSelectMenuValues(t.target.dataset.votValue,this.videoData.responseLanguage)},toTitle:Z.get("langs")[this.video.responseLanguage],toDialogTitle:Z.get("translationLanguage"),toItems:xo(ut,this.videoData.responseLanguage),toOnSelectCB:async t=>{const e=t.target.dataset.votValue;$.log("[toOnSelectCB] select to language",e),this.data.responseLanguage=this.translateToLang=e,await Y.set("responseLanguage",this.data.responseLanguage),$.log("Response Language value changed. New value: ",this.data.responseLanguage),this.videoData=await this.getVideoData(),this.setSelectMenuValues(this.videoData.detectedLanguage,this.data.responseLanguage)}}),this.votMenu.bodyContainer.appendChild(this.votTranslationLanguageSelect.container),this.votSubtitlesSelect=We.createVOTSelect(Z.get("VOTSubtitlesDisabled"),Z.get("VOTSubtitles"),[{label:Z.get("VOTSubtitlesDisabled"),value:"disabled",selected:!0,disabled:!1}],{onSelectCb:async t=>{await this.changeSubtitlesLang(t.target.dataset.votValue)},labelElement:We.createVOTSelectLabel(Z.get("VOTSubtitles"))}),this.votMenu.bodyContainer.appendChild(this.votSubtitlesSelect.container),this.votVideoVolumeSlider=We.createSlider(Gt`${Z.get("VOTVolume")}: + ${100*this.getVideoVolume()}%`,100*this.getVideoVolume()),this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||"success"!==this.votButton.container.dataset.status,this.votMenu.bodyContainer.appendChild(this.votVideoVolumeSlider.container),this.votVideoTranslationVolumeSlider=We.createSlider(Gt`${Z.get("VOTVolumeTranslation")}: + ${this.data?.defaultVolume??100}%`,this.data?.defaultVolume??100,0,this.data.audioBooster?900:100),this.votVideoTranslationVolumeSlider.container.hidden="success"!==this.votButton.container.dataset.status,this.votMenu.bodyContainer.appendChild(this.votVideoTranslationVolumeSlider.container),this.votMenu.container.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()})),this.votSettingsDialog=We.createDialog(Z.get("VOTSettings")),document.documentElement.appendChild(this.votSettingsDialog.container),this.votTranslationHeader=We.createHeader(Z.get("translationSettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votTranslationHeader),this.votAutoTranslateCheckbox=We.createCheckbox(Z.get("VOTAutoTranslate"),this.data?.autoTranslate??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votAutoTranslateCheckbox.container),this.votDontTranslateYourLangSelect=We.createVOTSelect(Z.get("langs")[this.data.dontTranslateLanguage],Z.get("VOTDontTranslateYourLang"),xo(dt,this.data.dontTranslateLanguage),{onSelectCb:async t=>{this.data.dontTranslateLanguage=t.target.dataset.votValue,await Y.set("dontTranslateLanguage",this.data.dontTranslateLanguage)},labelElement:We.createCheckbox(Z.get("VOTDontTranslateYourLang"),this.data?.dontTranslateYourLang??!0).container}),this.votSettingsDialog.bodyContainer.appendChild(this.votDontTranslateYourLangSelect.container),this.changehotkeyButton=We.createOutlinedButton(So(this.data.hotkeyButton)),this.votSettingsDialog.bodyContainer.appendChild(this.changehotkeyButton),this.votAutoSetVolumeCheckbox=We.createCheckbox(`${Z.get("VOTAutoSetVolume")}`,this.data?.autoSetVolumeYandexStyle??!0),this.votSettingsDialog.bodyContainer.appendChild(this.votAutoSetVolumeCheckbox.container),this.votAutoSetVolumeSlider=We.createSlider(Gt`${Math.round(100*(this.data?.autoVolume??U))}%`,Math.round(100*(this.data?.autoVolume??U)),0,100),this.votSettingsDialog.bodyContainer.appendChild(this.votAutoSetVolumeSlider.container),this.votShowVideoSliderCheckbox=We.createCheckbox(Z.get("VOTShowVideoSlider"),this.data?.showVideoSlider??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votShowVideoSliderCheckbox.container),this.votAudioBoosterCheckbox=We.createCheckbox(Z.get("VOTAudioBooster"),this.data?.audioBooster??!1),this.audioContext||(this.votAudioBoosterCheckbox.input.disabled=!0,this.votAudioBoosterCheckbox.container.title=Z.get("VOTNeedWebAudioAPI")),this.votSettingsDialog.bodyContainer.appendChild(this.votAudioBoosterCheckbox.container),this.votSyncVolumeCheckbox=We.createCheckbox(Z.get("VOTSyncVolume"),this.data?.syncVolume??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votSyncVolumeCheckbox.container),this.votDownloadWithNameCheckbox=We.createCheckbox(Z.get("VOTDownloadWithName"),this.data?.downloadWithName??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votDownloadWithNameCheckbox.container),this.votTranslationServiceSelect=We.createVOTSelect(this.data.translationService.toUpperCase(),Z.get("VOTTranslationService"),xo(Te,this.data.translationService),{onSelectCb:async t=>{this.data.translationService=t.target.dataset.votValue,await Y.set("translationService",this.data.translationService)},labelElement:We.createCheckbox(Z.get("VOTTranslateAPIErrors"),this.data.translateAPIErrors??!0).container}),this.votTranslationServiceSelect.container.hidden="ru"===Z.lang,this.votSettingsDialog.bodyContainer.appendChild(this.votTranslationServiceSelect.container),this.votDetectServiceSelect=We.createVOTSelect(this.data.detectService.toUpperCase(),Z.get("VOTDetectService"),xo(Ce,this.data.detectService),{onSelectCb:async t=>{this.data.detectService=t.target.dataset.votValue,await Y.set("detectService",this.data.detectService)},labelElement:We.createVOTSelectLabel(Z.get("VOTDetectService"))}),this.votSettingsDialog.bodyContainer.appendChild(this.votDetectServiceSelect.container),this.votSubtitlesHeader=We.createHeader(Z.get("subtitlesSettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votSubtitlesHeader),this.votSubtitlesDetails=We.createDetails(Z.get("VOTSubtitlesDesign")),this.votSettingsDialog.bodyContainer.appendChild(this.votSubtitlesDetails.container),this.votProxyHeader=We.createHeader(Z.get("proxySettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votProxyHeader),this.votM3u8ProxyHostTextfield=We.createTextfield(Z.get("VOTM3u8ProxyHost"),this.data?.m3u8ProxyHost,D),this.votSettingsDialog.bodyContainer.appendChild(this.votM3u8ProxyHostTextfield.container),this.votProxyWorkerHostTextfield=We.createTextfield(Z.get("VOTProxyWorkerHost"),this.data?.proxyWorkerHost,F),this.votSettingsDialog.bodyContainer.appendChild(this.votProxyWorkerHostTextfield.container),this.votAudioProxyCheckbox=We.createCheckbox(Z.get("VOTAudioProxy"),this.data?.audioProxy??!1),this.votSettingsDialog.bodyContainer.appendChild(this.votAudioProxyCheckbox.container),this.votNewAudioPlayerCheckbox=We.createCheckbox(Z.get("VOTNewAudioPlayer"),this.data?.newAudioPlayer??!1),this.audioContext||(this.votNewAudioPlayerCheckbox.input.disabled=!0,this.votNewAudioPlayerCheckbox.container.title=Z.get("VOTNeedWebAudioAPI")),this.votSettingsDialog.bodyContainer.appendChild(this.votNewAudioPlayerCheckbox.container),this.votOnlyBypassMediaCSPCheckbox=We.createCheckbox(Z.get("VOTOnlyBypassMediaCSP")+(this.site.needBypassCSP?` (${Z.get("VOTMediaCSPEnabledOnSite")})`:""),this.data?.onlyBypassMediaCSP??!1),this.votOnlyBypassMediaCSPCheckbox.container.classList.add("vot-checkbox-sub"),this.audioContext||(this.votOnlyBypassMediaCSPCheckbox.container.title=Z.get("VOTNeedWebAudioAPI")),this.votOnlyBypassMediaCSPCheckbox.input.disabled=!this.data.newAudioPlayer&&this.audioContext,this.data.newAudioPlayer||(this.votOnlyBypassMediaCSPCheckbox.container.hidden=!0),this.votSettingsDialog.bodyContainer.appendChild(this.votOnlyBypassMediaCSPCheckbox.container),this.votAboutHeader=We.createHeader(Z.get("about")),this.votSettingsDialog.bodyContainer.appendChild(this.votAboutHeader),this.votLanguageSelect=We.createVOTSelect(Z.get("langs")[Y.syncGet("locale-lang-override","auto")],Z.get("VOTMenuLanguage"),xo(K,Y.syncGet("locale-lang-override","auto")),{onSelectCb:async t=>{await Y.set("locale-lang-override",t.target.dataset.votValue)},labelElement:We.createVOTSelectLabel(Z.get("VOTMenuLanguage"))}),this.votSettingsDialog.bodyContainer.appendChild(this.votLanguageSelect.container),this.votShowPiPButtonCheckbox=We.createCheckbox(Z.get("VOTShowPiPButton"),this.data?.showPiPButton??!1),this.votShowPiPButtonCheckbox.container.hidden=!tt(),this.votSettingsDialog.bodyContainer.appendChild(this.votShowPiPButtonCheckbox.container),this.votVersionInfo=We.createInformation(`${Z.get("VOTVersion")}:`,GM_info.script.version),this.votSettingsDialog.bodyContainer.appendChild(this.votVersionInfo.container),this.votAuthorsInfo=We.createInformation(`${Z.get("VOTAuthors")}:`,GM_info.script.author),this.votSettingsDialog.bodyContainer.appendChild(this.votAuthorsInfo.container),this.votLoaderInfo=We.createInformation(`${Z.get("VOTLoader")}:`,`${GM_info.scriptHandler} v${GM_info.version}`),this.votSettingsDialog.bodyContainer.appendChild(this.votLoaderInfo.container),this.votBrowserInfo=We.createInformation(`${Z.get("VOTBrowser")}:`,`${wo.browser.name} ${wo.browser.version} (${wo.os.name} ${wo.os.version})`),this.votSettingsDialog.bodyContainer.appendChild(this.votBrowserInfo.container),this.votLocaleInfo=We.createInformation(`${Z.get("VOTLocaleHash")}:`,Gt`${this.data.localeHash}
(${Z.get("VOTUpdatedAt")} + ${new Date(1e3*this.data.localeUpdatedAt).toLocaleString()})`),this.votSettingsDialog.bodyContainer.appendChild(this.votLocaleInfo.container),this.votUpdateLocaleFilesButton=We.createOutlinedButton(Z.get("VOTUpdateLocaleFiles")),this.votSettingsDialog.bodyContainer.appendChild(this.votUpdateLocaleFilesButton),this.votResetSettingsButton=We.createButton(Z.get("resetSettings")),this.votSettingsDialog.bodyContainer.appendChild(this.votResetSettingsButton)}async handleTranslationBtnClick(){if($.log("[click translationBtn]",this.audioPlayer,this.audioPlayer.player),this.audioPlayer.player.src)return $.log("[click translationBtn] audio.src is not empty",this.audioPlayer.player.src),void this.stopTranslate();if(this.hls.url)return $.log("[click translationBtn] hls is not empty",this.hls.url),void this.stopTranslate();try{if($.log("[click translationBtn] trying execute translation"),!this.videoData.videoId)throw new ht("VOTNoVideoIDFound");"vk"===this.site.host&&"clips"===this.site.additionalData&&(this.videoData=await this.getVideoData()),await this.translateExecutor(this.videoData.videoId)}catch(t){console.error("[VOT]",t),"VOTLocalizedError"===t?.name?this.transformBtn("error",t.localizedMessage):this.transformBtn("error",t?.message)}}initUIEvents(){this.votButton.translateButton.addEventListener("click",(async()=>{await this.handleTranslationBtnClick()})),this.votButton.pipButton.addEventListener("click",(()=>{(async()=>{this.video!==document.pictureInPictureElement?await this.video.requestPictureInPicture():await document.exitPictureInPicture()})()})),this.votButton.menuButton.addEventListener("click",(()=>{this.votMenu.container.hidden=!this.votMenu.container.hidden})),this.votButton.container.addEventListener("mousedown",(()=>{this.dragging=!0})),this.container.addEventListener("mouseup",(()=>{this.dragging=!1})),this.container.addEventListener("mousemove",(async t=>{if(this.dragging){t.preventDefault();const e=t.clientX/this.container.clientWidth*100,o=this.container.clientWidth>550,i=e<=44?"left":e>=66?"right":"default";this.data.buttonPos=o?i:"default",this.votButton.container.dataset.direction="default"===this.data.buttonPos?"row":"column",this.votButton.container.dataset.position=this.data.buttonPos,this.votMenu.container.dataset.position=this.data.buttonPos,o&&await Y.set("buttonPos",this.data.buttonPos)}})),this.votDownloadButton.addEventListener("click",(async()=>{if(!this.downloadTranslationUrl)return;if(!this.data.downloadWithName)return window.open(this.downloadTranslationUrl,"_blank").focus();const t=document.querySelector("#vot-loader-download"),e=getComputedStyle(this.votMenu.container).getPropertyValue("--vot-primary-rgb"),o=We.animateLoader(t,e),i=await nt(this.downloadTranslationUrl),a=i.body.getReader(),n=+i.headers.get("Content-Length");let r=0;const s=[];for(;;){const{done:t,value:e}=await a.read();if(t)break;s.push(e),r+=e.length,o(Math.round(r/n*100))}We.afterAnimateLoader(t,e);const l=new Blob(s),d=at(this.videoData.title??this.videoData.videoId),u=await l.arrayBuffer(),c=new we(u);c.setFrame("TIT2",d),c.addTag(),it(c.getBlob(),`${d}.mp3`)})),this.votDownloadSubtitlesButton.addEventListener("click",(async()=>{const t=this.data.subtitlesDownloadFormat,e=Ct(this.yandexSubtitles,t);it(new Blob(["json"===t?JSON.stringify(e):e],{type:"text/plain"}),`${this.data.downloadWithName?at(this.videoData.title??this.videoData.videoId):`subtitles_${this.videoData.videoId}`}.${t}`)})),this.votSettingsButton.addEventListener("click",(()=>{this.votSettingsDialog.container.hidden=!this.votSettingsDialog.container.hidden,(document.fullscreenElement||document.webkitFullscreenElement)&&(document.webkitExitFullscreen&&document.webkitExitFullscreen(),document.exitFullscreen&&document.exitFullscreen())})),this.votVideoVolumeSlider.input.addEventListener("input",(t=>{const e=Number(t.target.value);this.votVideoVolumeSlider.label.querySelector("strong").textContent=`${e}%`,this.setVideoVolume(e/100),this.data.syncVolume&&this.syncVolumeWrapper("video",e)})),this.votVideoTranslationVolumeSlider.input.addEventListener("input",(t=>{(async()=>{this.data.defaultVolume=Number(t.target.value),await Y.set("defaultVolume",this.data.defaultVolume),this.votVideoTranslationVolumeSlider.label.querySelector("strong").textContent=`${this.data.defaultVolume}%`,this.audioPlayer.player.volume=this.data.defaultVolume/100,this.data.syncVolume&&(this.syncVolumeWrapper("translation",this.data.defaultVolume),["youtube","googledrive"].includes(this.site.host)&&"mobile"!==this.site.additionalData&&this.setVideoVolume(this.tempOriginalVolume/100))})()}));{this.votAutoTranslateCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.autoTranslate=Number(t.target.checked),await Promise.all([Y.set("autoTranslate",this.data.autoTranslate),this.autoTranslate()]),$.log("autoTranslate value changed. New value: ",this.data.autoTranslate)})()})),this.votDontTranslateYourLangSelect.labelElement.addEventListener("change",(t=>{(async()=>{this.data.dontTranslateYourLang=Number(t.target.checked),await Y.set("dontTranslateYourLang",this.data.dontTranslateYourLang),$.log("dontTranslateYourLang value changed. New value: ",this.data.dontTranslateYourLang)})()}));const t=async t=>{await Y.set("hotkeyButton",t),this.data.hotkeyButton=t,this.changehotkeyButton.textContent=So(t)},e=o=>{const i="Escape"===o.code?null:o.code;t(i),document.removeEventListener("keydown",e)};this.changehotkeyButton.addEventListener("click",(()=>{this.changehotkeyButton.textContent=Z.get("VOTPressNewHotkey"),document.addEventListener("keydown",e)})),this.votAutoSetVolumeCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.autoSetVolumeYandexStyle=Number(t.target.checked),await Y.set("autoSetVolumeYandexStyle",this.data.autoSetVolumeYandexStyle),$.log("autoSetVolumeYandexStyle value changed. New value: ",this.data.autoSetVolumeYandexStyle)})()})),this.votAutoSetVolumeSlider.input.addEventListener("input",(t=>{(async()=>{const e=Number(t.target.value);this.data.autoVolume=(e/100).toFixed(2),await Y.set("autoVolume",this.data.autoVolume),this.votAutoSetVolumeSlider.label.querySelector("strong").textContent=`${e}%`})()})),this.votShowVideoSliderCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.showVideoSlider=Number(t.target.checked),await Y.set("showVideoSlider",this.data.showVideoSlider),$.log("showVideoSlider value changed. New value: ",this.data.showVideoSlider),this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||"success"!==this.votButton.container.dataset.status})()})),this.votAudioBoosterCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.audioBooster=Number(t.target.checked),await Y.set("audioBooster",this.data.audioBooster),$.log("audioBooster value changed. New value: ",this.data.audioBooster);const e=this.votVideoTranslationVolumeSlider.input.value;this.votVideoTranslationVolumeSlider.input.max=this.data.audioBooster?900:100,this.data.audioBooster||(this.votVideoTranslationVolumeSlider.input.value=e>100?100:e,this.votVideoTranslationVolumeSlider.input.dispatchEvent(new Event("input")))})()})),this.votSyncVolumeCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.syncVolume=Number(t.target.checked),await Y.set("syncVolume",this.data.syncVolume),$.log("syncVolume value changed. New value: ",this.data.syncVolume)})()})),this.votDownloadWithNameCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.downloadWithName=Number(t.target.checked),await Y.set("downloadWithName",this.data.downloadWithName),$.log("downloadWithName value changed. New value: ",this.data.downloadWithName)})()})),this.votTranslationServiceSelect.labelElement.addEventListener("change",(t=>{(async()=>{this.data.translateAPIErrors=Number(t.target.checked),await Y.set("translateAPIErrors",this.data.translateAPIErrors),$.log("translateAPIErrors value changed. New value: ",this.data.translateAPIErrors)})()})),this.votSubtitlesDetails.container.addEventListener("click",(()=>{this.votSubtitlesDialog=We.createDialog(Z.get("VOTSubtitlesDesign")),this.votSubtitlesDialog.container.classList.add("vot-dialog-temp"),this.votSubtitlesDialog.container.hidden=!1,this.votSubtitlesDialog.backdrop.onclick=this.votSubtitlesDialog.closeButton.onclick=()=>{this.votSubtitlesDialog.container.remove()},this.votSubtitlesHighlightWordsCheckbox=We.createCheckbox(Z.get("VOTHighlightWords"),this.data?.highlightWords??!1),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesHighlightWordsCheckbox.container),this.votSubtitlesDownloadFormatSelect=We.createVOTSelect(this.data.subtitlesDownloadFormat.toUpperCase(),Z.get("VOTSubtitlesDownloadFormat"),xo(ct,this.data.subtitlesDownloadFormat),{onSelectCb:async t=>{this.data.subtitlesDownloadFormat=t.target.dataset.votValue,await Y.set("subtitlesDownloadFormat",this.data.subtitlesDownloadFormat)},labelElement:We.createVOTSelectLabel(Z.get("VOTSubtitlesDownloadFormat"))}),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesDownloadFormatSelect.container),this.votSubtitlesMaxLengthSlider=We.createSlider(Gt`${Z.get("VOTSubtitlesMaxLength")}: + ${this.data?.subtitlesMaxLength??300}`,this.data?.subtitlesMaxLength??300,50,300),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesMaxLengthSlider.container),this.votSubtitlesFontSizeSlider=We.createSlider(Gt`${Z.get("VOTSubtitlesFontSize")}: + ${this.data?.subtitlesFontSize??20}`,this.data?.subtitlesFontSize??20,8,50),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesFontSizeSlider.container),this.votSubtitlesOpacitySlider=We.createSlider(Gt`${Z.get("VOTSubtitlesOpacity")}: + ${this.data?.subtitlesOpacity??20}`,this.data?.subtitlesOpacity??20,0,100),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesOpacitySlider.container),this.votSubtitlesHighlightWordsCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.highlightWords=Number(t.target.checked),await Y.set("highlightWords",this.data.highlightWords),$.log("highlightWords value changed. New value: ",this.data.highlightWords),this.subtitlesWidget.setHighlightWords(this.data.highlightWords)})()})),this.votSubtitlesMaxLengthSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesMaxLength=Number(t.target.value),await Y.set("subtitlesMaxLength",this.data.subtitlesMaxLength),this.votSubtitlesMaxLengthSlider.label.querySelector("strong").textContent=`${this.data.subtitlesMaxLength}`,this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength)})()})),this.votSubtitlesFontSizeSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesFontSize=Number(t.target.value),await Y.set("subtitlesFontSize",this.data.subtitlesFontSize),this.votSubtitlesFontSizeSlider.label.querySelector("strong").textContent=`${this.data.subtitlesFontSize}`,this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize)})()})),this.votSubtitlesOpacitySlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesOpacity=Number(t.target.value),await Y.set("subtitlesOpacity",this.data.subtitlesOpacity),this.votSubtitlesOpacitySlider.label.querySelector("strong").textContent=`${this.data.subtitlesOpacity}`,this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity)})()})),document.documentElement.appendChild(this.votSubtitlesDialog.container)})),this.votShowPiPButtonCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.showPiPButton=Number(t.target.checked),await Y.set("showPiPButton",this.data.showPiPButton),$.log("showPiPButton value changed. New value: ",this.data.showPiPButton),this.votButton.pipButton.hidden=!tt()||!this.data.showPiPButton,this.votButton.separator2.hidden=!tt()||!this.data.showPiPButton})()})),this.votM3u8ProxyHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.m3u8ProxyHost=t.target.value||D,await Y.set("m3u8ProxyHost",this.data.m3u8ProxyHost),$.log("m3u8ProxyHost value changed. New value: ",this.data.m3u8ProxyHost)})()})),this.votProxyWorkerHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.proxyWorkerHost=t.target.value||F,await Y.set("proxyWorkerHost",this.data.proxyWorkerHost),$.log("proxyWorkerHost value changed. New value: ",this.data.proxyWorkerHost),this.data.translateProxyEnabled&&(this.votClient.host=this.data.proxyWorkerHost)})()})),this.votAudioProxyCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.audioProxy=Number(t.target.checked),await Y.set("audioProxy",this.data.audioProxy),$.log("audioProxy value changed. New value: ",this.data.audioProxy)})()})),this.votOnlyBypassMediaCSPCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.onlyBypassMediaCSP=Number(t.target.checked),await Y.set("onlyBypassMediaCSP",this.data.onlyBypassMediaCSP),$.log("onlyBypassMediaCSP value changed. New value: ",this.data.onlyBypassMediaCSP),this.stopTranslate(),this.createPlayer()})()})),this.votNewAudioPlayerCheckbox.input.addEventListener("change",(t=>{(async()=>{const e=t.target.checked;this.data.newAudioPlayer=Number(e),await Y.set("newAudioPlayer",this.data.newAudioPlayer),$.log("newAudioPlayer value changed. New value: ",this.data.newAudioPlayer),this.stopTranslate(),this.createPlayer(),this.votOnlyBypassMediaCSPCheckbox.input.disabled=this.votOnlyBypassMediaCSPCheckbox.container.hidden=!e})()})),this.votUpdateLocaleFilesButton.addEventListener("click",(()=>{(async()=>{await Y.set("locale-hash",""),await Z.update(!0),window.location.reload()})()})),this.votResetSettingsButton.addEventListener("click",(()=>{(async()=>{Z.reset();const t=await Y.list();for(let e=0;e{this.extraEvents.push({element:t,event:e,handler:o}),t.addEventListener(e,o)},e=(e,o,i)=>{for(const a of o)t(e,a,i)};if(this.resizeObserver=new ResizeObserver((t=>{for(let e=0;e550;this.votButton.container.dataset.position=this.votMenu.container.dataset.position=e?this.data?.buttonPos:"default",this.votButton.container.dataset.direction=this.data?.buttonPos&&"default"!==this.data?.buttonPos&&e?"column":"row"})),this.resizeObserver.observe(this.video),this.votMenu.container.setAttribute("style",`--vot-container-height: ${this.video.getBoundingClientRect().height}px`),["youtube","googledrive"].includes(this.site.host)&&"mobile"!==this.site.additionalData){this.syncVolumeObserver=new MutationObserver((t=>{if(this.audioPlayer.player.src&&this.data.syncVolume)for(let e=0;e{const e=t.target,o=this.votButton.container,i=this.votMenu.container,a=this.container,n=this.votSettingsDialog.container,r=document.querySelector(".vot-dialog-temp"),s=o.contains(e),l=i.contains(e),d=a.contains(e),u=n.contains(e),c=r?.contains(e)??!1;$.log(`[document click] ${s} ${l} ${d} ${u} ${c}`),s||l||u||c||(d||this.logout(0),this.votMenu.container.hidden=!0)})),document.addEventListener("keydown",(async t=>{const e=t.code,o=document.activeElement;["input","textarea"].includes(o.tagName.toLowerCase())||o.isContentEditable||e!==this.data.hotkeyButton||await this.handleTranslationBtnClick()}));let o=this.site.eventSelector?document.querySelector(this.site.eventSelector):this.container;o&&e(o,["mousemove","mouseout"],this.resetTimer),t(this.votButton.container,"mousemove",this.changeOpacityOnEvent),t(this.votMenu.container,"mousemove",this.changeOpacityOnEvent),e(document,["touchstart","touchmove","touchend"],this.changeOpacityOnEvent),t(this.votButton.container,"mousedown",(t=>{t.stopImmediatePropagation()})),t(this.votMenu.container,"mousedown",(t=>{t.stopImmediatePropagation()})),"youtube"===this.site.host&&(this.container.draggable=!1),"googledrive"===this.site.host&&(this.container.style.height="100%"),t(this.video,"canplay",(async()=>{"rutube"===this.site.host&&this.video.src||await this.setCanPlay()})),t(this.video,"emptied",(async()=>{this.video.src&&await vt(this.site,this.video)===this.videoData.videoId||($.log("lipsync mode is emptied"),this.videoData="",this.stopTranslation())})),["rutube","ok"].includes(this.site.host)||t(this.video,"volumechange",(()=>{this.syncVideoVolumeSlider()})),"youtube"!==this.site.host||this.site.additionalData||t(document,"yt-page-data-updated",(async()=>{$.log("yt-page-data-updated"),window.location.pathname.includes("/shorts/")&&await this.setCanPlay()}))}async setCanPlay(){await vt(this.site,this.video)!==this.videoData.videoId&&(await this.handleSrcChanged(),await this.autoTranslate(),$.log("lipsync mode is canplay"))}logout(t){this.votMenu.container.hidden&&(this.votButton.container.style.opacity=t)}resetTimer=()=>{clearTimeout(this.timer),this.logout(1),this.timer=setTimeout((()=>{this.logout(0)}),1e3)};changeOpacityOnEvent=t=>{clearTimeout(this.timer),this.logout(1),t.stopPropagation()};async changeSubtitlesLang(t){if($.log("[onchange] subtitles",t),this.votSubtitlesSelect.setSelected(t),"disabled"===t)this.votSubtitlesSelect.setTitle(Z.get("VOTSubtitlesDisabled")),this.subtitlesWidget.setContent(null),this.votDownloadSubtitlesButton.hidden=!0,this.yandexSubtitles=null;else{const e=this.subtitlesList.at(parseInt(t));if(1===this.data.audioProxy&&e.url.startsWith("https://brosubs.s3-private.mds.yandex.net/vtrans/")){const t=e.url.replace("https://brosubs.s3-private.mds.yandex.net/vtrans/","");e.url=`https://${this.data.proxyWorkerHost}/video-subtitles/subtitles-proxy/${t}`,console.log(`[VOT] Subs proxied via ${e.url}`)}this.yandexSubtitles=await Ee(e),this.subtitlesWidget.setContent(this.yandexSubtitles),this.votDownloadSubtitlesButton.hidden=!1}}async updateSubtitlesLangSelect(){const t=[{label:Z.get("VOTSubtitlesDisabled"),value:"disabled",selected:!0,disabled:!1},...this.subtitlesList.map(((t,e)=>({label:(Z.get("langs")[t.language]??t.language.toUpperCase())+(t.translatedFromLanguage?` ${Z.get("VOTTranslatedFrom")} ${Z.get("langs")[t.translatedFromLanguage]??t.translatedFromLanguage.toUpperCase()}`:"")+("yandex"!==t.source?`, ${window.location.hostname}`:"")+(t.isAutoGenerated?` (${Z.get("VOTAutogenerated")})`:""),value:e,selected:!1,disabled:!1})))];this.votSubtitlesSelect.updateItems(t),await this.changeSubtitlesLang(t[0].value)}async updateSubtitles(){if(await this.changeSubtitlesLang("disabled"),!this.videoData.videoId)return console.error(`[VOT] ${Z.getDefault("VOTNoVideoIDFound")}`),this.subtitlesList=[],this.subtitlesListVideoId=null,this.votButton.container.hidden=!0,void await this.updateSubtitlesLangSelect();if(this.votButton.container.hidden=!1,this.subtitlesListVideoId!==this.videoData.videoId){try{this.subtitlesList=await Be(this.votClient,this.videoData)}catch(t){$.log("Error with yandex server, try auto-fix...",t),this.votOpts={fetchFn:nt,hostVOT:q,host:this.data.proxyWorkerHost},this.votClient=new wt(this.votOpts),this.subtitlesList=await Be(this.votClient,this.videoData),await Y.set("translateProxyEnabled",1)}this.subtitlesList?this.subtitlesListVideoId=this.videoData.videoId:await this.changeSubtitlesLang("disabled"),await this.updateSubtitlesLangSelect()}}getVideoVolume(){let t=this.video?.volume;return["youtube","googledrive"].includes(this.site.host)&&(t=Ve.getVideoVolume()??t),t}setVideoVolume(t){if(["youtube","googledrive"].includes(this.site.host)){if(Ve.setVideoVolume(t))return this}return this.video.volume=t,this}isMuted(){return["youtube","googledrive"].includes(this.site.host)?Ve.isMuted():this.video?.muted}syncVideoVolumeSlider(){const t=this.isMuted()?0:100*this.getVideoVolume(),e=Math.round(t);this.votVideoVolumeSlider.input.value=e,this.votVideoVolumeSlider.label.querySelector("strong").textContent=`${e}%`,We.updateSlider(this.votVideoVolumeSlider.input),1===this.data.syncVolume&&(this.tempOriginalVolume=Number(e))}setSelectMenuValues(t,e){this.votTranslationLanguageSelect.fromSelect.setTitle(Z.get("langs")[t]),this.votTranslationLanguageSelect.toSelect.setTitle(Z.get("langs")[e]),this.votTranslationLanguageSelect.fromSelect.setSelected(t),this.votTranslationLanguageSelect.toSelect.setSelected(e),console.log(`[VOT] Set translation from ${t} to ${e}`),this.videoData.detectedLanguage=t,this.videoData.responseLanguage=e}syncVolumeWrapper(t,e){const o="translation"===t?this.votVideoVolumeSlider:this.votVideoTranslationVolumeSlider,i=Number(o.input.value),a=function(t,e,o,i){let a=e;return e>i?(a=o+(e-i),a=a>100?100:Math.max(a,0),t.volume=a/100):e100?100:Math.max(a,0),t.volume=a/100),a}("translation"===t?this.video:this.audioPlayer.player,e,i,"translation"===t?this.tempVolume:this.tempOriginalVolume);o.input.value=a,o.label.querySelector("strong").textContent=`${a}%`,We.updateSlider(o.input),this.tempOriginalVolume="translation"===t?a:e,this.tempVolume="translation"===t?e:a}async getVideoData(){const{duration:t,url:e,videoId:o,host:i,title:a,translationHelp:n,detectedLanguage:r,subtitles:s}=await ft(this.site,this.video),l={translationHelp:n??null,isStream:!1,duration:this.video?.duration||t||P.defaultDuration,videoId:o,url:e,host:i,detectedLanguage:r??this.translateFromLang,responseLanguage:this.translateToLang,subtitles:s,title:a};if("youtube"===this.site.host){const t=await Ve.getVideoData();l.isStream=t.isLive,t.title&&(l.detectedLanguage=t.detectedLanguage,l.title=t.localizedTitle)}else if(["rutube","ok.ru","mail_ru"].includes(this.site.host))l.detectedLanguage="ru";else if("youku"===this.site.host)l.detectedLanguage="zh";else if("vk"===this.site.host){const t=document.getElementsByTagName("track")?.[0]?.srclang;l.detectedLanguage=t||"auto"}else"weverse"===this.site.host?l.detectedLanguage="ko":["bilibili","bitchute","rumble","peertube","dailymotion","trovo","yandexdisk","coursehunterLike","archive","nineanimetv","directlink"].includes(this.site.host)&&(l.detectedLanguage="auto");return l}videoValidator(){if(["youtube","ok.ru","vk"].includes(this.site.host)&&($.log("VideoValidator videoData: ",this.videoData),1===this.data.dontTranslateYourLang&&this.videoData.detectedLanguage===this.data.dontTranslateLanguage))throw new ht("VOTDisableFromYourLang");if(!this.videoData.isStream&&this.videoData.duration>14400)throw new ht("VOTVideoIsTooLong");return!0}stopTranslate(){this.audioPlayer.player.removeVideoEvents(),this.audioPlayer.player.clear(),this.audioPlayer.player.src=void 0,$.log("audioPlayer after stopTranslate",this.audioPlayer),this.votVideoVolumeSlider.container.hidden=!0,this.votVideoTranslationVolumeSlider.container.hidden=!0,this.votDownloadButton.hidden=!0,this.downloadTranslationUrl=null,this.transformBtn("none",Z.get("translateVideo")),$.log(`Volume on start: ${this.volumeOnStart}`),this.volumeOnStart&&this.setVideoVolume(this.volumeOnStart),clearInterval(this.streamPing),clearTimeout(this.autoRetry),this.hls?.destroy(),this.hls=et(),this.firstSyncVolume=!0}async translateExecutor(t){$.log("Run translateFunc",t),await this.translateFunc(t,this.videoData.isStream,this.videoData.detectedLanguage,this.videoData.responseLanguage,this.videoData.translationHelp)}async updateTranslationErrorMsg(t){const e=Z.get("translationTake"),o=Z.lang;if("VOTLocalizedError"===t?.name)this.transformBtn("error",t.localizedMessage);else if(t instanceof Error)this.transformBtn("error",t?.message);else if(1!==this.data.translateAPIErrors||t.includes(e)||"ru"===o)this.transformBtn("error",t);else{this.setLoadingBtn(!0);const e=await async function(t,e="",o="ru"){switch(await Y.get("translationService",H)){case"yandex":{const i=e&&o?`${e}-${o}`:o;return await xe.translate(t,i)}case"deepl":return await ke.translate(t,e,o);default:return t}}(t,"ru",o);this.transformBtn("error",e)}["Подготавливаем перевод","Видео передано в обработку","Ожидаем перевод видео","Загружаем переведенное аудио"].includes(t)&&this.setLoadingBtn(!0)}afterUpdateTranslation(t){this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||"success"!==this.votButton.container.dataset.status,this.votVideoTranslationVolumeSlider.container.hidden="success"!==this.votButton.container.dataset.status,1===this.data.autoSetVolumeYandexStyle&&(this.votVideoVolumeSlider.input.value=100*this.data.autoVolume,this.votVideoVolumeSlider.label.querySelector("strong").textContent=100*this.data.autoVolume+"%",We.updateSlider(this.votVideoVolumeSlider.input)),this.votDownloadButton.hidden=!1,this.downloadTranslationUrl=t}async validateAudioUrl(t){try{const e=await nt(t,{method:"HEAD",timeout:5e3});if($.log("Test audio response",e),404!==e.status)return $.log("Valid audioUrl",t),t;$.log("Yandex returned not valid audio, trying to fix...");let o=await this.translateVideoImpl(this.videoData,this.videoData.detectedLanguage="auto",this.videoData.responseLanguage,this.videoData.translationHelp);this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage),t=o.url,$.log("Fixed audio audioUrl",t)}catch(t){"Timeout"===t.message?($.log("Request timed out. Handling timeout error..."),this.data.audioProxy=1,await Y.set("audioProxy",1)):$.log("Test audio error:",t)}return t}async updateTranslation(t){if(this.cachedTranslation?.url!==this.audioPlayer.player.currentSrc&&(t=await this.validateAudioUrl(t)),1===this.data.audioProxy&&t.startsWith("https://vtrans.s3-private.mds.yandex.net/tts/prod/")){const e=t.replace("https://vtrans.s3-private.mds.yandex.net/tts/prod/","");t=`https://${this.data.proxyWorkerHost}/video-translation/audio-proxy/${e}`,console.log(`[VOT] Audio proxied via ${t}`)}this.audioPlayer.player.src!==t&&(this.audioPlayer.player.src=t);try{this.audioPlayer.init()}catch(t){t.message.includes("Failed to fetch audio file")?(this.videoHandler.data.audioProxy=1,await Y.set("audioProxy",1)):this.videoHandler.transformBtn("error",t.message)}this.setupAudioSettings(),"twitter"===this.site.host&&document.querySelector('button[data-testid="app-bar-back"][role="button"]').addEventListener("click",this.stopTranslation),this.transformBtn("success",Z.get("disableTranslate")),this.afterUpdateTranslation(t)}async translateFunc(t,e,o,i,a){if(console.log("[VOT] Video Data: ",this.videoData),$.log("Run videoValidator"),this.videoValidator(),this.setLoadingBtn(!0),this.volumeOnStart=this.getVideoVolume(),e){let t=await this.translateStreamImpl(this.videoData,o,i);if(!t)return void $.log("Skip translation");this.transformBtn("success",Z.get("disableTranslate"));const e=this.setHLSSource(t.result.url);return"youtube"===this.site.host&&Ve.videoSeek(this.video,10),this.setupAudioSettings(),this.video.src||this.video.currentSrc||this.video.srcObject?this.afterUpdateTranslation(e):this.stopTranslation()}if(this.cachedTranslation=this.videoTranslations.find((e=>e.videoId===t&&e.expires>rt()&&e.from===o&&e.to===i)),this.cachedTranslation)return await this.updateTranslation(this.cachedTranslation.url),void $.log("[translateFunc] Cached translation was received");let n=await this.translateVideoImpl(this.videoData,o,i,a);$.log("[translateRes]",n),n?(await this.updateTranslation(n.url),this.subtitlesList.some((t=>"yandex"===t.source&&t.translatedFromLanguage===this.videoData.detectedLanguage&&t.language===this.videoData.responseLanguage))||(this.subtitlesList=await Be(this.votClient,this.videoData),await this.updateSubtitlesLangSelect()),this.videoTranslations.push({videoId:t,from:o,to:i,url:this.downloadTranslationUrl,expires:rt()+this.videoTranslationTTL})):$.log("Skip translation")}setupHLS(t){this.hls.on(Hls.Events.MEDIA_ATTACHED,(function(){$.log("audio and hls.js are now bound together !")})),this.hls.on(Hls.Events.MANIFEST_PARSED,(function(t){$.log("manifest loaded, found "+t?.levels?.length+" quality level")})),this.hls.loadSource(t),this.hls.attachMedia(this.audioPlayer.player.audio),this.hls.on(Hls.Events.ERROR,(function(t){if(t.fatal)switch(t.type){case Hls.ErrorTypes.MEDIA_ERROR:console.log("fatal media error encountered, try to recover"),this.hls.recoverMediaError();break;case Hls.ErrorTypes.NETWORK_ERROR:console.error("fatal network error encountered",t);break;default:this.hls.destroy()}})),$.log(this.hls)}setHLSSource(t){const e=`https://${this.data.m3u8ProxyHost}/?all=yes&origin=${encodeURIComponent("https://strm.yandex.ru")}&referer=${encodeURIComponent("https://strm.yandex.ru")}&url=${encodeURIComponent(t)}`;if(this.hls)this.setupHLS(e);else{if(!this.audioPlayer.player.audio.canPlayType("application/vnd.apple.mpegurl"))throw new ht("audioFormatNotSupported");this.audioPlayer.player.src=e}return e}setupAudioSettings(){"number"==typeof this.data.defaultVolume&&(this.audioPlayer.player.volume=this.data.defaultVolume/100),"number"==typeof this.data.autoSetVolumeYandexStyle&&this.data.autoSetVolumeYandexStyle&&this.setVideoVolume(this.data.autoVolume)}stopTranslation=()=>{this.stopTranslate(),this.syncVideoVolumeSlider()};async handleSrcChanged(){$.log("[VideoHandler] src changed",this),this.firstPlay=!0,this.stopTranslation();const t=!this.video.src&&!this.video.currentSrc&&!this.video.srcObject;this.votButton.container.hidden=t,t&&(this.votMenu.container.hidden=t),this.site.selector||(this.container=this.video.parentElement),this.container.contains(this.votButton.container)||this.container.append(this.votButton.container,this.votMenu.container),this.videoData=await this.getVideoData(),await this.updateSubtitles(),this.translateToLang=this.data.responseLanguage??"ru",this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage)}async release(){$.log("[VideoHandler] release"),this.initialized=!1,this.releaseExtraEvents(),this.subtitlesWidget.release(),this.votButton.container.remove(),this.votMenu.container.remove()}}const To=new class{constructor(){this.videoCache=new Set,this.onVideoAdded=new je,this.onVideoRemoved=new je,this.observer=new MutationObserver(this.handleMutations),this.intersectionObserver=new IntersectionObserver(this.handleIntersections,{threshold:.1})}handleMutations=t=>{window.requestIdleCallback((()=>{for(let e=0;e{for(let e=0;e{if(!t)return;const i=t.querySelectorAll("video");for(let t=0;t{this.videoCache.has(t)||(this.videoCache.add(t),this.intersectionObserver.observe(t))};handleIntersectingVideo=t=>{this.intersectionObserver.unobserve(t),(t=>{if(Ye.test(t.className)||Ye.test(t.title))return!0;let e=t.parentElement;for(;e;){if(Ye.test(e.className)||Ye.test(e.id))return!0;e=e.parentElement}return!1})(t)||(t=>t.hasAttribute("muted")&&!t.classList.contains("vjs-tech")&&!t.preload)(t)?$.log("The promotional/muted video was ignored",t):((t,e)=>{const o=()=>{(t=>t.readyState>=3)(t)?e(t):requestAnimationFrame(o)};o()})(t,this.handleVideoAdded)};handleVideoAdded=t=>{this.onVideoAdded.dispatch(t)};handleVideoRemoved=t=>{document.contains(t)||(this.videoCache.delete(t),this.onVideoRemoved.dispatch(t))}},Co=new WeakMap;function Po(t,e){if(t.shadowRoot){let o=t.selector?Array.from(document.querySelectorAll(t.selector)).find((t=>t.shadowRoot.contains(e))):e.parentElement;return o&&o.shadowRoot?o.parentElement:o}const o=wo.browser.version?.split(".")?.[0];if(t.selector?.includes(":not")&&t.selector?.includes("*")&&o&&("Chrome"===wo.browser.name&&Number(o)<88||"Firefox"===wo.browser.name&&Number(o)<84)){const o=t.selector.split(" *")[0];return o?Array.from(document.querySelectorAll(o)).find((t=>t.contains(e))):e.parentElement}return t.selector?Array.from(document.querySelectorAll(t.selector)).find((t=>t.contains(e))):e.parentElement}(async function(){$.log("Loading extension..."),await Z.update(),$.log(`Selected menu language: ${Z.lang}`),"https://9animetv.to"===window.location.origin&&window.addEventListener("message",(t=>{if("https://rapid-cloud.co"===t.origin&&"getVideoId"===t.data){const t=/[^/]+$/.exec(window.location.href)?.[0],e=document.querySelector("#iframe-embed")?.contentWindow;e.postMessage(`getVideoId:${t}`,"https://rapid-cloud.co/")}})),To.onVideoAdded.addListener((t=>{for(const e of function(){if(/(http(s)?:\/\/)(127\.0\.0\.1|localhost)/.exec(window.location.href))return[];const t=window.location.hostname,e=new URL(window.location),o=o=>o instanceof RegExp?o.test(t):"string"==typeof o?t.includes(o):"function"==typeof o&&o(e);return N.filter((t=>(Array.isArray(t.match)?t.match.some(o):o(t.match))&&t.host&&t.url))}()){if(!e)continue;let o=Po(e,t);if(o&&(("rumble"!==e.host||t.style.display)&&(["peertube","directlink"].includes(e.host)&&(e.url=window.location.origin),!Co.has(t)))){Co.set(t,new ko(t,o,e));break}}})),To.onVideoRemoved.addListener((async t=>{Co.has(t)&&(await Co.get(t).release(),Co.delete(t))})),To.enable()})().catch((t=>{console.error("[VOT]",t)}))})()})(); \ No newline at end of file diff --git a/dist/vot.user.js b/dist/vot.user.js index a2623ccf..43ed147c 100644 --- a/dist/vot.user.js +++ b/dist/vot.user.js @@ -50,8 +50,7 @@ // @match *://*.dailymotion.com/* // @match *://*.ok.ru/* // @match *://trovo.live/* -// @match *://disk.yandex.ru/i/* -// @match *://coursehunter.net/* +// @match *://disk.yandex.ru/* // @match *://youtube.googleapis.com/embed/* // @match *://*.banned.video/* // @match *://*.weverse.io/* @@ -73,6 +72,9 @@ // @match *://learning.sap.com/* // @match *://*.watchporn.to/* // @match *://*.linkedin.com/* +// @match *://*.ricktube.ru/* +// @match *://*.incestflix.net/* +// @match *://*.incestflix.to/* // @match *://*/*.mp4* // @match *://*/*.webm* // @match *://*.yewtu.be/* @@ -147,6 +149,8 @@ // @match *://poke.ggtyler.dev/* // @match *://poke.uk2.littlekai.co.uk/* // @match *://poke.blahai.gay/* +// @match *://*.coursehunter.net/* +// @match *://*.coursetrain.net/* // @exclude file://*/*.mp4* // @exclude file://*/*.webm* // @exclude *://accounts.youtube.com/* @@ -161,7 +165,7 @@ // @connect onrender.com // @connect workers.dev // @namespace vot -// @version 1.7.0 +// @version 1.7.1 // @icon https://translate.yandex.ru/icons/favicon.ico // @author sodapng, mynovelhost, Toil, SashaXser, MrSoczekXD // @homepageURL https://github.com/ilyhalight/voice-over-translation @@ -176,7 +180,7 @@ /***/ "./src/styles/main.scss": /***/ (() => { -GM_addStyle(".vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;min-width:64px;height:36px;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before,.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border-radius:4px;outline:none;min-width:64px;height:36px;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:\"\";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-outlined-button[disabled=true]:before,.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:4px;outline:none;min-width:64px;height:36px;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-text-button[disabled=true]:before,.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:50%;outline:none;width:36px;height:36px;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-icon-button[disabled=true]:before,.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:#0000!important;border-radius:4px!important;width:100%!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 #0000,inset -1px 0 #0000,inset 0 -1px #0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):placeholder-shown,.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;width:100%!important;max-height:100%!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span,.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:\"\"!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px #0000!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid #0000!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid #0000!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before,.vot-textfield>input:not(:focus):placeholder-shown+span:after,.vot-textfield>textarea:not(:focus):placeholder-shown+span:before,.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:#0000!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown,.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after,.vot-textfield>input:disabled:placeholder-shown,.vot-textfield>input:disabled:placeholder-shown+span,.vot-textfield>textarea:disabled:placeholder-shown,.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before,.vot-textfield>input:disabled:placeholder-shown+span:after,.vot-textfield>textarea:disabled:placeholder-shown+span:before,.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:#0000!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block}.vot-checkbox>input+span:before{content:\"\";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:\"\";z-index:10000;pointer-events:none;border:0 solid #0000;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked,.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before,.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after,.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:#0000}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked,.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:#0000}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;width:100%!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:#0000!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:\"\"!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:#0000!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;width:20px;height:32px;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;max-width:100vw;height:32px;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{color:inherit;background-color:#0000;border:none;justify-content:center;align-items:center;height:100%;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;min-height:100px;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;height:fit-content;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px #0000001f,0 16px 16px #0000003d}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:#0009;transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,#2e2f34cc);color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;width:max-content;max-width:100%;max-height:100%;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}") +GM_addStyle(".vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before,.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border-radius:4px;outline:none;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:\"\";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-outlined-button[disabled=true]:before,.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:4px;outline:none;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-text-button[disabled=true]:before,.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;width:36px;height:36px;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:#0000;border:none;border-radius:50%;outline:none;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:#0000}.vot-icon-button[disabled=true]:before,.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;width:100%!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:#0000!important;border-radius:4px!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 #0000,inset -1px 0 #0000,inset 0 -1px #0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:#0000!important}.vot-textfield>input:not(:focus):placeholder-shown,.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{width:100%!important;max-height:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span,.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:\"\"!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px #0000!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid #0000!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid #0000!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before,.vot-textfield>input:not(:focus):placeholder-shown+span:after,.vot-textfield>textarea:not(:focus):placeholder-shown+span:before,.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:#0000!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown,.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after,.vot-textfield>input:disabled:placeholder-shown,.vot-textfield>input:disabled:placeholder-shown+span,.vot-textfield>textarea:disabled:placeholder-shown,.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before,.vot-textfield>input:disabled:placeholder-shown+span:after,.vot-textfield>textarea:disabled:placeholder-shown+span:before,.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:#0000!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox-sub{padding-left:16px}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;padding:0;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block;position:relative}.vot-checkbox>input+span:before{content:\"\";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:\"\";z-index:10000;pointer-events:none;border:0 solid #0000;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked,.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before,.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after,.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:#0000}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked,.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:#0000}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;width:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:#0000!important;border:none!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;padding:0!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:\"\"!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:#0000!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{width:20px;height:32px;fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));max-width:100vw;height:32px;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{height:100%;color:inherit;background-color:#0000;border:none;justify-content:center;align-items:center;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:\"\";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,#0000 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{min-height:100px;max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);height:fit-content;color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px #0000001f,0 16px 16px #0000003d}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:#0009;transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,#2e2f34cc);width:max-content;max-width:100%;max-height:100%;color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:\"Roboto\",\"Segoe UI\",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}") /***/ }), @@ -240,7 +244,7 @@ window.cancelIdleCallback = /******/ } /******/ /************************************************************************/ -// This entry need to be wrapped in an IIFE because it need to be in strict mode. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { "use strict"; @@ -367,6 +371,7 @@ function createBaseVideoTranslationRequest() { unknown2: 0, unknown3: 0, bypassCache: false, + unknown4: 0, }; } const VideoTranslationRequest = { @@ -410,6 +415,9 @@ const VideoTranslationRequest = { if (message.bypassCache !== false) { writer.uint32(136).bool(message.bypassCache); } + if (message.unknown4 !== 0) { + writer.uint32(144).int32(message.unknown4); + } return writer; }, decode(input, length) { @@ -497,6 +505,12 @@ const VideoTranslationRequest = { } message.bypassCache = reader.bool(); continue; + case 18: + if (tag !== 144) { + break; + } + message.unknown4 = reader.int32(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -522,6 +536,7 @@ const VideoTranslationRequest = { unknown2: isSet(object.unknown2) ? globalThis.Number(object.unknown2) : 0, unknown3: isSet(object.unknown3) ? globalThis.Number(object.unknown3) : 0, bypassCache: isSet(object.bypassCache) ? globalThis.Boolean(object.bypassCache) : false, + unknown4: isSet(object.unknown4) ? globalThis.Number(object.unknown4) : 0, }; }, toJSON(message) { @@ -565,6 +580,9 @@ const VideoTranslationRequest = { if (message.bypassCache !== false) { obj.bypassCache = message.bypassCache; } + if (message.unknown4 !== 0) { + obj.unknown4 = Math.round(message.unknown4); + } return obj; }, create(base) { @@ -585,6 +603,7 @@ const VideoTranslationRequest = { message.unknown2 = object.unknown2 ?? 0; message.unknown3 = object.unknown3 ?? 0; message.bypassCache = object.bypassCache ?? false; + message.unknown4 = object.unknown4 ?? 0; return message; }, }; @@ -747,6 +766,204 @@ const VideoTranslationResponse = { return message; }, }; +function createBaseAudioObject() { + return { audioFile: new Uint8Array(0), message: "" }; +} +const AudioObject = { + encode(message, writer = _m0.Writer.create()) { + if (message.audioFile.length !== 0) { + writer.uint32(18).bytes(message.audioFile); + } + if (message.message !== "") { + writer.uint32(10).string(message.message); + } + return writer; + }, + decode(input, length) { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAudioObject(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: + if (tag !== 18) { + break; + } + message.audioFile = reader.bytes(); + continue; + case 1: + if (tag !== 10) { + break; + } + message.message = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + fromJSON(object) { + return { + audioFile: isSet(object.audioFile) ? bytesFromBase64(object.audioFile) : new Uint8Array(0), + message: isSet(object.message) ? globalThis.String(object.message) : "", + }; + }, + toJSON(message) { + const obj = {}; + if (message.audioFile.length !== 0) { + obj.audioFile = base64FromBytes(message.audioFile); + } + if (message.message !== "") { + obj.message = message.message; + } + return obj; + }, + create(base) { + return AudioObject.fromPartial(base ?? {}); + }, + fromPartial(object) { + const message = createBaseAudioObject(); + message.audioFile = object.audioFile ?? new Uint8Array(0); + message.message = object.message ?? ""; + return message; + }, +}; +function createBaseVideoTranslationAudioRequest() { + return { translationId: "", url: "", audioInfo: undefined }; +} +const VideoTranslationAudioRequest = { + encode(message, writer = _m0.Writer.create()) { + if (message.translationId !== "") { + writer.uint32(10).string(message.translationId); + } + if (message.url !== "") { + writer.uint32(18).string(message.url); + } + if (message.audioInfo !== undefined) { + AudioObject.encode(message.audioInfo, writer.uint32(50).fork()).ldelim(); + } + return writer; + }, + decode(input, length) { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVideoTranslationAudioRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + message.translationId = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + message.url = reader.string(); + continue; + case 6: + if (tag !== 50) { + break; + } + message.audioInfo = AudioObject.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + fromJSON(object) { + return { + translationId: isSet(object.translationId) ? globalThis.String(object.translationId) : "", + url: isSet(object.url) ? globalThis.String(object.url) : "", + audioInfo: isSet(object.audioInfo) ? AudioObject.fromJSON(object.audioInfo) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.translationId !== "") { + obj.translationId = message.translationId; + } + if (message.url !== "") { + obj.url = message.url; + } + if (message.audioInfo !== undefined) { + obj.audioInfo = AudioObject.toJSON(message.audioInfo); + } + return obj; + }, + create(base) { + return VideoTranslationAudioRequest.fromPartial(base ?? {}); + }, + fromPartial(object) { + const message = createBaseVideoTranslationAudioRequest(); + message.translationId = object.translationId ?? ""; + message.url = object.url ?? ""; + message.audioInfo = (object.audioInfo !== undefined && object.audioInfo !== null) + ? AudioObject.fromPartial(object.audioInfo) + : undefined; + return message; + }, +}; +function createBaseVideoTranslationAudioResponse() { + return { status: 0 }; +} +const VideoTranslationAudioResponse = { + encode(message, writer = _m0.Writer.create()) { + if (message.status !== 0) { + writer.uint32(32).int32(message.status); + } + return writer; + }, + decode(input, length) { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVideoTranslationAudioResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 4: + if (tag !== 32) { + break; + } + message.status = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + fromJSON(object) { + return { status: isSet(object.status) ? globalThis.Number(object.status) : 0 }; + }, + toJSON(message) { + const obj = {}; + if (message.status !== 0) { + obj.status = Math.round(message.status); + } + return obj; + }, + create(base) { + return VideoTranslationAudioResponse.fromPartial(base ?? {}); + }, + fromPartial(object) { + const message = createBaseVideoTranslationAudioResponse(); + message.status = object.status ?? 0; + return message; + }, +}; function createBaseSubtitlesObject() { return { language: "", url: "", unknown0: 0, translatedLanguage: "", translatedUrl: "", unknown1: 0, unknown2: 0 }; } @@ -1429,12 +1646,117 @@ const YandexSessionResponse = { return message; }, }; +function bytesFromBase64(b64) { + if (globalThis.Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } + else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} +function base64FromBytes(arr) { + if (globalThis.Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } + else { + const bin = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} function isSet(value) { return value !== null && value !== undefined; } +;// ./node_modules/vot.js/dist/types/yandex.js +var VideoService; +(function (VideoService) { + VideoService["custom"] = "custom"; + VideoService["directlink"] = "custom"; + VideoService["youtube"] = "youtube"; + VideoService["piped"] = "piped"; + VideoService["invidious"] = "invidious"; + VideoService["vk"] = "vk"; + VideoService["nine_gag"] = "nine_gag"; + VideoService["gag"] = "nine_gag"; + VideoService["twitch"] = "twitch"; + VideoService["proxitok"] = "proxitok"; + VideoService["tiktok"] = "tiktok"; + VideoService["vimeo"] = "vimeo"; + VideoService["xvideos"] = "xvideos"; + VideoService["pornhub"] = "pornhub"; + VideoService["twitter"] = "twitter"; + VideoService["rumble"] = "rumble"; + VideoService["facebook"] = "facebook"; + VideoService["rutube"] = "rutube"; + VideoService["coub"] = "coub"; + VideoService["bilibili"] = "bilibili"; + VideoService["mail_ru"] = "mailru"; + VideoService["mailru"] = "mailru"; + VideoService["bitchute"] = "bitchute"; + VideoService["eporner"] = "eporner"; + VideoService["peertube"] = "peertube"; + VideoService["dailymotion"] = "dailymotion"; + VideoService["trovo"] = "trovo"; + VideoService["yandexdisk"] = "yandexdisk"; + VideoService["ok_ru"] = "okru"; + VideoService["okru"] = "okru"; + VideoService["googledrive"] = "googledrive"; + VideoService["bannedvideo"] = "bannedvideo"; + VideoService["weverse"] = "weverse"; + VideoService["newgrounds"] = "newgrounds"; + VideoService["egghead"] = "egghead"; + VideoService["youku"] = "youku"; + VideoService["archive"] = "archive"; + VideoService["kodik"] = "kodik"; + VideoService["patreon"] = "patreon"; + VideoService["reddit"] = "reddit"; + VideoService["kick"] = "kick"; + VideoService["apple_developer"] = "apple_developer"; + VideoService["appledeveloper"] = "apple_developer"; + VideoService["poketube"] = "poketube"; + VideoService["epicgames"] = "epicgames"; + VideoService["nineanimetv"] = "nineanimetv"; + VideoService["odysee"] = "odysee"; + VideoService["coursehunterLike"] = "coursehunterLike"; + VideoService["sap"] = "sap"; + VideoService["udemy"] = "udemy"; + VideoService["coursera"] = "coursera"; + VideoService["watchpornto"] = "watchpornto"; + VideoService["linkedin"] = "linkedin"; + VideoService["ricktube"] = "ricktube"; + VideoService["incestflix"] = "incestflix"; + VideoService["porntn"] = "porntn"; +})(VideoService || (VideoService = {})); +var VideoTranslationStatus; +(function (VideoTranslationStatus) { + VideoTranslationStatus[VideoTranslationStatus["FAILED"] = 0] = "FAILED"; + VideoTranslationStatus[VideoTranslationStatus["FINISHED"] = 1] = "FINISHED"; + VideoTranslationStatus[VideoTranslationStatus["WAITING"] = 2] = "WAITING"; + VideoTranslationStatus[VideoTranslationStatus["LONG_WAITING"] = 3] = "LONG_WAITING"; + VideoTranslationStatus[VideoTranslationStatus["PART_CONTENT"] = 5] = "PART_CONTENT"; + VideoTranslationStatus[VideoTranslationStatus["LONG_WAITING_2"] = 6] = "LONG_WAITING_2"; +})(VideoTranslationStatus || (VideoTranslationStatus = {})); +var AudioInfoMessage; +(function (AudioInfoMessage) { + AudioInfoMessage["WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME"] = "web_api_get_all_generating_urls_data_from_iframe"; + AudioInfoMessage["WEB_API_REPLACED_FETCH_INSIDE_IFRAME"] = "web_api_replaced_fetch_inside_iframe"; + AudioInfoMessage["WEB_API_REPLACED_FETCH_FORCE_REQUEST_WITH_SEEK"] = "web_api_replaced_fetch_force_request_with_seek"; + AudioInfoMessage["WEB_API_REPLACED_FETCH"] = "web_api_replaced_fetch"; + AudioInfoMessage["ANDROID_API"] = "android_api"; + AudioInfoMessage["WEB_API_SLOW"] = "web_api_slow"; +})(AudioInfoMessage || (AudioInfoMessage = {})); + ;// ./node_modules/vot.js/dist/protobuf.js + const yandexProtobuf = { encodeTranslationRequest(url, duration, requestLang, responseLang, translationHelp) { return VideoTranslationRequest.encode({ @@ -1450,11 +1772,25 @@ const yandexProtobuf = { unknown2: 0, unknown3: 1, bypassCache: false, + unknown4: 1, }).finish(); }, decodeTranslationResponse(response) { return VideoTranslationResponse.decode(new Uint8Array(response)); }, + encodeTranslationAudioRequest(url, translationId) { + return VideoTranslationAudioRequest.encode({ + url, + translationId, + audioInfo: { + audioFile: new Uint8Array(0), + message: AudioInfoMessage.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME, + }, + }).finish(); + }, + decodeTranslationAudioResponse(response) { + return VideoTranslationResponse.decode(new Uint8Array(response)); + }, encodeSubtitlesRequest(url, requestLang) { return SubtitlesRequest.encode({ url, @@ -1495,16 +1831,61 @@ const yandexProtobuf = { host: "api.browser.yandex.ru", hostVOT: "vot-api.toil.cc/v1", mediaProxy: "media-proxy.toil.cc", - userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 YaBrowser/24.7.0.0 Safari/537.36", - componentVersion: "24.7.3.1250", + userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 YaBrowser/24.10.0.0 Safari/537.36", + componentVersion: "24.10.1.598", hmac: "bt8xH3VOlb4mqf0nqAibnDOoiPlXsisf", defaultDuration: 343, + loggerLevel: 1, + version: "1.3.8", }); -;// ./node_modules/vot.js/package.json -const package_namespaceObject = {"rE":"1.3.1"}; +;// ./node_modules/vot.js/dist/types/logger.js +var LoggerLevel; +(function (LoggerLevel) { + LoggerLevel[LoggerLevel["DEBUG"] = 0] = "DEBUG"; + LoggerLevel[LoggerLevel["INFO"] = 1] = "INFO"; + LoggerLevel[LoggerLevel["WARN"] = 2] = "WARN"; + LoggerLevel[LoggerLevel["ERROR"] = 3] = "ERROR"; + LoggerLevel[LoggerLevel["SILENCE"] = 4] = "SILENCE"; +})(LoggerLevel || (LoggerLevel = {})); + +;// ./node_modules/vot.js/dist/utils/logger.js + + +class Logger { + static prefix = `[vot.js v${config.version}]`; + static canLog(level) { + return config.loggerLevel <= level; + } + static log(...messages) { + if (!Logger.canLog(LoggerLevel.DEBUG)) { + return; + } + console.log(Logger.prefix, ...messages); + } + static info(...messages) { + if (!Logger.canLog(LoggerLevel.INFO)) { + return; + } + console.info(Logger.prefix, ...messages); + } + static warn(...messages) { + if (!Logger.canLog(LoggerLevel.WARN)) { + return; + } + console.warn(Logger.prefix, ...messages); + } + static error(...messages) { + if (!Logger.canLog(LoggerLevel.ERROR)) { + return; + } + console.error(Logger.prefix, ...messages); + } +} + ;// ./node_modules/vot.js/dist/secure.js + const utf8Encoder = new TextEncoder(); async function signHMAC(hashName, hmac, data) { const key = await crypto.subtle.importKey("raw", utf8Encoder.encode(hmac), { name: "HMAC", hash: { name: hashName } }, false, ["sign", "verify"]); @@ -1530,78 +1911,11 @@ async function getHmacSha1(hmacKey, salt) { return btoa(String.fromCharCode(...new Uint8Array(signature))); } catch (err) { - console.error(err); + Logger.error(err); return false; } } -;// ./node_modules/vot.js/dist/types/yandex.js -var VideoService; -(function (VideoService) { - VideoService["custom"] = "custom"; - VideoService["directlink"] = "custom"; - VideoService["youtube"] = "youtube"; - VideoService["piped"] = "piped"; - VideoService["invidious"] = "invidious"; - VideoService["vk"] = "vk"; - VideoService["nine_gag"] = "nine_gag"; - VideoService["gag"] = "nine_gag"; - VideoService["twitch"] = "twitch"; - VideoService["proxitok"] = "proxitok"; - VideoService["tiktok"] = "tiktok"; - VideoService["vimeo"] = "vimeo"; - VideoService["xvideos"] = "xvideos"; - VideoService["pornhub"] = "pornhub"; - VideoService["twitter"] = "twitter"; - VideoService["rumble"] = "rumble"; - VideoService["facebook"] = "facebook"; - VideoService["rutube"] = "rutube"; - VideoService["coub"] = "coub"; - VideoService["bilibili"] = "bilibili"; - VideoService["mail_ru"] = "mailru"; - VideoService["mailru"] = "mailru"; - VideoService["bitchute"] = "bitchute"; - VideoService["eporner"] = "eporner"; - VideoService["peertube"] = "peertube"; - VideoService["dailymotion"] = "dailymotion"; - VideoService["trovo"] = "trovo"; - VideoService["yandexdisk"] = "yandexdisk"; - VideoService["ok_ru"] = "okru"; - VideoService["okru"] = "okru"; - VideoService["googledrive"] = "googledrive"; - VideoService["bannedvideo"] = "bannedvideo"; - VideoService["weverse"] = "weverse"; - VideoService["newgrounds"] = "newgrounds"; - VideoService["egghead"] = "egghead"; - VideoService["youku"] = "youku"; - VideoService["archive"] = "archive"; - VideoService["kodik"] = "kodik"; - VideoService["patreon"] = "patreon"; - VideoService["reddit"] = "reddit"; - VideoService["kick"] = "kick"; - VideoService["apple_developer"] = "apple_developer"; - VideoService["appledeveloper"] = "apple_developer"; - VideoService["poketube"] = "poketube"; - VideoService["epicgames"] = "epicgames"; - VideoService["nineanimetv"] = "nineanimetv"; - VideoService["odysee"] = "odysee"; - VideoService["coursehunter"] = "coursehunter"; - VideoService["sap"] = "sap"; - VideoService["udemy"] = "udemy"; - VideoService["coursera"] = "coursera"; - VideoService["watchpornto"] = "watchpornto"; - VideoService["linkedin"] = "linkedin"; -})(VideoService || (VideoService = {})); -var VideoTranslationStatus; -(function (VideoTranslationStatus) { - VideoTranslationStatus[VideoTranslationStatus["FAILED"] = 0] = "FAILED"; - VideoTranslationStatus[VideoTranslationStatus["FINISHED"] = 1] = "FINISHED"; - VideoTranslationStatus[VideoTranslationStatus["WAITING"] = 2] = "WAITING"; - VideoTranslationStatus[VideoTranslationStatus["LONG_WAITING"] = 3] = "LONG_WAITING"; - VideoTranslationStatus[VideoTranslationStatus["PART_CONTENT"] = 5] = "PART_CONTENT"; - VideoTranslationStatus[VideoTranslationStatus["LONG_WAITING_2"] = 6] = "LONG_WAITING_2"; -})(VideoTranslationStatus || (VideoTranslationStatus = {})); - ;// ./node_modules/vot.js/dist/utils/utils.js const iso6392to6391 = { @@ -1833,6 +2147,8 @@ const sitesPoketube = [ "poke.uk2.littlekai.co.uk", "poke.blahai.gay", ]; +const sitesRicktube = ["ricktube.ru"]; +const sitesCoursehunterLike = ["coursehunter.net", "coursetrain.net"]; ;// ./node_modules/vot.js/dist/config/sites.js @@ -1879,6 +2195,12 @@ const sitesPoketube = [ match: sitesPoketube, selector: ".video-player-container", }, + { + host: VideoService.ricktube, + url: "https://youtu.be/", + match: sitesRicktube, + selector: "#oframeplayer > pjsdiv:has(video)" + }, { additionalData: "mobile", host: VideoService.vk, @@ -2013,7 +2335,7 @@ const sitesPoketube = [ }, { host: VideoService.bilibili, - url: "https://www.bilibili.com/video/", + url: "https://www.bilibili.com/", match: /^(www|m|player).bilibili.com$/, selector: ".bpx-player-video-wrap", }, @@ -2021,7 +2343,7 @@ const sitesPoketube = [ { additionalData: "old", // /blackboard/webplayer/embed-old.html host: VideoService.bilibili, - url: "https://www.bilibili.com/video/", + url: "https://www.bilibili.com/", match: /^(www|m).bilibili.com$/, selector: null, }, @@ -2063,11 +2385,12 @@ const sitesPoketube = [ }, { host: VideoService.yandexdisk, - url: "https://yadi.sk/i/", + url: "https://yadi.sk/", match: /^disk.yandex.ru$/, selector: ".video-player__player > div:nth-child(1)", eventSelector: ".video-player__player", needBypassCSP: true, + needExtraData: true, }, { host: VideoService.okru, @@ -2179,10 +2502,10 @@ const sitesPoketube = [ needExtraData: true, }, { - host: VideoService.coursehunter, - url: "https://coursehunter.net/course/", - match: /^coursehunter.net$/, - selector: "#oframeplayer > pjsdiv:nth-of-type(1)", + host: VideoService.coursehunterLike, + url: "stub", + match: sitesCoursehunterLike, + selector: "#oframeplayer > pjsdiv:has(video)", needExtraData: true, }, { @@ -2224,6 +2547,20 @@ const sitesPoketube = [ needExtraData: true, needBypassCSP: true, }, + { + host: VideoService.incestflix, + url: "https://www.incestflix.net/watch/", + match: /^(www.)?incestflix.(net|to|com)$/, + selector: "#incflix-stream", + needExtraData: true, + }, + { + host: VideoService.porntn, + url: "https://porntn.com/videos/", + match: /^porntn.com$/, + selector: null, + needExtraData: true, + }, { host: VideoService.custom, url: "stub", @@ -2233,21 +2570,16 @@ const sitesPoketube = [ ]); ;// ./src/localization/locales/en.json -const en_namespaceObject = /*#__PURE__*/JSON.parse('{"__version__":5,"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","unSupportedExtensionError":"Error! {0} is not supported by this version of the extension!\\n\\nPlease use the cloudflare version of the VOT extension.","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","grantPermissionToAutoPlay":"Grant permission to autoplay","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Do not translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTAudioProxy":"Proxy received audio","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTLiveNotSupported":"Translation of live streams is not supported","VOTPremiere":"Wait for the premiere to end before translating","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"udemyModuleArgsNotFound":"Could not get udemy module data due to the fact that ModuleArgs was not found","VOTTranslationHelpNull":"Could not get the data required for the translate","streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTTranslationService":"Translation Service","VOTDetectService":"Detect Service","VOTTranslatingError":"Translating the error","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTBypassMediaCSP":"Bypassing Media CSP","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site"}'); -;// ./src/utils/debug.js -const debug = {}; -debug.log = (...text) => { - if (true) { - return; - } - return console.log( - "%c[VOT DEBUG]", - "background: #F2452D; color: #fff; padding: 5px;", - ...text, - ); -}; - -/* harmony default export */ const utils_debug = (debug); +const en_namespaceObject = /*#__PURE__*/JSON.parse('{"__version__":5,"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","unSupportedExtensionError":"Error! {0} is not supported by this version of the extension!\\n\\nPlease use the cloudflare version of the VOT extension.","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","grantPermissionToAutoPlay":"Grant permission to autoplay","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Do not translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTAudioProxy":"Proxy received audio","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTLiveNotSupported":"Translation of live streams is not supported","VOTPremiere":"Wait for the premiere to end before translating","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"udemyModuleArgsNotFound":"Could not get udemy module data due to the fact that ModuleArgs was not found","VOTTranslationHelpNull":"Could not get the data required for the translate","streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTTranslationService":"Translation Service","VOTDetectService":"Detect Service","VOTTranslatingError":"Translating the error","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site","VOTOnlyBypassMediaCSP":"Use it only for bypassing Media CSP","VOTNewAudioPlayer":"Use the new audio player"}'); +;// ./src/utils/debug.ts +/* harmony default export */ const debug = ({ + log: (...text) => { + if (true) { + return; + } + return console.log("%c[VOT DEBUG]", "background: #F2452D; color: #fff; padding: 5px;", ...text); + }, +}); ;// ./src/config/config.js // CONFIGURATION @@ -2274,6 +2606,14 @@ const translateUrls = { deepl: "https://translate-deepl.toil.cc/translate", }; +const proxyOnlyExtensions = [ + "Violentmonkey", + "FireMonkey", + "Greasemonkey", + "AdGuard", + "OrangeMonkey", +]; + ;// ./src/utils/storage.js @@ -2282,7 +2622,7 @@ const translateUrls = { const votStorage = new (class { constructor() { this.gmSupport = typeof GM_getValue === "function"; - utils_debug.log(`GM Storage Status: ${this.gmSupport}`); + debug.log(`GM Storage Status: ${this.gmSupport}`); } syncGet(name, def = undefined) { @@ -2403,20 +2743,19 @@ const localizationProvider = new (class { gmValues = [ "locale-phrases", "locale-lang", - "locale-version", + "locale-hash", + "locale-updated-at", "locale-lang-override", ]; constructor() { const langOverride = votStorage.syncGet("locale-lang-override", "auto"); - if (langOverride && langOverride !== "auto") { - this.lang = langOverride; - } else { - this.lang = - (navigator.language || navigator.userLanguage) - ?.substr(0, 2) - ?.toLowerCase() ?? "en"; - } + this.lang = + langOverride && langOverride !== "auto" + ? langOverride + : (navigator.language || navigator.userLanguage) + ?.substr(0, 2) + ?.toLowerCase() ?? "en"; this.setLocaleFromJsonString(votStorage.syncGet("locale-phrases", "")); } @@ -2427,7 +2766,7 @@ const localizationProvider = new (class { } async checkUpdates() { - utils_debug.log("Check locale updates..."); + debug.log("Check locale updates..."); try { const res = await GM_fetch(`${localizationUrl}/hashes.json`); if (res.status !== 200) { @@ -2467,7 +2806,7 @@ const localizationProvider = new (class { return; } - utils_debug.log("Updating locale..."); + debug.log("Updating locale..."); try { const res = await GM_fetch( `${localizationUrl}/locales/${this.lang}.json`, @@ -2535,11 +2874,20 @@ const localizationProvider = new (class { const userlang = navigator.language || navigator.userLanguage; +const MAX_SECS_FRACTION = 0.66; const lang = userlang?.substr(0, 2)?.toLowerCase() ?? "en"; function secsToStrTime(secs) { - const minutes = Math.floor(secs / 60); - const seconds = Math.floor(secs % 60); + let minutes = Math.floor(secs / 60); + let seconds = Math.floor(secs % 60); + const fraction = seconds / 60; + if (fraction >= MAX_SECS_FRACTION) { + // rounding to the next minute if it has already been more than N% + // e.g. 100 -> 2 minutes + minutes += 1; + seconds = 0; + } + if (minutes >= 60) { return localizationProvider.get("translationTakeMoreThanHour"); } else if (minutes === 1 || (minutes === 0 && seconds > 0)) { @@ -2562,11 +2910,6 @@ function secsToStrTime(secs) { .replace("{0}", minutes); } -function langTo6391(lang) { - // convert lang to ISO 639-1 - return lang.toLowerCase().split(/[_;-]/)[0].trim(); -} - function isPiPAvailable() { return ( "pictureInPictureEnabled" in document && document.pictureInPictureEnabled @@ -2583,11 +2926,6 @@ function initHls() { : undefined; } -function initAudioContext() { - const audioContext = window.AudioContext || window.webkitAudioContext; - return audioContext ? new audioContext() : undefined; -} - const deletefilter = [ /(?:https?|ftp):\/\/\S+/g, /https?:\/\/\S+|www\.\S+/gm, @@ -2665,7 +3003,7 @@ async function GM_fetch(url, opts = {}) { } catch (err) { // Если fetch завершился ошибкой, используем GM_xmlhttpRequest // https://greasyfork.org/ru/scripts/421384-gm-fetch/code - utils_debug.log("GM_fetch preventing cors by GM_xmlhttpRequest", err.message); + debug.log("GM_fetch preventing cors by GM_xmlhttpRequest", err.message); return new Promise((resolve, reject) => { clearTimeout(timeoutId); GM_xmlhttpRequest({ @@ -2717,15 +3055,17 @@ class VideoHelperError extends Error { } } class BaseHelper { - API_ORIGIN = "https://example.com"; + API_ORIGIN = window.location.origin; fetch; extraInfo; referer; + origin; service; - constructor({ fetchFn = GM_fetch, extraInfo = true, referer = document.referrer ?? window.location.origin + "/", service, } = {}) { + constructor({ fetchFn = GM_fetch, extraInfo = true, referer = document.referrer ?? window.location.origin + "/", origin = window.location.origin, service, } = {}) { this.fetch = fetchFn; this.extraInfo = extraInfo; this.referer = referer; + this.origin = /^(http(s)?):\/\//.test(String(origin)) ? origin : window.location.origin; this.service = service; } async getVideoData(videoId) { @@ -2749,6 +3089,7 @@ class BaseHelper { ;// ./node_modules/vot.js/dist/helpers/mailru.js + class MailRuHelper extends BaseHelper { API_ORIGIN = "https://my.mail.ru"; async getVideoMeta(videoId) { @@ -2757,7 +3098,7 @@ class MailRuHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error("Failed to get mail.ru video data", err.message); + Logger.error("Failed to get mail.ru video data", err.message); return undefined; } } @@ -2781,6 +3122,7 @@ class MailRuHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/weverse.js + class WeverseHelper extends BaseHelper { API_ORIGIN = "https://global.apis.naver.com/weverse/wevweb"; API_APP_ID = "be4d79eb8fc7bd008ee82c8ec4ff6fd4"; @@ -2829,7 +3171,7 @@ class WeverseHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error(`Failed to get weverse post preview by postId: ${postId}`, err.message); + Logger.error(`Failed to get weverse post preview by postId: ${postId}`, err.message); return false; } } @@ -2848,7 +3190,7 @@ class WeverseHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error(`Failed to get weverse InKey by videoId: ${videoId}`, err.message); + Logger.error(`Failed to get weverse InKey by videoId: ${videoId}`, err.message); return false; } } @@ -2880,7 +3222,7 @@ class WeverseHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error(`Failed to get weverse video info (infraVideoId: ${infraVideoId}, inkey: ${inkey}, serviceId: ${serviceId}`, err.message); + Logger.error(`Failed to get weverse video info (infraVideoId: ${infraVideoId}, inkey: ${inkey}, serviceId: ${serviceId}`, err.message); return false; } } @@ -2921,6 +3263,7 @@ class WeverseHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/kodik.js + class KodikHelper extends BaseHelper { API_ORIGIN = window.location.origin; async getSecureData(videoPath) { @@ -2953,7 +3296,7 @@ class KodikHelper extends BaseHelper { }; } catch (err) { - console.error(`Failed to get kodik secure data by videoPath: ${videoPath}.`, err.message); + Logger.error(`Failed to get kodik secure data by videoPath: ${videoPath}.`, err.message); return false; } } @@ -2985,7 +3328,7 @@ class KodikHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error(`Failed to get kodik video data (type: ${videoType}, id: ${id}, hash: ${hash})`, err.message); + Logger.error(`Failed to get kodik video data (type: ${videoType}, id: ${id}, hash: ${hash})`, err.message); return false; } } @@ -3022,6 +3365,7 @@ class KodikHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/patreon.js + class PatreonHelper extends BaseHelper { API_ORIGIN = "https://www.patreon.com/api"; async getPosts(postId) { @@ -3030,7 +3374,7 @@ class PatreonHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error(`Failed to get patreon posts by postId: ${postId}.`, err.message); + Logger.error(`Failed to get patreon posts by postId: ${postId}.`, err.message); return false; } } @@ -3058,6 +3402,7 @@ class PatreonHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/reddit.js + class RedditHelper extends BaseHelper { API_ORIGIN = "https://www.reddit.com"; async getVideoData(videoId) { @@ -3075,7 +3420,7 @@ class RedditHelper extends BaseHelper { }; } catch (err) { - console.error(`Failed to get reddit video data by video ID: ${videoId}`, err.message); + Logger.error(`Failed to get reddit video data by video ID: ${videoId}`, err.message); return undefined; } } @@ -3142,6 +3487,7 @@ class BannedVideoHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/kick.js + class KickHelper extends BaseHelper { API_ORIGIN = "https://kick.com/api"; async getClipInfo(clipId) { @@ -3156,7 +3502,7 @@ class KickHelper extends BaseHelper { }; } catch (err) { - console.error(`Failed to get kick clip info by clipId: ${clipId}.`, err.message); + Logger.error(`Failed to get kick clip info by clipId: ${clipId}.`, err.message); return undefined; } } @@ -3173,7 +3519,7 @@ class KickHelper extends BaseHelper { }; } catch (err) { - console.error(`Failed to get kick video info by videoId: ${videoId}.`, err.message); + Logger.error(`Failed to get kick video info by videoId: ${videoId}.`, err.message); return undefined; } } @@ -3189,6 +3535,7 @@ class KickHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/appledeveloper.js + class AppleDeveloperHelper extends BaseHelper { API_ORIGIN = "https://developer.apple.com"; async getVideoData(videoId) { @@ -3202,7 +3549,7 @@ class AppleDeveloperHelper extends BaseHelper { }; } catch (err) { - console.error(`Failed to get apple developer video data by video ID: ${videoId}`, err.message); + Logger.error(`Failed to get apple developer video data by video ID: ${videoId}`, err.message); return undefined; } } @@ -3214,6 +3561,7 @@ class AppleDeveloperHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/epicgames.js + class EpicGamesHelper extends BaseHelper { API_ORIGIN = "https://dev.epicgames.com/community/api/learning"; async getPostInfo(videoId) { @@ -3222,7 +3570,7 @@ class EpicGamesHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error(`Failed to get epicgames post info by videoId: ${videoId}.`, err.message); + Logger.error(`Failed to get epicgames post info by videoId: ${videoId}.`, err.message); return false; } } @@ -3257,6 +3605,7 @@ class EpicGamesHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/nineanimetv.js + class NineAnimeTVHelper extends BaseHelper { API_ORIGIN = "https://9animetv.to/ajax/episode"; RAPID_CLOUD_ORIGIN = "https://rapid-cloud.co/ajax/embed-6-v2"; @@ -3270,7 +3619,7 @@ class NineAnimeTVHelper extends BaseHelper { return /data-id="(\d+)"/.exec(content.html)?.[1]; } catch (err) { - console.error(`Failed to get 9animetv servers info by episodeId: ${episodeId}.`, err.message); + Logger.error(`Failed to get 9animetv servers info by episodeId: ${episodeId}.`, err.message); return false; } } @@ -3284,7 +3633,7 @@ class NineAnimeTVHelper extends BaseHelper { return content.link; } catch (err) { - console.error(`Failed to get player link by sourceId: ${sourceId}.`, err.message); + Logger.error(`Failed to get player link by sourceId: ${sourceId}.`, err.message); return false; } } @@ -3293,13 +3642,13 @@ class NineAnimeTVHelper extends BaseHelper { const res = await this.fetch(`${this.RAPID_CLOUD_ORIGIN}/getSources?id=${rapidId}`); const content = (await res.json()); if (content.encrypted) { - console.warn("Encrypted RapidCloud data found. Let us know about it", content); + Logger.warn("Encrypted RapidCloud data found. Let us know about it", content); return false; } return content; } catch (err) { - console.error(`Failed to get rapid cloud data by rapidId: ${rapidId}.`, err.message); + Logger.error(`Failed to get rapid cloud data by rapidId: ${rapidId}.`, err.message); return false; } } @@ -3366,6 +3715,7 @@ class NineAnimeTVHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/odysee.js + class OdyseeHelper extends BaseHelper { API_ORIGIN = "https://odysee.com"; async getVideoData(videoId) { @@ -3379,7 +3729,7 @@ class OdyseeHelper extends BaseHelper { return { url }; } catch (err) { - console.error(`Failed to get odysee video data by video ID: ${videoId}`, err.message); + Logger.error(`Failed to get odysee video data by video ID: ${videoId}`, err.message); return undefined; } } @@ -3388,37 +3738,42 @@ class OdyseeHelper extends BaseHelper { } } -;// ./node_modules/vot.js/dist/helpers/coursehunter.js +;// ./node_modules/vot.js/dist/helpers/coursehunterLike.js -class CoursehunterHelper extends BaseHelper { - API_ORIGIN = "https://coursehunter.net/api/v1"; - getCourseId(videoId) { - return window.course_id ?? +document.querySelector('input[name="course_id"]')?.value; + +class CoursehunterLikeHelper extends BaseHelper { + API_ORIGIN = this.origin ?? "https://coursehunter.net"; + async getCourseId(videoId) { + try { + const res = await this.fetch(`${this.API_ORIGIN}/${videoId}`); + const content = await res.text(); + return /course_id(\s)?=(\s)?([\d]+)/.exec(content)?.[3]; + } + catch (err) { + Logger.error(`Failed to get CoursehunterLike courseId by videoId: ${videoId}, because ${err.message}`); + return false; + } } async getLessonsData(courseId) { try { - const res = await this.fetch(`${this.API_ORIGIN}/course/${courseId}/lessons`); + const res = await this.fetch(`${this.API_ORIGIN}/api/v1/course/${courseId}/lessons`); return (await res.json()); } catch (err) { - console.error(`Failed to get Coursehunter lessons data by courseId: ${courseId}`, err.message); + Logger.error(`Failed to get CoursehunterLike lessons data by courseId: ${courseId}, because ${err.message}`); return false; } } async getVideoData(videoId) { - const courseId = this.getCourseId(videoId); + const courseId = await this.getCourseId(videoId); if (!courseId) { return undefined; } - const lessonsData = window.lessons ?? (await this.getLessonsData(courseId)); + const lessonsData = await this.getLessonsData(courseId); if (!lessonsData) { return undefined; } - const lessonId = +( - videoId.split("?lesson=")?.[1] ?? - document.querySelector(".lessons-item_active")?.dataset?.index ?? - 1 - ); + const lessonId = +(videoId.split("?lesson=")?.[1] ?? 1); const currentLesson = lessonsData?.[lessonId - 1]; const { file: videoUrl, duration, title } = currentLesson; if (!videoUrl) { @@ -3431,13 +3786,14 @@ class CoursehunterHelper extends BaseHelper { }; } async getVideoId(url) { - const courseId = /\/course\/([^/]+)/.exec(url.pathname)?.[1]; + const courseId = /course\/([^/]+)/.exec(url.pathname)?.[0]; return courseId ? courseId + url.search : undefined; } } ;// ./node_modules/vot.js/dist/helpers/twitch.js + class TwitchHelper extends BaseHelper { API_ORIGIN = "https://clips.twitch.tv"; async getClipLink(pathname, clipId) { @@ -3494,6 +3850,7 @@ class TwitchHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/sap.js + class SapHelper extends BaseHelper { API_ORIGIN = "https://learning.sap.com/"; async requestKaltura(kalturaDomain, partnerId, entryId) { @@ -3541,7 +3898,7 @@ class SapHelper extends BaseHelper { return (await res.json()); } catch (err) { - console.error("Failed to request kaltura data", err.message); + Logger.error("Failed to request kaltura data", err.message); return undefined; } } @@ -3564,7 +3921,7 @@ class SapHelper extends BaseHelper { return await this.requestKaltura(kalturaDomain, partnerId, entryId); } catch (err) { - console.error("Failed to get kaltura data", err.message); + Logger.error("Failed to get kaltura data", err.message); return undefined; } } @@ -3674,12 +4031,12 @@ class UdemyHelper extends BaseHelper { findSubtitleUrl(captions, detectedLanguage) { let subtitle = captions?.find( - (caption) => langTo6391(caption.locale_id) === detectedLanguage, + (caption) => normalizeLang(caption.locale_id) === detectedLanguage, ); if (!subtitle) { subtitle = captions?.find( - (caption) => langTo6391(caption.locale_id) === "en", + (caption) => normalizeLang(caption.locale_id) === "en", ) ?? captions?.[0]; } @@ -3693,7 +4050,7 @@ class UdemyHelper extends BaseHelper { } const lectureId = this.getLectureId(); - utils_debug.log(`[Udemy] courseId: ${courseId}, lectureId: ${lectureId}`) + debug.log(`[Udemy] courseId: ${courseId}, lectureId: ${lectureId}`) if (!lectureId) { return undefined; } @@ -3709,7 +4066,7 @@ class UdemyHelper extends BaseHelper { const courseLangData = await this.getCourseLang(courseId); let { locale: { locale: courseLang } } = courseLangData; - courseLang = courseLang ? langTo6391(courseLang) : "en"; + courseLang = courseLang ? normalizeLang(courseLang) : "en"; if (!availableLangs.includes(courseLang)) { courseLang = "en"; } @@ -3780,12 +4137,12 @@ class CourseraHelper extends BaseHelper { findSubtitleUrl(captions, detectedLanguage) { let subtitle = captions?.find( - (caption) => langTo6391(caption.srclang) === detectedLanguage, + (caption) => normalizeLang(caption.srclang) === detectedLanguage, ); if (!subtitle) { subtitle = captions?.find( - (caption) => langTo6391(caption.srclang) === "en", + (caption) => normalizeLang(caption.srclang) === "en", ) || captions?.[0]; } @@ -3806,7 +4163,7 @@ class CourseraHelper extends BaseHelper { const { primaryLanguageCodes } = await this.getCourseData(courseId); let courseLang = primaryLanguageCodes?.[0]; - courseLang = courseLang ? langTo6391(courseLang) : "en"; + courseLang = courseLang ? normalizeLang(courseLang) : "en"; if (!availableLangs.includes(courseLang)) { courseLang = "en"; @@ -3846,6 +4203,7 @@ class CourseraHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/linkedin.js + class LinkedinHelper extends BaseHelper { API_ORIGIN = "https://www.linkedin.com/learning"; async getVideoData(videoId) { @@ -3879,7 +4237,7 @@ class LinkedinHelper extends BaseHelper { }; } catch (err) { - console.error("Failed to get linkedin video data", err.message); + Logger.error("Failed to get linkedin video data", err.message); return undefined; } } @@ -3891,6 +4249,7 @@ class LinkedinHelper extends BaseHelper { ;// ./node_modules/vot.js/dist/helpers/vimeo.js + class VimeoHelper extends BaseHelper { API_KEY = ""; DEFAULT_SITE_ORIGIN = "https://vimeo.com"; @@ -3913,7 +4272,7 @@ class VimeoHelper extends BaseHelper { return data; } catch (err) { - console.error(`Failed to get default viewer data.`, err.message); + Logger.error(`Failed to get default viewer data.`, err.message); return false; } } @@ -3934,7 +4293,7 @@ class VimeoHelper extends BaseHelper { return data; } catch (err) { - console.error(`Failed to get video info by video ID: ${videoId}`, err.message); + Logger.error(`Failed to get video info by video ID: ${videoId}`, err.message); return false; } } @@ -3975,7 +4334,7 @@ class VimeoHelper extends BaseHelper { return baseUrl.href; } catch (err) { - console.error(`Failed to get private video source`, err.message); + Logger.error(`Failed to get private video source`, err.message); return false; } } @@ -3997,7 +4356,7 @@ class VimeoHelper extends BaseHelper { }; } catch (err) { - console.error(`Failed to get private video info by video ID: ${videoId}`, err.message); + Logger.error(`Failed to get private video info by video ID: ${videoId}`, err.message); return false; } } @@ -4019,7 +4378,7 @@ class VimeoHelper extends BaseHelper { return data; } catch (err) { - console.error(`Failed to get subtitles info by video ID: ${videoId}`, err.message); + Logger.error(`Failed to get subtitles info by video ID: ${videoId}`, err.message); return false; } } @@ -4103,6 +4462,218 @@ class VimeoHelper extends BaseHelper { } } +;// ./src/utils/VOTLocalizedError.js + + +class VOTLocalizedError extends Error { + constructor(message) { + super(localizationProvider.getDefault(message)); + this.name = "VOTLocalizedError"; + this.unlocalizedMessage = message; + this.localizedMessage = localizationProvider.get(message); + } +} + +;// ./node_modules/vot.js/dist/helpers/yandexdisk.js + + +class YandexDiskHelper extends BaseHelper { + API_ORIGIN = "https://disk.yandex.ru"; + CLIENT_PREFIX = "/client/disk"; + async getVideoData(videoId) { + if (!videoId.startsWith(this.CLIENT_PREFIX)) { + return { + url: this.service.url + videoId, + }; + } + + const url = new URL(window.location); + const dialogId = url.searchParams.get("idDialog"); + if (!dialogId) { + return undefined; + } + + const preloadedScript = document.querySelector("#preloaded-data"); + if (!preloadedScript) { + return undefined; + } + + try { + const preloadedData = JSON.parse(preloadedScript.innerText); + const { idClient, sk } = preloadedData.config; + const res = await this.fetch(this.API_ORIGIN + "/models/?_m=resource", { + method: "POST", + body: new URLSearchParams({ + idClient, + sk, + "_model.0": "resource", + "id.0": dialogId.replaceAll(" ", "+"), + }) + .toString() + .replaceAll(/%2B/g, "+"), // yandex requires this + headers: { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }, + }); + + const data = await res.json(); + if (!data.models) { + throw new VideoHelperError("Failed to get resource info"); + } + + const model = data.models[0]; + const modelData = model.data; + if (Object.hasOwn(modelData, "error")) { + throw new VideoHelperError(modelData.error?.message); + } + + const { meta, name } = modelData; + const { short_url, video_info } = meta; + if (!video_info) { + throw new VideoHelperError("There's no video open right now"); + } + + if (!short_url) { + throw new VideoHelperError("VOTLimitedVideoAccess"); + } + + const title = name.replace(/(\.[^.]+)$/, ""); + + return { + url: short_url, + title, + duration: video_info.duration, + }; + } catch (err) { + if (err.message?.startsWith("VOT")) { + throw new VOTLocalizedError(err.message); + } + + console.error( + `Failed to get yandex disk video data by video ID: ${videoId}`, + err.message, + ); + return undefined; + } + } + async getVideoId(url) { + const fileId = /\/i\/([^/]+)/.exec(url.pathname)?.[1]; + if (fileId) { + return fileId; + } + + return url.pathname.startsWith(this.CLIENT_PREFIX) + ? url.pathname + url.search + : undefined; + } +} + +;// ./node_modules/vot.js/dist/helpers/vk.js + +class VKHelper extends BaseHelper { + async getVideoId(url) { + const pathID = /^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(url.pathname); + if (pathID) { + return pathID[0].slice(1); + } + const paramZ = url.searchParams.get("z"); + if (paramZ) { + return paramZ.split("/")[0]; + } + const paramOID = url.searchParams.get("oid"); + const paramID = url.searchParams.get("id"); + if (paramOID && paramID) { + return `video-${Math.abs(parseInt(paramOID))}_${paramID}`; + } + return undefined; + } +} + +;// ./node_modules/vot.js/dist/helpers/trovo.js + +class TrovoHelper extends BaseHelper { + async getVideoId(url) { + const vid = url.searchParams.get("vid"); + const path = /([^/]+)\/([\d]+)/.exec(url.pathname)?.[0]; + if (!vid || !path) { + return undefined; + } + return `${path}?vid=${vid}`; + } +} + +;// ./node_modules/vot.js/dist/helpers/incestflix.js + + + +class IncestflixHelper extends BaseHelper { + async getVideoData(videoId) { + try { + const sourceEl = document.querySelector("#incflix-stream source:first-of-type"); + if (!sourceEl) { + throw new VideoHelperError("Failed to find source element"); + } + const srcLink = sourceEl.getAttribute("src"); + const source = new URL(srcLink.startsWith("//") ? `https:${srcLink}` : srcLink); + source.searchParams.append("media-proxy", "video.mp4"); + return { + url: proxyMedia(source), + }; + } + catch (err) { + Logger.error(`Failed to get Incestflix data by videoId: ${videoId}`, err.message); + return undefined; + } + } + async getVideoId(url) { + return /\/watch\/([^/]+)/.exec(url.pathname)?.[1]; + } +} + +;// ./node_modules/vot.js/dist/helpers/porntn.js + + + +class PornTNHelper extends BaseHelper { + async getVideoData(videoId) { + try { + const content = document.body.innerHTML; + const varDelimiter = /var flashvars\s=\s/; + const dataScript = document + .getElementsByTagName("script") + .find((node) => varDelimiter.exec(node.textContent)); + if (!dataScript) { + throw new VideoHelperError("Failed to find data script"); + } + const scriptText = dataScript.textContent + .split(varDelimiter)?.[1] + ?.split(";\n", 1)[0] + .replace(/(\t|\n)/g, ""); + Logger.log(scriptText); + const source = /video_url: 'function\/0\/([^']+)'/.exec(content)?.[1]; + const rnd = /rnd: '([^']+)'/.exec(content)?.[1]; + if (!source || !rnd) { + throw new VideoHelperError("Failed to find video source or rnd"); + } + const title = /video_title: '([^']+)'/.exec(content)?.[1]; + const url = new URL(source); + url.searchParams.append("rnd", rnd); + Logger.log(url.href); + return { + url: proxyMedia(url), + title, + }; + } + catch (err) { + Logger.error(`Failed to get PornTN data by videoId: ${videoId}`, err.message); + return undefined; + } + } + async getVideoId(url) { + return /\/videos\/(([^/]+)\/([^/]+))/.exec(url.pathname)?.[1]; + } +} + ;// ./node_modules/vot.js/dist/helpers/index.js @@ -4130,6 +4701,16 @@ class VimeoHelper extends BaseHelper { + + + + + + + + + + @@ -4153,13 +4734,18 @@ const availableHelpers = { [VideoService.epicgames]: EpicGamesHelper, [VideoService.nineanimetv]: NineAnimeTVHelper, [VideoService.odysee]: OdyseeHelper, - [VideoService.coursehunter]: CoursehunterHelper, + [VideoService.coursehunterLike]: CoursehunterLikeHelper, [VideoService.twitch]: TwitchHelper, [VideoService.sap]: SapHelper, [VideoService.udemy]: UdemyHelper, [VideoService.coursera]: CourseraHelper, [VideoService.linkedin]: LinkedinHelper, [VideoService.vimeo]: VimeoHelper, + [VideoService.yandexdisk]: YandexDiskHelper, + [VideoService.vk]: VKHelper, + [VideoService.trovo]: TrovoHelper, + [VideoService.incestflix]: IncestflixHelper, + [VideoService.porntn]: PornTNHelper, }; class VideoHelper { helpersData; @@ -4218,6 +4804,7 @@ async function getVideoID(service, video, opts = {}) { case VideoService.piped: case VideoService.poketube: case VideoService.invidious: + case VideoService.ricktube: case VideoService.youtube: if (url.hostname === "youtu.be") { url.search = `?v=${url.pathname.replace("/", "")}`; @@ -4225,26 +4812,6 @@ async function getVideoID(service, video, opts = {}) { } return (/(?:watch|embed|shorts|live)\/([^/]+)/.exec(url.pathname)?.[1] ?? url.searchParams.get("v")); - case VideoService.vk: { - const pathID = /^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(url.pathname); - const paramZ = url.searchParams.get("z"); - const paramOID = url.searchParams.get("oid"); - const paramID = url.searchParams.get("id"); - if (pathID) { - return pathID[0].slice(1); - } - else if (paramZ) { - return paramZ.split("/")[0]; - } - else if (paramOID && paramID) { - return `video-${Math.abs(parseInt(paramOID))}_${paramID}`; - } - const videoBox = video.parentElement?.closest(".video_box_wrap"); - if (videoBox) { - return videoBox.id.replace("video_box_wrap", "video"); - } - return null; - } case VideoService.nine_gag: case VideoService.gag: return /gag\/([^/]+)/.exec(url.pathname)?.[1]; @@ -4264,11 +4831,15 @@ async function getVideoID(service, video, opts = {}) { case VideoService.rutube: return /(?:video|embed)\/([^/]+)/.exec(url.pathname)?.[1]; case VideoService.bilibili: { + const bangumiId = /bangumi\/play\/([^/]+)/.exec(url.pathname)?.[0]; + if (bangumiId) { + return bangumiId; + } const bvid = url.searchParams.get("bvid"); if (bvid) { - return bvid; + return `video/${bvid}`; } - let vid = /video\/([^/]+)/.exec(url.pathname)?.[1]; + let vid = /video\/([^/]+)/.exec(url.pathname)?.[0]; if (vid && url.searchParams.get("p") !== null) { vid += `/?p=${url.searchParams.get("p")}`; } @@ -4292,19 +4863,6 @@ async function getVideoID(service, video, opts = {}) { } return /\/video\/(\w+)\.m3u8/.exec(videoUrl)?.[1]; } - case VideoService.trovo: { - const vid = url.searchParams.get("vid"); - if (!vid) { - return null; - } - const path = /([^/]+)\/([\d]+)/.exec(url.pathname)?.[0]; - if (!path) { - return null; - } - return `${path}?vid=${vid}`; - } - case VideoService.yandexdisk: - return /\/i\/([^/]+)/.exec(url.pathname)?.[1]; case VideoService.okru: { return /\/video\/(\d+)/.exec(url.pathname)?.[1]; } @@ -4329,8 +4887,9 @@ async function getVideoData(service, video, opts = {}) { if (!videoId) { throw new VideoDataError(`Entered unsupported link: "${service.host}"`); } - if (service.host === VideoService.peertube) { - service.url = window.location.origin; + const origin = window.location.origin; + if ([VideoService.peertube, VideoService.coursehunterLike].includes(service.host)) { + service.url = origin; } if (service.rawResult) { return { @@ -4348,7 +4907,11 @@ async function getVideoData(service, video, opts = {}) { duration: undefined, }; } - const helper = new VideoHelper({ ...opts, service }).getHelper(service.host); + const helper = new VideoHelper({ + ...opts, + service, + origin, + }).getHelper(service.host); const result = await helper.getVideoData(videoId); if (!result) { throw new VideoDataError(`Failed to get video raw url for ${service.host}`); @@ -4375,18 +4938,6 @@ function convertVOT(service, videoId, url) { }; } -;// ./src/utils/VOTLocalizedError.js - - -class VOTLocalizedError extends Error { - constructor(message) { - super(localizationProvider.getDefault(message)); - this.name = "VOTLocalizedError"; - this.unlocalizedMessage = message; - this.localizedMessage = localizationProvider.get(message); - } -} - ;// ./node_modules/vot.js/dist/client.js @@ -4399,7 +4950,6 @@ class VOTLocalizedError extends Error { -const { /* version */ "rE": version } = package_namespaceObject; class VOTJSError extends Error { data; constructor(message, data = undefined) { @@ -4424,6 +4974,8 @@ class VOTClient { componentVersion = config.componentVersion; paths = { videoTranslation: "/video-translation/translate", + videoTranslationFailAudio: "/video-translation/fail-audio-js", + videoTranslationAudio: "/video-translation/audio", videoSubtitles: "/video-subtitles/get-subtitles", streamPing: "/stream-translation/ping-stream", streamTranslation: "/stream-translation/translate-stream", @@ -4443,7 +4995,7 @@ class VOTClient { "Sec-Fetch-Mode": "no-cors", }; headersVOT = { - "User-Agent": `vot.js/${version}`, + "User-Agent": `vot.js/${config.version}`, "Content-Type": "application/json", Pragma: "no-cache", "Cache-Control": "no-cache", @@ -4463,9 +5015,9 @@ class VOTClient { this.responseLang = responseLang; this.headers = { ...this.headers, ...headers }; } - getOpts(body, headers = {}) { + getOpts(body, headers = {}, method = "POST") { return { - method: "POST", + method, headers: { ...this.headers, ...headers, @@ -4474,11 +5026,31 @@ class VOTClient { ...this.fetchOpts, }; } - async request(path, body, headers = {}) { - const options = this.getOpts(new Blob([body]), headers); + async request(path, body, headers = {}, method = "POST") { + const options = this.getOpts(new Blob([body]), headers, method); try { const res = await this.fetch(`${this.schema}://${this.host}${path}`, options); - const data = await res.arrayBuffer(); + const data = (await res.arrayBuffer()); + return { + success: res.status === 200, + data, + }; + } + catch (err) { + return { + success: false, + data: err?.message, + }; + } + } + async requestJSON(path, body = null, headers = {}, method = "POST") { + const options = this.getOpts(body, { + "Content-Type": "application/json", + ...headers, + }, method); + try { + const res = await this.fetch(`${this.schema}://${this.host}${path}`, options); + const data = (await res.json()); return { success: res.status === 200, data, @@ -4526,7 +5098,7 @@ class VOTClient { }; return this.sessions[module]; } - async translateVideoYAImpl({ videoData, requestLang = this.requestLang, responseLang = this.responseLang, translationHelp = null, headers = {}, }) { + async translateVideoYAImpl({ videoData, requestLang = this.requestLang, responseLang = this.responseLang, translationHelp = null, headers = {}, shouldSendFailedAudio = true, }) { const { url, duration = config.defaultDuration } = videoData; const { secretKey, uuid } = await this.getSession("video-translation"); const body = yandexProtobuf.encodeTranslationRequest(url, duration, requestLang, responseLang, translationHelp); @@ -4541,7 +5113,7 @@ class VOTClient { throw new VOTLocalizedError("requestTranslationFailed"); } const translationData = yandexProtobuf.decodeTranslationResponse(res.data); - utils_debug.log("requestTranslation", translationData); + debug.log("requestTranslation", translationData); switch (translationData.status) { case VideoTranslationStatus.FAILED: throw translationData?.message ? new VOTJSError("Yandex couldn't translate video", translationData) : new VOTLocalizedError("requestTranslationFailed"); @@ -4562,12 +5134,24 @@ class VOTClient { }; case VideoTranslationStatus.LONG_WAITING: case VideoTranslationStatus.LONG_WAITING_2: + if (url.startsWith("https://youtu.be/") && shouldSendFailedAudio) { + await this.requestVtransFailAudio(url); + await this.requestVtransAudio(url, translationData.translationId); + return await this.translateVideoYAImpl({ + videoData, + requestLang, + responseLang, + translationHelp, + headers, + shouldSendFailedAudio: false, + }); + } return { translated: false, remainingTime: translationData.remainingTime ?? -1, }; default: - console.error("[vot.js] Unknown response", translationData); + Logger.error("Unknown response", translationData); throw new VOTJSError("Unknown response from Yandex", translationData); } } @@ -4605,6 +5189,30 @@ class VOTClient { }; } } + async requestVtransFailAudio(url) { + const res = await this.requestJSON(this.paths.videoTranslationFailAudio, JSON.stringify({ + video_url: url, + }), undefined, "PUT"); + if (!res.data || typeof res.data === "string" || res.data.status !== 1) { + throw new VOTJSError("Failed to request to fake video translation fail audio js", res); + } + return res; + } + async requestVtransAudio(url, translationId, headers = {}) { + const { secretKey, uuid } = await this.getSession("video-translation"); + const body = yandexProtobuf.encodeTranslationAudioRequest(url, translationId); + const sign = await getSignature(body); + const res = await this.request(this.paths.videoTranslationAudio, body, { + "Vtrans-Signature": sign, + "Sec-Vtrans-Sk": secretKey, + "Sec-Vtrans-Token": `${sign}:${uuid}:${this.paths.videoTranslationAudio}:${this.componentVersion}`, + ...headers, + }, "PUT"); + if (!res.success) { + throw new VOTJSError("Failed to request video translation audio", res); + } + return yandexProtobuf.decodeTranslationAudioResponse(res.data); + } async translateVideo({ videoData, requestLang = this.requestLang, responseLang = this.responseLang, translationHelp = null, headers = {}, }) { const { url, videoId, host } = videoData; return this.isCustomLink(url) @@ -4699,7 +5307,7 @@ class VOTClient { }; } default: - console.error("[vot.js] Unknown response", translateResponse); + Logger.error("Unknown response", translateResponse); throw new VOTJSError("Unknown response from Yandex", translateResponse); } } @@ -4720,7 +5328,7 @@ class VOTClient { } } class VOTWorkerClient extends VOTClient { - async request(path, body, headers = {}) { + async request(path, body, headers = {}, method = "POST") { const options = this.getOpts(JSON.stringify({ headers: { ...this.headers, @@ -4729,10 +5337,38 @@ class VOTWorkerClient extends VOTClient { body: Array.from(body), }), { "Content-Type": "application/json", - }); + }, method); try { const res = await this.fetch(`${this.schema}://${this.host}${path}`, options); - const data = await res.arrayBuffer(); + const data = (await res.arrayBuffer()); + return { + success: res.status === 200, + data, + }; + } + catch (err) { + return { + success: false, + data: err?.message, + }; + } + } + async requestJSON(path, body = null, headers = {}, method = "POST") { + const options = this.getOpts(JSON.stringify({ + headers: { + ...this.headers, + "Content-Type": "application/json", + Accept: "application/json", + ...headers, + }, + body, + }), { + Accept: "application/json", + "Content-Type": "application/json", + }, method); + try { + const res = await this.fetch(`${this.schema}://${this.host}${path}`, options); + const data = (await res.json()); return { success: res.status === 200, data, @@ -4774,6 +5410,7 @@ var TypeName; + ;// ./node_modules/vot.js/dist/index.js @@ -4888,2129 +5525,3383 @@ const n=globalThis,c=n.trustedTypes,h=c?c.createPolicy("lit-html",{createHTML:t= ;// ./node_modules/browser-id3-writer/dist/browser-id3-writer.mjs function e(e){return String(e).split("").map((e=>e.charCodeAt(0)))}function t(t){return new Uint8Array(e(t))}function a(t){const a=new ArrayBuffer(2*t.length),r=new Uint8Array(a);return new Uint16Array(a).set(e(t)),r}function r(e){const t=255;return[e>>>24&t,e>>>16&t,e>>>8&t,e&t]}function browser_id3_writer_n(e){return 11+e}function s(e,t,a,r){return 11+t+1+1+(r?2+2*(a+1):a+1)+e}function i(e){let t=0;return e.forEach((e=>{t+=2+2*e[0].length+2+2+2*e[1].length+2})),11+t}function browser_id3_writer_c(e,t){const a=2*t;let r=0;return e.forEach((e=>{r+=2+2*e[0].length+2+4})),18+a+2+r}class o{_setIntegerFrame(e,t){const a=parseInt(t,10);this.frames.push({name:e,value:a,size:browser_id3_writer_n(a.toString().length)})}_setStringFrame(e,t){const a=t.toString();let r=13+2*a.length;"TDAT"===e&&(r=browser_id3_writer_n(a.length)),this.frames.push({name:e,value:a,size:r})}_setPictureFrame(e,t,a,r){const n=function(e){if(!e||!e.length)return null;if(255===e[0]&&216===e[1]&&255===e[2])return"image/jpeg";if(137===e[0]&&80===e[1]&&78===e[2]&&71===e[3])return"image/png";if(71===e[0]&&73===e[1]&&70===e[2])return"image/gif";if(87===e[8]&&69===e[9]&&66===e[10]&&80===e[11])return"image/webp";const t=73===e[0]&&73===e[1]&&42===e[2]&&0===e[3],a=77===e[0]&&77===e[1]&&0===e[2]&&42===e[3];return t||a?"image/tiff":66===e[0]&&77===e[1]?"image/bmp":0===e[0]&&0===e[1]&&1===e[2]&&0===e[3]?"image/x-icon":null}(new Uint8Array(t)),i=a.toString();if(!n)throw new Error("Unknown picture MIME type");a||(r=!1),this.frames.push({name:"APIC",value:t,pictureType:e,mimeType:n,useUnicodeEncoding:r,description:i,size:s(t.byteLength,n.length,i.length,r)})}_setLyricsFrame(e,t,a){const r=e.split("").map((e=>e.charCodeAt(0))),n=t.toString(),s=a.toString();var i,c;this.frames.push({name:"USLT",value:s,language:r,description:n,size:(i=n.length,c=s.length,16+2*i+2+2+2*c)})}_setCommentFrame(e,t,a){const r=e.split("").map((e=>e.charCodeAt(0))),n=t.toString(),s=a.toString();var i,c;this.frames.push({name:"COMM",value:s,language:r,description:n,size:(i=n.length,c=s.length,16+2*i+2+2+2*c)})}_setPrivateFrame(e,t){const a=e.toString();var r,n;this.frames.push({name:"PRIV",value:t,id:a,size:(r=a.length,n=t.byteLength,10+r+1+n)})}_setUserStringFrame(e,t){const a=e.toString(),r=t.toString();var n,s;this.frames.push({name:"TXXX",description:a,value:r,size:(n=a.length,s=r.length,13+2*n+2+2+2*s)})}_setUrlLinkFrame(e,t){const a=t.toString();var r;this.frames.push({name:e,value:a,size:(r=a.length,10+r)})}_setPairedTextFrame(e,t){this.frames.push({name:e,value:t,size:i(t)})}_setSynchronisedLyricsFrame(e,t,a,r,n){const s=n.toString(),i=r.split("").map((e=>e.charCodeAt(0)));this.frames.push({name:"SYLT",value:t,language:i,description:s,type:e,timestampFormat:a,size:browser_id3_writer_c(t,s.length)})}constructor(e){if(!e||"object"!=typeof e||!("byteLength"in e))throw new Error("First argument should be an instance of ArrayBuffer or Buffer");this.arrayBuffer=e,this.padding=4096,this.frames=[],this.url=""}setFrame(e,t){switch(e){case"TPE1":case"TCOM":case"TCON":{if(!Array.isArray(t))throw new Error(`${e} frame value should be an array of strings`);const a="TCON"===e?";":"/",r=t.join(a);this._setStringFrame(e,r);break}case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TMED":case"TPUB":case"TCOP":case"TKEY":case"TEXT":case"TDAT":case"TSRC":this._setStringFrame(e,t);break;case"TBPM":case"TLEN":case"TYER":this._setIntegerFrame(e,t);break;case"USLT":if(t.language=t.language||"eng","object"!=typeof t||!("description"in t)||!("lyrics"in t))throw new Error("USLT frame value should be an object with keys description and lyrics");if(t.language&&!t.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setLyricsFrame(t.language,t.description,t.lyrics);break;case"APIC":if("object"!=typeof t||!("type"in t)||!("data"in t)||!("description"in t))throw new Error("APIC frame value should be an object with keys type, data and description");if(t.type<0||t.type>20)throw new Error("Incorrect APIC frame picture type");this._setPictureFrame(t.type,t.data,t.description,!!t.useUnicodeEncoding);break;case"TXXX":if("object"!=typeof t||!("description"in t)||!("value"in t))throw new Error("TXXX frame value should be an object with keys description and value");this._setUserStringFrame(t.description,t.value);break;case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":this._setUrlLinkFrame(e,t);break;case"COMM":if(t.language=t.language||"eng","object"!=typeof t||!("description"in t)||!("text"in t))throw new Error("COMM frame value should be an object with keys description and text");if(t.language&&!t.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setCommentFrame(t.language,t.description,t.text);break;case"PRIV":if("object"!=typeof t||!("id"in t)||!("data"in t))throw new Error("PRIV frame value should be an object with keys id and data");this._setPrivateFrame(t.id,t.data);break;case"IPLS":if(!Array.isArray(t)||!Array.isArray(t[0]))throw new Error("IPLS frame value should be an array of pairs");this._setPairedTextFrame(e,t);break;case"SYLT":if("object"!=typeof t||!("type"in t)||!("text"in t)||!("timestampFormat"in t))throw new Error("SYLT frame value should be an object with keys type, text and timestampFormat");if(!Array.isArray(t.text)||!Array.isArray(t.text[0]))throw new Error("SYLT frame text value should be an array of pairs");if(t.type<0||t.type>6)throw new Error("Incorrect SYLT frame content type");if(t.timestampFormat<1||t.timestampFormat>2)throw new Error("Incorrect SYLT frame time stamp format");t.language=t.language||"eng",t.description=t.description||"",this._setSynchronisedLyricsFrame(t.type,t.text,t.timestampFormat,t.language,t.description);break;default:throw new Error(`Unsupported frame ${e}`)}return this}removeTag(){if(this.arrayBuffer.byteLength<10)return;const e=new Uint8Array(this.arrayBuffer),t=e[3],a=((r=[e[6],e[7],e[8],e[9]])[0]<<21)+(r[1]<<14)+(r[2]<<7)+r[3]+10;var r,n;73!==(n=e)[0]||68!==n[1]||51!==n[2]||t<2||t>4||(this.arrayBuffer=new Uint8Array(e.subarray(a)).buffer)}addTag(){this.removeTag();const e=[255,254],n=10+this.frames.reduce(((e,t)=>e+t.size),0)+this.padding,s=new ArrayBuffer(this.arrayBuffer.byteLength+n),i=new Uint8Array(s);let c=0,o=[];return o=[73,68,51,3],i.set(o,c),c+=o.length,c++,c++,o=function(e){const t=127;return[e>>>21&t,e>>>14&t,e>>>7&t,e&t]}(n-10),i.set(o,c),c+=o.length,this.frames.forEach((n=>{switch(o=t(n.name),i.set(o,c),c+=o.length,o=r(n.size-10),i.set(o,c),c+=o.length,c+=2,n.name){case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":o=t(n.value),i.set(o,c),c+=o.length;break;case"TPE1":case"TCOM":case"TCON":case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TKEY":case"TMED":case"TPUB":case"TCOP":case"TEXT":case"TSRC":o=[1].concat(e),i.set(o,c),c+=o.length,o=a(n.value),i.set(o,c),c+=o.length;break;case"TXXX":case"USLT":case"COMM":o=[1],"USLT"!==n.name&&"COMM"!==n.name||(o=o.concat(n.language)),o=o.concat(e),i.set(o,c),c+=o.length,o=a(n.description),i.set(o,c),c+=o.length,o=[0,0].concat(e),i.set(o,c),c+=o.length,o=a(n.value),i.set(o,c),c+=o.length;break;case"TBPM":case"TLEN":case"TDAT":case"TYER":c++,o=t(n.value),i.set(o,c),c+=o.length;break;case"PRIV":o=t(n.id),i.set(o,c),c+=o.length,c++,i.set(new Uint8Array(n.value),c),c+=n.value.byteLength;break;case"APIC":o=[n.useUnicodeEncoding?1:0],i.set(o,c),c+=o.length,o=t(n.mimeType),i.set(o,c),c+=o.length,o=[0,n.pictureType],i.set(o,c),c+=o.length,n.useUnicodeEncoding?(o=[].concat(e),i.set(o,c),c+=o.length,o=a(n.description),i.set(o,c),c+=o.length,c+=2):(o=t(n.description),i.set(o,c),c+=o.length,c++),i.set(new Uint8Array(n.value),c),c+=n.value.byteLength;break;case"IPLS":o=[1],i.set(o,c),c+=o.length,n.value.forEach((t=>{o=[].concat(e),i.set(o,c),c+=o.length,o=a(t[0].toString()),i.set(o,c),c+=o.length,o=[0,0].concat(e),i.set(o,c),c+=o.length,o=a(t[1].toString()),i.set(o,c),c+=o.length,o=[0,0],i.set(o,c),c+=o.length}));break;case"SYLT":o=[1].concat(n.language).concat(n.timestampFormat).concat(n.type),i.set(o,c),c+=o.length,o=[].concat(e),i.set(o,c),c+=o.length,o=a(n.description),i.set(o,c),c+=o.length,c+=2,n.value.forEach((t=>{o=[].concat(e),i.set(o,c),c+=o.length,o=a(t[0].toString()),i.set(o,c),c+=o.length,o=[0,0],i.set(o,c),c+=o.length,o=r(t[1]),i.set(o,c),c+=o.length}))}})),c+=this.padding,i.set(new Uint8Array(this.arrayBuffer),c),this.arrayBuffer=s,s}getBlob(){return new Blob([this.arrayBuffer],{type:"audio/mpeg"})}getURL(){return this.url||(this.url=URL.createObjectURL(this.getBlob())),this.url}revokeURL(){URL.revokeObjectURL(this.url)}} -// EXTERNAL MODULE: ./src/styles/main.scss -var main = __webpack_require__("./src/styles/main.scss"); -;// ./src/ui.js +;// ./src/utils/translateApis.js +const YandexTranslateAPI = { + async translate(text, lang) { + // Limit: 10k symbols + // + // Lang examples: + // en-ru, uk-ru, ru-en... + // ru, en (instead of auto-ru, auto-en) + try { + const response = await GM_fetch( + `${translateUrls.yandex}?${new URLSearchParams({ + text, + lang, + })}`, + { timeout: 3000 }, + ); -const undefinedPhrase = "#UNDEFINED"; -const arrowIconRaw = Oe` - -`; -const animeOpts = { - easing: "linear", - delay: function (el, i) { - return i * 200; - }, -}; + if (response instanceof Error) { + throw response; + } -/** - * Create header element - * - * @param {HTMLElement|string} html - header content - * @param {1|2|3|4|5|6} level - header level - * @return {HTMLElement} HTML header element - */ -function createHeader(html, level = 4) { - const header = document.createElement("vot-block"); - header.classList.add("vot-header", `vot-header-level-${level}`); - header.append(html); + const content = await response.json(); - return header; -} + if (content.code !== 200) { + throw content.message; + } -/** - * Create information element - * - * @param {HTMLElement|string} labelHtml - label content - * @param {HTMLElement|string} valueHtml - value content - * @return {{ - * container: HTMLElement, - * header: HTMLElement, - * value: HTMLElement - * }} information elements - */ -function createInformation(labelHtml, valueHtml) { - const container = document.createElement("vot-block"); - container.classList.add("vot-info"); + return content.text[0]; + } catch (error) { + console.error("Error translating text:", error); + return text; + } + }, - const header = document.createElement("vot-block"); - Q(labelHtml, header); + async detect(text) { + // Limit: 10k symbols + try { + const response = await GM_fetch( + `${detectUrls.yandex}?${new URLSearchParams({ + text, + })}`, + { timeout: 3000 }, + ); - const value = document.createElement("vot-block"); - Q(valueHtml, value); + if (response instanceof Error) { + throw response; + } - container.append(header, value); + const content = await response.json(); + if (content.code !== 200) { + throw content.message; + } - return { - container, - header, - value, - }; -} + return content.lang ?? "en"; + } catch (error) { + console.error("Error getting lang from text:", error); + return "en"; + } + }, +}; -/** - * Create button - * - * @param {HTMLElement|string} html - button content - * @return {HTMLElement} HTML button element - */ -function createButton(html) { - const button = document.createElement("vot-block"); - button.classList.add("vot-button"); - button.append(html); +const RustServerAPI = { + async detect(text) { + try { + const response = await GM_fetch( + detectUrls.rustServer, + { + method: "POST", + body: text, + }, + { timeout: 3000 }, + ); - return button; -} + if (response instanceof Error) { + throw response; + } -/** - * Create text button - * - * @param {HTMLElement|string} html - button content - * @return {HTMLElement} HTML text button element - */ -function createTextButton(html) { - const button = document.createElement("vot-block"); - button.classList.add("vot-text-button"); - button.append(html); + return await response.text(); + } catch (error) { + console.error("Error getting lang from text:", error); + return "en"; + } + }, +}; - return button; -} +const DeeplServerAPI = { + async translate(text, fromLang = "auto", toLang = "ru") { + try { + const response = await GM_fetch( + translateUrls.deepl, + { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + text, + source_lang: fromLang, + target_lang: toLang, + }), + }, + { timeout: 3000 }, + ); -/** - * Create outlined button - * - * @param {HTMLElement|string} html - button content - * @return {HTMLElement} HTML outlined button element - */ -function createOutlinedButton(html) { - const button = document.createElement("vot-block"); - button.classList.add("vot-outlined-button"); - button.append(html); + if (response instanceof Error) { + throw response; + } - return button; -} + const content = await response.json(); -/** - * Create icon button - * - * @param {TemplateResult} templateHtml - icon svg lit template - * @return {HTMLElement} HTML icon button element - */ -function createIconButton(templateHtml) { - const button = document.createElement("vot-block"); - button.classList.add("vot-icon-button"); - Q(templateHtml, button); + if (content.code !== 200) { + throw content.message; + } - return button; + return content.data; + } catch (error) { + console.error("Error translating text:", error); + return text; + } + }, +}; + +async function translate(text, fromLang = "", toLang = "ru") { + const service = await votStorage.get( + "translationService", + defaultTranslationService, + ); + switch (service) { + case "yandex": { + const langPair = fromLang && toLang ? `${fromLang}-${toLang}` : toLang; + return await YandexTranslateAPI.translate(text, langPair); + } + case "deepl": { + return await DeeplServerAPI.translate(text, fromLang, toLang); + } + default: + return text; + } } -/** - * Create checkbox - * - * @param {string|HTMLElement} html - label content - * @param {boolean} value - checkbox state - * @return {{ - * container: HTMLElement, - * input: HTMLInputElement, - * label: HTMLSpanElement - * }} checkbox elements - */ -function createCheckbox(html, value = false) { - const container = document.createElement("label"); - container.classList.add("vot-checkbox"); +async function detect(text) { + const service = await votStorage.get("detectService", defaultDetectService); + switch (service) { + case "yandex": + return await YandexTranslateAPI.detect(text); + case "rust-server": + return await RustServerAPI.detect(text); + default: + return "en"; + } +} - const input = document.createElement("input"); - input.type = "checkbox"; - input.checked = Boolean(value); +const translateServices = Object.keys(translateUrls); +const detectServices = Object.keys(detectUrls).map((k) => + k === "rustServer" ? "rust-server" : k, +); - const label = document.createElement("span"); - label.append(html); - container.append(input, label); - return { container, input, label }; -} +;// ./src/utils/youtubeUtils.js -/** - * Update slider value - * - * @param {HTMLInputElement} input - slider input element - */ -function updateSlider(input) { - const value = +input.value; - const min = +input.min; - const max = +input.max; - const progress = (value - min) / (max - min); - input.parentElement.setAttribute("style", `--vot-progress: ${progress}`); -} -/** - * Create slider - * - * @param {string|HTMLElement} html - label content - * @param {number} value - default value - * @param {number} min - min value - * @param {number} max - max value - * @return {{ - * container: HTMLElement, - * input: HTMLInputElement, - * label: HTMLSpanElement - * }} slider elements - */ -function createSlider(labelHtml, value = 50, min = 0, max = 100) { - const container = document.createElement("vot-block"); - container.classList.add("vot-slider"); - const input = document.createElement("input"); - input.type = "range"; - input.min = min; - input.max = max; - input.value = value; - const label = document.createElement("span"); - Q(labelHtml, label); - container.append(input, label); - input.addEventListener("input", (e) => updateSlider(e.target)); - updateSlider(input); - return { - container, - input, - label, - }; -} -/** - * Create textfield - * - * @param {string|HTMLElement} html - label content - * @param {string} value - default value - * @param {string} placeholder - textfield placeholder - * @param {boolean} multiline - multiline textfield - * @return {{ - * container: HTMLElement, - * input: HTMLInputElement, - * label: HTMLSpanElement - * }} textfield elements - */ -function createTextfield( - html, - value = "", - placeholder = " ", - multiline = false, -) { - const container = document.createElement("vot-block"); - container.classList.add("vot-textfield"); +// Get the language code from the response or the text +async function getLanguage(player, response, title, description) { + if ( + !window.location.hostname.includes("m.youtube.com") && + player?.getAudioTrack + ) { + // ! Experimental ! get lang from selected audio track if availabled + const audioTracks = player.getAudioTrack(); + const trackInfo = audioTracks?.getLanguageInfo(); // get selected track info (id === "und" if tracks are not available) + if (trackInfo?.id !== "und") { + return normalizeLang(trackInfo.id.split(".")[0]); + } + } - const input = document.createElement(multiline ? "textarea" : "input"); - input.placeholder = placeholder; - input.value = value; - if (!html) { - input.classList.add("vot-show-placeholer"); + // TODO: If the audio tracks will work fine, transfer the receipt of captions to the audioTracks variable + // Check if there is an automatic caption track in the response + const captionTracks = + response?.captions?.playerCaptionsTracklistRenderer?.captionTracks; + if (captionTracks?.length) { + const autoCaption = captionTracks.find((caption) => caption.kind === "asr"); + if (autoCaption && autoCaption.languageCode) { + return normalizeLang(autoCaption.languageCode); + } } - const label = document.createElement("span"); - label.append(html); + // If there is no caption track, use detect to get the language code from the description - container.append(input, label); + const text = cleanText(title, description); - return { - container, - input, - label, - }; + debug.log(`Detecting language text: ${text}`); + + return detect(text); } -/** - * Create dialog - * - * @param {string|HTMLElement} html - title content - * @return {{ - * container: HTMLElement, - * backdrop: HTMLElement, - * dialog: HTMLElement, - * contentWrapper: HTMLElement, - * headerContainer: HTMLElement, - * bodyContainer: HTMLElement, - * footerContainer: HTMLElement, - * titleContainer: HTMLElement, - * closeButton: HTMLElement, - * title: HTMLElement, - * }} dialog elements - */ -function createDialog(html) { - const container = document.createElement("vot-block"); - container.classList.add("vot-dialog-container"); - container.hidden = true; +function isMobile() { + return /^m\.youtube\.com$/.test(window.location.hostname); +} - const backdrop = document.createElement("vot-block"); - backdrop.classList.add("vot-dialog-backdrop"); +function getPlayer() { + if (window.location.pathname.startsWith("/shorts/") && !isMobile()) { + return document.querySelector("#shorts-player"); + } - const dialog = document.createElement("vot-block"); - dialog.classList.add("vot-dialog"); + return document.querySelector("#movie_player"); +} - const contentWrapper = document.createElement("vot-block"); - contentWrapper.classList.add("vot-dialog-content-wrapper"); +function getPlayerResponse() { + const player = getPlayer(); + if (player?.getPlayerResponse) + return player?.getPlayerResponse?.call() ?? null; + return player?.data?.playerResponse ?? null; +} - const headerContainer = document.createElement("vot-block"); - headerContainer.classList.add("vot-dialog-header-container"); +function getPlayerData() { + const player = getPlayer(); + if (player?.getVideoData) return player?.getVideoData?.call() ?? null; + return player?.data?.playerResponse?.videoDetails ?? null; +} - const bodyContainer = document.createElement("vot-block"); - bodyContainer.classList.add("vot-dialog-body-container"); +function getVideoVolume() { + const player = getPlayer(); + if (player?.getVolume) { + return player.getVolume.call() / 100; + } - const footerContainer = document.createElement("vot-block"); - footerContainer.classList.add("vot-dialog-footer-container"); + return 1; +} - const titleContainer = document.createElement("vot-block"); - titleContainer.classList.add("vot-dialog-title-container"); +function setVideoVolume(volume) { + const player = getPlayer(); + if (player?.setVolume) { + player.setVolume(Math.round(volume * 100)); + return true; + } +} - const closeButton = createIconButton( - Oe` - - `, +function isMuted() { + const player = getPlayer(); + if (player?.isMuted) { + return player.isMuted.call(); + } + + return false; +} + +function videoSeek(video, time) { + // * TIME IN MS + debug.log("videoSeek", time); + const preTime = + getPlayer()?.getProgressState()?.seekableEnd || video.currentTime; + const finalTime = preTime - time; // we always throw it to the end of the stream - time + video.currentTime = finalTime; +} + +function isMusic() { + // Нужно доработать логику + const channelName = getPlayerData().author, + titleStr = getPlayerData().title.toUpperCase(), + titleWordsList = titleStr.match(/\w+/g), + playerData = document.body.querySelector("ytd-watch-flexy")?.playerData; + + return ( + [ + titleStr, + document.URL, + channelName, + playerData?.microformat?.playerMicroformatRenderer.category, + playerData?.title, + ].some((i) => i?.toUpperCase().includes("MUSIC")) || + document.body.querySelector( + "#upload-info #channel-name .badge-style-type-verified-artist", + ) || + (channelName && + /(VEVO|Topic|Records|RECORDS|Recordings|AMV)$/.test(channelName)) || + (channelName && + /(MUSIC|ROCK|SOUNDS|SONGS)/.test(channelName.toUpperCase())) || + (titleWordsList?.length && + [ + "🎵", + "♫", + "SONG", + "SONGS", + "SOUNDTRACK", + "LYRIC", + "LYRICS", + "AMBIENT", + "MIX", + "VEVO", + "CLIP", + "KARAOKE", + "OPENING", + "COVER", + "COVERED", + "VOCAL", + "INSTRUMENTAL", + "ORCHESTRAL", + "DUBSTEP", + "DJ", + "DNB", + "BASS", + "BEAT", + "ALBUM", + "PLAYLIST", + "DUBSTEP", + "CHILL", + "RELAX", + "CLASSIC", + "CINEMATIC", + ].some((i) => titleWordsList.includes(i))) || + [ + "OFFICIAL VIDEO", + "OFFICIAL AUDIO", + "FEAT.", + "FT.", + "LIVE RADIO", + "DANCE VER", + "HIP HOP", + "ROCK N ROLL", + "HOUR VER", + "HOURS VER", + "INTRO THEME", + ].some((i) => titleStr.includes(i)) || + (titleWordsList?.length && + [ + "OP", + "ED", + "MV", + "OST", + "NCS", + "BGM", + "EDM", + "GMV", + "AMV", + "MMD", + "MAD", + ].some((i) => titleWordsList.includes(i))) ); - closeButton.classList.add("vot-dialog-close-button"); +} - backdrop.onclick = closeButton.onclick = () => { - container.hidden = true; - }; +function getSubtitles() { + const response = getPlayerResponse(); + const playerCaptions = response?.captions?.playerCaptionsTracklistRenderer; + if (!playerCaptions) { + return []; + } - const title = document.createElement("vot-block"); - title.classList.add("vot-dialog-title"); - title.append(html); + let captionTracks = playerCaptions.captionTracks ?? []; + const translationLanguages = playerCaptions.translationLanguages ?? []; + const userLang = localizationProvider.lang; + const userLangSupported = translationLanguages.find( + (language) => language.languageCode === userLang, + ); + const asrLang = + captionTracks.find((captionTrack) => captionTrack?.kind === "asr") + ?.languageCode ?? "en"; + captionTracks = captionTracks.reduce((result, captionTrack) => { + if (!("languageCode" in captionTrack)) { + return result; + } - container.append(backdrop, dialog); - dialog.append(contentWrapper); - contentWrapper.append(headerContainer, bodyContainer, footerContainer); - headerContainer.append(titleContainer, closeButton); - titleContainer.append(title); + const language = captionTrack.languageCode + ? normalizeLang(captionTrack.languageCode) + : undefined; + const url = captionTrack?.url || captionTrack?.baseUrl; + if (!language || !url) { + return result; + } - return { - container, - backdrop, - dialog, - contentWrapper, - headerContainer, - bodyContainer, - footerContainer, - titleContainer, - closeButton, + const captionUrl = `${ + url.startsWith("http") ? url : `${window.location.origin}/${url}` + }&fmt=json3`; + result.push({ + source: "youtube", + language, + isAutoGenerated: captionTrack?.kind === "asr", + url: captionUrl, + }); + + if ( + userLangSupported && + captionTrack.isTranslatable && + captionTrack.languageCode === asrLang && + userLang !== language + ) { + // add translated youtube subtitles (if it possible) + result.push({ + source: "youtube", + language: userLang, + isAutoGenerated: captionTrack?.kind === "asr", + translatedFromLanguage: language, + url: `${captionUrl}&tlang=${userLang}`, + }); + } + + return result; + }, []); + debug.log("youtube subtitles:", captionTracks); + return captionTracks; +} + +// Get the video data from the player +async function youtubeUtils_getVideoData() { + const player = getPlayer(); + const response = getPlayerResponse(); // null in /embed + const data = getPlayerData(); + const { title: localizedTitle } = data ?? {}; + const { + shortDescription: description, + isLive, + title, + } = response?.videoDetails ?? {}; + let detectedLanguage = title + ? await getLanguage(player, response, title, description) + : "en"; + detectedLanguage = availableLangs.includes(detectedLanguage) + ? detectedLanguage + : "en"; + const videoData = { + isLive: !!isLive, title, + localizedTitle, + description, + detectedLanguage, }; + debug.log("youtube video data:", videoData); + console.log("[VOT] Detected language: ", videoData.detectedLanguage); + return videoData; } -/** - * Create VOTButton - * - * @param {string|HTMLElement} label - label content - * @return {{ - * container: HTMLElement, - * translateButton: HTMLElement, - * separator: HTMLElement, - * pipButton: HTMLElement, - * separator2: HTMLElement, - * menuButton: HTMLElement, - * label: HTMLSpanElement, - * }} VOTButton elements - */ -function createVOTButton(labelHtml) { - const container = document.createElement("vot-block"); - container.classList.add("vot-segmented-button"); +/* harmony default export */ const youtubeUtils = ({ + isMobile, + getPlayer, + getPlayerResponse, + getPlayerData, + getVideoVolume, + getSubtitles, + getVideoData: youtubeUtils_getVideoData, + setVideoVolume, + videoSeek, + isMuted, + isMusic, +}); - const translateButton = document.createElement("vot-block"); - translateButton.classList.add("vot-segment"); - translateButton.classList.add("vot-translate-button"); - Q( - Oe` - - - - `, - translateButton, +;// ./src/subtitles.js + + + + + + +function formatYandexSubtitlesTokens(line) { + const lineEndMs = line.startMs + line.durationMs; + return line.tokens.reduce((result, token, index) => { + const nextToken = line.tokens[index + 1]; + let lastToken; + if (result.length > 0) { + lastToken = result[result.length - 1]; + } + const alignRangeEnd = lastToken?.alignRange?.end ?? 0; + const newAlignRangeEnd = alignRangeEnd + token.text.length; + token.alignRange = { + start: alignRangeEnd, + end: newAlignRangeEnd, + }; + result.push(token); + if (nextToken) { + const endMs = token.startMs + token.durationMs; + const durationMs = nextToken.startMs + ? nextToken.startMs - endMs + : lineEndMs - endMs; + result.push({ + text: " ", + startMs: endMs, + durationMs, + alignRange: { + start: newAlignRangeEnd, + end: newAlignRangeEnd + 1, + }, + }); + } + return result; + }, []); +} + +function createSubtitlesTokens(line, previousLineLastToken) { + const tokens = line.text.split(/([\n \t])/).reduce((result, tokenText) => { + if (tokenText.length) { + const lastToken = result[result.length - 1] ?? previousLineLastToken; + const alignRangeStart = lastToken?.alignRange?.end ?? 0; + const alignRangeEnd = alignRangeStart + tokenText.length; + result.push({ + text: tokenText, + alignRange: { + start: alignRangeStart, + end: alignRangeEnd, + }, + }); + } + return result; + }, []); + const tokenDurationMs = Math.floor(line.durationMs / tokens.length); + const lineEndMs = line.startMs + line.durationMs; + return tokens.map((token, index) => { + const isLastToken = index === tokens.length - 1; + const startMs = line.startMs + tokenDurationMs * index; + const durationMs = isLastToken ? lineEndMs - startMs : tokenDurationMs; + return { + ...token, + startMs, + durationMs, + }; + }); +} + +function getSubtitlesTokens(subtitles, subtitlesObject) { + const result = []; + let lastToken; + const { source, isAutoGenerated } = subtitlesObject; + for (let i = 0; i < subtitles.subtitles.length; i++) { + const line = subtitles.subtitles[i]; + const hasTokens = line?.tokens?.length; + + let tokens = + hasTokens && + (source === "yandex" || (source === "youtube" && isAutoGenerated)) + ? formatYandexSubtitlesTokens(line) + : createSubtitlesTokens(line, lastToken); + lastToken = tokens[tokens.length - 1]; + result.push({ + ...line, + tokens, + }); + } + subtitles.containsTokens = true; + return result; +} + +function formatYoutubeSubtitles(subtitles, isAsr = false) { + const result = { + containsTokens: isAsr, + subtitles: [], + }; + if (typeof subtitles !== "object" || !Array.isArray(subtitles.events)) { + console.error("[VOT] Failed to format youtube subtitles", subtitles); + return result; + } + + for (let i = 0; i < subtitles.events.length; i++) { + const subtitle = subtitles.events[i]; + if (!subtitle.segs) continue; + + let durationMs = subtitle.dDurationMs; + if ( + subtitles.events[i + 1] && + subtitle.tStartMs + subtitle.dDurationMs > + subtitles.events[i + 1].tStartMs + ) { + durationMs = subtitles.events[i + 1].tStartMs - subtitle.tStartMs; + } + + const tokens = []; + let lastSegDuration = durationMs; + for (let j = 0; j < subtitle.segs.length; j++) { + const seg = subtitle.segs[j]; + const text = seg.utf8.trim(); + if (text === "\n") { + continue; + } + + const offset = seg.tOffsetMs ?? 0; + let segDuration = durationMs; + const nextSeg = subtitle.segs[j + 1]; + if (nextSeg?.tOffsetMs) { + segDuration = nextSeg.tOffsetMs - offset; + lastSegDuration -= segDuration; + } + + tokens.push({ + text, + startMs: subtitle.tStartMs + offset, + durationMs: nextSeg ? segDuration : lastSegDuration, + }); + } + + const text = tokens.map((e) => e.text).join(" "); + if (text) { + result.subtitles.push({ + text, + startMs: subtitle.tStartMs, + durationMs, + ...(isAsr ? { tokens } : {}), + speakerId: "0", + }); + } + } + return result; +} + +async function fetchSubtitles(subtitlesObject) { + const { source, isAutoGenerated, format, url } = subtitlesObject; + const fetchPromise = (async () => { + try { + const response = await GM_fetch(url, { timeout: 5000 }); + if (["vtt", "srt"].includes(format)) { + const plain = await response.text(); + return convertSubs(plain, "json"); + } + return await response.json(); + } catch (error) { + console.error("[VOT] Failed to fetch subtitles.", error); + return { + containsTokens: false, + subtitles: [], + }; + } + })(); + + let subtitles = await fetchPromise; + if (source === "youtube") { + subtitles = formatYoutubeSubtitles(subtitles, isAutoGenerated); + } + + subtitles.subtitles = getSubtitlesTokens(subtitles, subtitlesObject); + console.log("[VOT] subtitles:", subtitles); + return subtitles; +} + +async function subtitles_getSubtitles(client, videoData) { + const { + host, + url, + detectedLanguage: requestLang, + videoId, + duration, + subtitles, + } = videoData; + const extraSubtitles = + host === "youtube" ? youtubeUtils.getSubtitles() : subtitles ?? []; + + const timeoutPromise = new Promise((_, reject) => + setTimeout(() => reject(new Error("Timeout")), 5000), ); - const separator = document.createElement("vot-block"); - separator.classList.add("vot-separator"); + try { + const res = await Promise.race([ + client.getSubtitles({ + videoData: { host, url, videoId, duration }, + requestLang, + }), + timeoutPromise, + ]); + + console.log("[VOT] Subtitles response: ", res); + + if (res.waiting) { + console.error("[VOT] Failed to get yandex subtitles"); + } + + // Обработка субтитров + let subtitles = res.subtitles ?? []; + subtitles = subtitles.reduce((result, yaSubtitlesObject) => { + if ( + yaSubtitlesObject.language && + !result.find( + (e) => + e.source === "yandex" && + e.language === yaSubtitlesObject.language && + !e.translatedFromLanguage, + ) + ) { + result.push({ + source: "yandex", + language: yaSubtitlesObject.language, + url: yaSubtitlesObject.url, + }); + } + if (yaSubtitlesObject.translatedLanguage) { + result.push({ + source: "yandex", + language: yaSubtitlesObject.translatedLanguage, + translatedFromLanguage: yaSubtitlesObject.language, + url: yaSubtitlesObject.translatedUrl, + }); + } + return result; + }, []); + + return [...subtitles, ...extraSubtitles].sort((a, b) => { + if (a.source !== b.source) return a.source === "yandex" ? -1 : 1; + if ( + a.language !== b.language && + (a.language === lang || b.language === lang) + ) + return a.language === lang ? -1 : 1; + if (a.source === "yandex") { + // sort by translation + if (a.translatedFromLanguage !== b.translatedFromLanguage) { + // sort by translatedFromLanguage + if (!a.translatedFromLanguage || !b.translatedFromLanguage) { + // sort by isTranslated + if (a.language === b.language) + return a.translatedFromLanguage ? 1 : -1; + return !a.translatedFromLanguage ? 1 : -1; + } + return a.translatedFromLanguage === requestLang ? -1 : 1; + } + // sort non translated by language + if (!a.translatedFromLanguage) + return a.language === requestLang ? -1 : 1; + } + // sort by isAutoGenerated + if (a.source !== "yandex" && a.isAutoGenerated !== b.isAutoGenerated) + return a.isAutoGenerated ? 1 : -1; + return 0; + }); + } catch (error) { + if (error.message === "Timeout") { + console.error("[VOT] Failed to get yandex subtitles. Reason: timeout"); + } else { + console.error("[VOT] Error in getSubtitles function", error); + } + // на сайтах, где нет сабов всегда красит кнопку + throw error; + } +} + +class SubtitlesWidget { + constructor(video, container, site) { + this.video = video; + this.container = + site.host === "youtube" && site.additionalData !== "mobile" + ? container.parentElement + : container; + this.site = site; + + this.subtitlesContainer = this.createSubtitlesContainer(); + this.position = { left: 25, top: 75 }; + this.dragging = { active: false, offset: { x: 0, y: 0 } }; + + this.subtitles = null; + this.lastContent = null; + this.highlightWords = false; + this.fontSize = 20; + this.opacity = 0.2; + this.maxLength = 300; + this.maxLengthRegexp = /.{1,300}(?:\s|$)/g; - const pipButton = document.createElement("vot-block"); - pipButton.classList.add("vot-segment-only-icon"); - Q( - Oe` - - `, - pipButton, - ); + this.bindEvents(); + this.updateContainerRect(); + } - const separator2 = document.createElement("vot-block"); - separator2.classList.add("vot-separator"); + createSubtitlesContainer() { + const container = document.createElement("vot-block"); + container.classList.add("vot-subtitles-widget"); + this.container.appendChild(container); + return container; + } - const menuButton = document.createElement("vot-block"); - menuButton.classList.add("vot-segment-only-icon"); - Q( - Oe` - - `, - menuButton, - ); + bindEvents() { + this.onMouseDownBound = (e) => this.onMouseDown(e); + this.onMouseUpBound = () => this.onMouseUp(); + this.onMouseMoveBound = (e) => this.onMouseMove(e); + this.onTimeUpdateBound = this.debounce(() => this.update(), 100); - const label = document.createElement("span"); - label.classList.add("vot-segment-label"); - label.append(labelHtml); + document.addEventListener("mousedown", this.onMouseDownBound); + document.addEventListener("mouseup", this.onMouseUpBound); + document.addEventListener("mousemove", this.onMouseMoveBound); + this.video?.addEventListener("timeupdate", this.onTimeUpdateBound); - container.append( - translateButton, - separator, - pipButton, - separator2, - menuButton, - ); - translateButton.append(label); + this.resizeObserver = new ResizeObserver(() => this.onResize()); + this.resizeObserver.observe(this.container); + } - return { - container, - translateButton, - separator, - pipButton, - separator2, - menuButton, - label, - }; -} + onMouseDown(e) { + if (this.subtitlesContainer.contains(e.target)) { + const rect = this.subtitlesContainer.getBoundingClientRect(); + const containerRect = this.container.getBoundingClientRect(); + this.dragging = { + active: true, + offset: { + x: e.clientX - rect.left, + y: e.clientY - rect.top, + }, + containerOffset: { + x: containerRect.left, + y: containerRect.top, + }, + }; + } + } -/** - * Create VOTMenu - * - * @param {string|HTMLElement} html - title content - * @return {{ - * container: HTMLElement, - * contentWrapper: HTMLElement, - * headerContainer: HTMLElement, - * bodyContainer: HTMLElement, - * footerContainer: HTMLElement, - * titleContainer: HTMLElement, - * title: HTMLSpanElement, - * }} VOTMenu elements - */ -function createVOTMenu(html) { - const container = document.createElement("vot-block"); - container.classList.add("vot-menu"); - container.hidden = true; + onMouseUp() { + this.dragging.active = false; + } - const contentWrapper = document.createElement("vot-block"); - contentWrapper.classList.add("vot-menu-content-wrapper"); + onMouseMove(e) { + if (this.dragging.active) { + e.preventDefault(); + const { width, height } = this.container.getBoundingClientRect(); + const containerOffset = this.dragging.containerOffset; + this.position = { + left: + ((e.clientX - this.dragging.offset.x - containerOffset.x) / width) * + 100, + top: + ((e.clientY - this.dragging.offset.y - containerOffset.y) / height) * + 100, + }; + this.applySubtitlePosition(); + } + } - const headerContainer = document.createElement("vot-block"); - headerContainer.classList.add("vot-menu-header-container"); + onResize() { + this.updateContainerRect(); + } - const bodyContainer = document.createElement("vot-block"); - bodyContainer.classList.add("vot-menu-body-container"); + updateContainerRect() { + this.containerRect = this.container.getBoundingClientRect(); + this.applySubtitlePosition(); + } - const footerContainer = document.createElement("vot-block"); - footerContainer.classList.add("vot-menu-footer-container"); + applySubtitlePosition() { + const { width, height } = this.containerRect; + const { offsetWidth, offsetHeight } = this.subtitlesContainer; - const titleContainer = document.createElement("vot-block"); - titleContainer.classList.add("vot-menu-title-container"); + const maxLeft = ((width - offsetWidth) / width) * 100; + const maxTop = ((height - offsetHeight) / height) * 100; - const title = document.createElement("vot-block"); - title.classList.add("vot-menu-title"); - title.append(html); + this.position.left = Math.max(0, Math.min(this.position.left, maxLeft)); + this.position.top = Math.max(0, Math.min(this.position.top, maxTop)); - container.append(contentWrapper); - contentWrapper.append(headerContainer, bodyContainer, footerContainer); - headerContainer.append(titleContainer); - titleContainer.append(title); + this.subtitlesContainer.style.left = `${this.position.left}%`; + this.subtitlesContainer.style.top = `${this.position.top}%`; + } - return { - container, - contentWrapper, - headerContainer, - bodyContainer, - footerContainer, - titleContainer, - title, - }; -} + setContent(subtitles) { + if (subtitles && this.video) { + this.subtitles = subtitles; + this.update(); + } else { + this.subtitles = null; + Q(null, this.subtitlesContainer); + } + } -/** - * Create VOTSelectLabel - * - * @param {string} text - label text - * @return {HTMLSpanElement} VOTSelectLabel element - */ -function createVOTSelectLabel(text) { - const label = document.createElement("span"); - label.classList.add("vot-select-label"); - label.textContent = text; - return label; -} + setMaxLength(len) { + if (typeof len === "number" && len) { + this.maxLength = len; + this.maxLengthRegexp = new RegExp(`.{1,${len}}(?:\\s|$)`, "g"); + this.update(); + } + } -/** - * Create VOTSelect - * - * @param {string} selectTitle - select title - * @param {string} dialogTitle - dialog title - * @param {{label: string, value: string, selected: boolean}[]} items - items to select - * @param {{onSelectCb: function, labelElement: string}} options - items to select - * @return {{ - * container: HTMLElement, - * title: HTMLSpanElement, - * arrowIcon: HTMLElement, - * labelElement: HTMLElement, - * setTitle: (newTitle: string) => void, - * setSelected: (val: string) => void, - * updateItems: (newItems: {label: string, value: string, selected: boolean}[]) => void, - * }} VOTSelect elements - */ -function createVOTSelect(selectTitle, dialogTitle, items, options = {}) { - const { onSelectCb = function () {}, labelElement = "" } = options; - let selectedItems = []; + setHighlightWords(value) { + this.highlightWords = Boolean(value); + this.update(); + } - const container = document.createElement("vot-block"); - container.classList.add("vot-select"); + setFontSize(size) { + this.fontSize = size; + const subtitlesEl = + this.subtitlesContainer?.querySelector(".vot-subtitles"); + if (subtitlesEl) { + subtitlesEl.style.fontSize = `${this.fontSize}px`; + } + } - if (labelElement) { - container.append(labelElement); + /** + * Set subtitles opacity by percentage where 100 - full transparent, 0 - not transparent + * + * @param {number} rate - 0-100 percent of opacity + */ + setOpacity(rate) { + this.opacity = ((100 - +rate) / 100).toFixed(2); + const subtitlesEl = + this.subtitlesContainer?.querySelector(".vot-subtitles"); + if (subtitlesEl) { + subtitlesEl.style.setProperty("--vot-subtitles-opacity", this.opacity); + } } - const outer = document.createElement("vot-block"); - outer.classList.add("vot-select-outer"); + update() { + if (!this.video || !this.subtitles) return; + + const time = this.video.currentTime * 1000; + const line = this.subtitles.subtitles?.findLast( + (e) => e.startMs < time && time < e.startMs + e.durationMs, + ); - const title = document.createElement("span"); - title.classList.add("vot-select-title"); - title.textContent = selectTitle; + if (!line) { + Q(null, this.subtitlesContainer); + return; + } - if (selectTitle === undefined) { - title.textContent = items.find((i) => i.selected === true)?.label; + let tokens = this.processTokens(line.tokens); + const content = this.renderTokens(tokens, time); + const stringContent = JSON.stringify(content); + if (stringContent !== this.lastContent) { + this.lastContent = stringContent; + Q( + ke`${content}`, + this.subtitlesContainer, + ); + } } - const arrowIcon = document.createElement("vot-block"); - arrowIcon.classList.add("vot-select-arrow-icon"); - Q(arrowIconRaw, arrowIcon); + processTokens(tokens) { + if (tokens.at(-1).alignRange.end <= this.maxLength) return tokens; - outer.append(title, arrowIcon); - outer.onclick = () => { - const votSelectDialog = createDialog(dialogTitle); - votSelectDialog.container.classList.add("vot-dialog-temp"); - votSelectDialog.container.hidden = false; - document.documentElement.appendChild(votSelectDialog.container); + let chunks = []; + let chunkTokens = []; + let length = 0; - const contentList = document.createElement("vot-block"); - contentList.classList.add("vot-select-content-list"); + for (const token of tokens) { + length += token.text.length; + chunkTokens.push(token); - for (const item of items) { - const contentItem = document.createElement("vot-block"); - contentItem.classList.add("vot-select-content-item"); - contentItem.textContent = item.label; - contentItem.dataset.votSelected = item.selected; - contentItem.dataset.votValue = item.value; - if (item.disabled) { - contentItem.inert = true; + if (length > this.maxLength) { + chunks.push(this.trimChunk(chunkTokens)); + chunkTokens = []; + length = 0; } + } - contentItem.onclick = async (e) => { - if (e.target.inert) return; - - // removing the selected value for updating - const contentItems = contentList.childNodes; - for (let ci of contentItems) { - ci.dataset.votSelected = false; - } - // fixed selection after closing the modal and opening again - for (let i of items) { - i.selected = i.value === item.value; - } + if (chunkTokens.length) chunks.push(this.trimChunk(chunkTokens)); - contentItem.dataset.votSelected = true; - title.textContent = item.label; + const time = this.video.currentTime * 1000; + return ( + chunks.find( + (chunk) => + chunk[0].startMs < time && + time < chunk.at(-1).startMs + chunk.at(-1).durationMs, + ) || chunks[0] + ); + } - // !!! use e.target.dataset.votValue instead of e.target.value !!! - await onSelectCb(e); - }; - contentList.appendChild(contentItem); - } + trimChunk(tokens) { + if (tokens[0].text === " ") tokens.shift(); + if (tokens.at(-1).text === " ") tokens.pop(); + return tokens; + } - // search logic - const votSearchLangTextfield = createTextfield( - localizationProvider.get("searchField"), - ); + renderTokens(tokens, time) { + return tokens.map((token) => { + const passed = + this.highlightWords && + (time > token.startMs + token.durationMs / 2 || + (time > token.startMs - 100 && + token.startMs + token.durationMs / 2 - time < 275)); + return ke`${token.text.replace("\\n", "
")}
`; + }); + } - votSearchLangTextfield.input.oninput = (e) => { - const searchText = e.target.value.toLowerCase(); - // check if there are lovercase characters in the string. used for smarter search - for (let i = 0; i < selectedItems.length; i++) { - const ci = selectedItems[i]; - ci.hidden = !ci.textContent.toLowerCase().includes(searchText); - } + debounce(func, wait) { + let timeout; + return (...args) => { + clearTimeout(timeout); + timeout = setTimeout(() => func.apply(this, args), wait); }; + } - votSelectDialog.bodyContainer.append( - votSearchLangTextfield.container, - contentList, - ); - selectedItems = contentList.childNodes; + release() { + document.removeEventListener("mousedown", this.onMouseDownBound); + document.removeEventListener("mouseup", this.onMouseUpBound); + document.removeEventListener("mousemove", this.onMouseMoveBound); + this.video?.removeEventListener("timeupdate", this.onTimeUpdateBound); + this.resizeObserver.disconnect(); + this.subtitlesContainer.remove(); + } +} - // remove the modal so that they do not accumulate - votSelectDialog.backdrop.onclick = votSelectDialog.closeButton.onclick = - () => { - votSelectDialog.container.remove(); - selectedItems = []; - }; - }; +// EXTERNAL MODULE: ./src/styles/main.scss +var main = __webpack_require__("./src/styles/main.scss"); +;// ./src/ui.js - container.append(outer); - const setTitle = (newTitle) => { - title.textContent = newTitle; - }; - const setSelected = (val) => { - const selectedItemsArray = Array.from(selectedItems).filter( - (ci) => !ci.inert, - ); - for (let i = 0; i < selectedItemsArray.length; i++) { - const ci = selectedItemsArray[i]; - ci.dataset.votSelected = ci.dataset.votValue === val; - } - for (let i = 0; i < items.length; i++) { - const currentItem = items[i]; - currentItem.selected = String(currentItem.value) === val; - } - }; - const updateItems = (newItems) => { - items = newItems; - }; - return { - container, - title, - arrowIcon, - labelElement, - setTitle, - setSelected, - updateItems, - }; -} +const undefinedPhrase = "#UNDEFINED"; +const arrowIconRaw = Oe` + +`; +const animeOpts = { + easing: "linear", + delay: function (el, i) { + return i * 200; + }, +}; -function createVOTLanguageSelect(options) { - const { - fromTitle = undefinedPhrase, - fromDialogTitle = undefinedPhrase, - fromItems = [], - fromOnSelectCB = null, - toTitle = undefinedPhrase, - toDialogTitle = undefinedPhrase, - toItems = [], - toOnSelectCB = null, - } = options; +/** + * Create header element + * + * @param {HTMLElement|string} html - header content + * @param {1|2|3|4|5|6} level - header level + * @return {HTMLElement} HTML header element + */ +function createHeader(html, level = 4) { + const header = document.createElement("vot-block"); + header.classList.add("vot-header", `vot-header-level-${level}`); + header.append(html); - const container = document.createElement("vot-block"); - container.classList.add("vot-lang-select"); + return header; +} - const fromSelect = createVOTSelect(fromTitle, fromDialogTitle, fromItems, { - onSelectCb: fromOnSelectCB, - }); +/** + * Create information element + * + * @param {HTMLElement|string} labelHtml - label content + * @param {HTMLElement|string} valueHtml - value content + * @return {{ + * container: HTMLElement, + * header: HTMLElement, + * value: HTMLElement + * }} information elements + */ +function createInformation(labelHtml, valueHtml) { + const container = document.createElement("vot-block"); + container.classList.add("vot-info"); - const icon = document.createElement("vot-block"); - icon.classList.add("vot-lang-select-icon"); - Q( - Oe` - - `, - icon, - ); + const header = document.createElement("vot-block"); + Q(labelHtml, header); - const toSelect = createVOTSelect(toTitle, toDialogTitle, toItems, { - onSelectCb: toOnSelectCB, - }); + const value = document.createElement("vot-block"); + Q(valueHtml, value); - container.append(fromSelect.container, icon, toSelect.container); + container.append(header, value); return { container, - fromSelect, - icon, - toSelect, + header, + value, }; } -function createDetails(titleHtml) { - const container = document.createElement("vot-block"); - container.classList.add("vot-details"); - - const header = document.createElement("vot-block"); - header.append(titleHtml); +/** + * Create button + * + * @param {HTMLElement|string} html - button content + * @return {HTMLElement} HTML button element + */ +function createButton(html) { + const button = document.createElement("vot-block"); + button.classList.add("vot-button"); + button.append(html); - const arrowIcon = document.createElement("vot-block"); - arrowIcon.classList.add("vot-details-arrow-icon"); - Q(arrowIconRaw, arrowIcon); + return button; +} - container.append(header, arrowIcon); +/** + * Create text button + * + * @param {HTMLElement|string} html - button content + * @return {HTMLElement} HTML text button element + */ +function createTextButton(html) { + const button = document.createElement("vot-block"); + button.classList.add("vot-text-button"); + button.append(html); - return { - container, - header, - arrowIcon, - }; + return button; } /** + * Create outlined button * - * @export - * @param {SVGElement} votLoader - * @param {string} [primaryColor="139, 180, 245"] - * @return {Function} Update animation function + * @param {HTMLElement|string} html - button content + * @return {HTMLElement} HTML outlined button element */ -function animateLoader(votLoader, primaryColor = "139, 180, 245") { - const votLoaderHelper = votLoader.querySelector(".vot-loader-helper"); - const votLoaderMain = votLoader.querySelector(".vot-loader-main"); - anime - .timeline({ - ...animeOpts, - targets: [votLoaderHelper, votLoaderMain], - duration: 250, - }) - .add({ - "fill-opacity": 0, - "stroke-width": 2, - d: "M 12 1.5 C 17.799 1.5 22.5 6.201 22.5 12 C 22.5 17.799 17.799 22.5 12 22.5 C 6.201 22.5 1.5 17.799 1.5 12 C 1.5 6.201 6.201 1.5 12 1.5 Z", - duration: 0, - }) - .add( - { - targets: votLoaderHelper, - stroke: `rgb(${primaryColor})`, - // make empty by default - "stroke-opacity": 0, - duration: 0, - }, - 0, - ) - .add( - { - targets: votLoaderMain, - stroke: "#888888", - "stroke-opacity": 0.25, - }, - 0, - ); - const animation = anime - .timeline({ - targets: votLoaderHelper, - easing: "easeInOutSine", - duration: 1000, - autoplay: false, - }) - .add( - { - // prevent full fill on 0% - strokeOpacity: 1, - duration: 0, - }, - 0, - ) - .add( - { - strokeDashoffset: [anime.setDashoffset, 0], - }, - 0, - ); +function createOutlinedButton(html) { + const button = document.createElement("vot-block"); + button.classList.add("vot-outlined-button"); + button.append(html); - return (percentage) => { - animation.seek(animation.duration * (percentage / 100)); - }; + return button; } -function afterAnimateLoader(votLoader, primaryColor = "139, 180, 245") { - const votLoaderHelper = votLoader.querySelector(".vot-loader-helper"); - const votLoaderMain = votLoader.querySelector(".vot-loader-main"); - anime - .timeline({ - ...animeOpts, - targets: votLoaderMain, - duration: 600, - }) - .add({ - d: "M 9.0596 14.8571 L 9.7667 15.5642 L 10.4738 14.8571 L 17.0071 8.3238 C 17.0457 8.2852 17.0937 8.25 17.2333 8.25 C 17.373 8.25 17.421 8.2852 17.4596 8.3238 C 17.4981 8.3624 17.5333 8.4104 17.5333 8.55 C 17.5333 8.6896 17.4981 8.7376 17.4596 8.7762 L 9.9929 16.2429 C 9.9011 16.3346 9.8397 16.35 9.7667 16.35 C 9.6937 16.35 9.6322 16.3346 9.5404 16.2429 L 6.0738 12.7762 C 6.0352 12.7376 6 12.6897 6 12.55 C 6 12.4103 6.0352 12.3624 6.0738 12.3238 C 6.1124 12.2852 6.1603 12.25 6.3 12.25 C 6.4397 12.25 6.4876 12.2852 6.5262 12.3238 L 9.0596 14.8571 Z", - duration: 0, - }) - .add({ - strokeDashoffset: [anime.setDashoffset, 0], - stroke: `rgb(${primaryColor})`, - "stroke-opacity": 1, - }); +/** + * Create icon button + * + * @param {TemplateResult} templateHtml - icon svg lit template + * @return {HTMLElement} HTML icon button element + */ +function createIconButton(templateHtml) { + const button = document.createElement("vot-block"); + button.classList.add("vot-icon-button"); + Q(templateHtml, button); - setTimeout(() => { - anime - .timeline({ - ...animeOpts, - targets: votLoaderMain, - duration: 600, - }) - .add({ - d: "M12 15.575C11.8667 15.575 11.7417 15.5542 11.625 15.5125C11.5083 15.4708 11.4 15.4 11.3 15.3L7.7 11.7C7.5 11.5 7.40417 11.2667 7.4125 11C7.42083 10.7333 7.51667 10.5 7.7 10.3C7.9 10.1 8.1375 9.99583 8.4125 9.9875C8.6875 9.97917 8.925 10.075 9.125 10.275L11 12.15V5C11 4.71667 11.0958 4.47917 11.2875 4.2875C11.4792 4.09583 11.7167 4 12 4C12.2833 4 12.5208 4.09583 12.7125 4.2875C12.9042 4.47917 13 4.71667 13 5V12.15L14.875 10.275C15.075 10.075 15.3125 9.97917 15.5875 9.9875C15.8625 9.99583 16.1 10.1 16.3 10.3C16.4833 10.5 16.5792 10.7333 16.5875 11C16.5958 11.2667 16.5 11.5 16.3 11.7L12.7 15.3C12.6 15.4 12.4917 15.4708 12.375 15.5125C12.2583 15.5542 12.1333 15.575 12 15.575ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V16C4 15.7167 4.09583 15.4792 4.2875 15.2875C4.47917 15.0958 4.71667 15 5 15C5.28333 15 5.52083 15.0958 5.7125 15.2875C5.90417 15.4792 6 15.7167 6 16V18H18V16C18 15.7167 18.0958 15.4792 18.2875 15.2875C18.4792 15.0958 18.7167 15 19 15C19.2833 15 19.5208 15.0958 19.7125 15.2875C19.9042 15.4792 20 15.7167 20 16V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z", - duration: 100, - }) - .add( - { - targets: votLoaderHelper, - d: "", - duration: 200, - }, - 0, - ) - .add({ - targets: votLoaderMain, - "stroke-width": "0", - stroke: `rgba(${primaryColor}), 0)`, - "fill-opacity": "1", - "stroke-dasharray": "0", - "stroke-dashoffset": "0", - duration: 0, - }); - }, 2000); + return button; } -/* harmony default export */ const ui = ({ - createHeader, - createInformation, - createButton, - createTextButton, - createOutlinedButton, - createIconButton, - createCheckbox, - createSlider, - createTextfield, - createDialog, - createVOTButton, - createVOTMenu, - createVOTSelectLabel, - createVOTSelect, - createVOTLanguageSelect, - updateSlider, - animateLoader, - afterAnimateLoader, - createDetails, -}); +/** + * Create checkbox + * + * @param {string|HTMLElement} html - label content + * @param {boolean} value - checkbox state + * @return {{ + * container: HTMLElement, + * input: HTMLInputElement, + * label: HTMLSpanElement + * }} checkbox elements + */ +function createCheckbox(html, value = false) { + const container = document.createElement("label"); + container.classList.add("vot-checkbox"); -;// ./src/utils/volume.js -// element - audio / video element -function syncVolume(element, sliderVolume, otherSliderVolume, tempVolume) { - let finalValue = sliderVolume; - if (sliderVolume > tempVolume) { - // sliderVolume = 100 - // tempVolume = 69 - // volume = 15 - // 100 - 69 = 31 - // 15 + 31 = 46 - final video volume - finalValue = otherSliderVolume + (sliderVolume - tempVolume); - finalValue = finalValue > 100 ? 100 : Math.max(finalValue, 0); + const input = document.createElement("input"); + input.type = "checkbox"; + input.checked = Boolean(value); - element.volume = finalValue / 100; - } else if (sliderVolume < tempVolume) { - // sliderVolume = 69 - // tempVolume = 100 - // volume = 15 - // 100 - 69 = 31 - // 15 - 31 = 0 - final video volume - finalValue = otherSliderVolume - (tempVolume - sliderVolume); - finalValue = finalValue > 100 ? 100 : Math.max(finalValue, 0); + const label = document.createElement("span"); + label.append(html); - element.volume = finalValue / 100; - } + container.append(input, label); - return finalValue; + return { container, input, label }; +} + +/** + * Update slider value + * + * @param {HTMLInputElement} input - slider input element + */ +function updateSlider(input) { + const value = +input.value; + const min = +input.min; + const max = +input.max; + const progress = (value - min) / (max - min); + input.parentElement.setAttribute("style", `--vot-progress: ${progress}`); } +/** + * Create slider + * + * @param {string|HTMLElement} html - label content + * @param {number} value - default value + * @param {number} min - min value + * @param {number} max - max value + * @return {{ + * container: HTMLElement, + * input: HTMLInputElement, + * label: HTMLSpanElement + * }} slider elements + */ +function createSlider(labelHtml, value = 50, min = 0, max = 100) { + const container = document.createElement("vot-block"); + container.classList.add("vot-slider"); + const input = document.createElement("input"); + input.type = "range"; + input.min = min; + input.max = max; + input.value = value; -;// ./src/utils/translateApis.js - - - - -const YandexTranslateAPI = { - async translate(text, lang) { - // Limit: 10k symbols - // - // Lang examples: - // en-ru, uk-ru, ru-en... - // ru, en (instead of auto-ru, auto-en) - - try { - const response = await GM_fetch( - `${translateUrls.yandex}?${new URLSearchParams({ - text, - lang, - })}`, - { timeout: 3000 }, - ); + const label = document.createElement("span"); + Q(labelHtml, label); - if (response instanceof Error) { - throw response; - } + container.append(input, label); - const content = await response.json(); + input.addEventListener("input", (e) => updateSlider(e.target)); + updateSlider(input); - if (content.code !== 200) { - throw content.message; - } + return { + container, + input, + label, + }; +} - return content.text[0]; - } catch (error) { - console.error("Error translating text:", error); - return text; - } - }, +/** + * Create textfield + * + * @param {string|HTMLElement} html - label content + * @param {string} value - default value + * @param {string} placeholder - textfield placeholder + * @param {boolean} multiline - multiline textfield + * @return {{ + * container: HTMLElement, + * input: HTMLInputElement, + * label: HTMLSpanElement + * }} textfield elements + */ +function createTextfield( + html, + value = "", + placeholder = " ", + multiline = false, +) { + const container = document.createElement("vot-block"); + container.classList.add("vot-textfield"); - async detect(text) { - // Limit: 10k symbols - try { - const response = await GM_fetch( - `${detectUrls.yandex}?${new URLSearchParams({ - text, - })}`, - { timeout: 3000 }, - ); + const input = document.createElement(multiline ? "textarea" : "input"); + input.placeholder = placeholder; + input.value = value; + if (!html) { + input.classList.add("vot-show-placeholer"); + } - if (response instanceof Error) { - throw response; - } + const label = document.createElement("span"); + label.append(html); - const content = await response.json(); - if (content.code !== 200) { - throw content.message; - } + container.append(input, label); - return content.lang ?? "en"; - } catch (error) { - console.error("Error getting lang from text:", error); - return "en"; - } - }, -}; + return { + container, + input, + label, + }; +} -const RustServerAPI = { - async detect(text) { - try { - const response = await GM_fetch( - detectUrls.rustServer, - { - method: "POST", - body: text, - }, - { timeout: 3000 }, - ); +/** + * Create dialog + * + * @param {string|HTMLElement} html - title content + * @return {{ + * container: HTMLElement, + * backdrop: HTMLElement, + * dialog: HTMLElement, + * contentWrapper: HTMLElement, + * headerContainer: HTMLElement, + * bodyContainer: HTMLElement, + * footerContainer: HTMLElement, + * titleContainer: HTMLElement, + * closeButton: HTMLElement, + * title: HTMLElement, + * }} dialog elements + */ +function createDialog(html) { + const container = document.createElement("vot-block"); + container.classList.add("vot-dialog-container"); + container.hidden = true; - if (response instanceof Error) { - throw response; - } + const backdrop = document.createElement("vot-block"); + backdrop.classList.add("vot-dialog-backdrop"); - return await response.text(); - } catch (error) { - console.error("Error getting lang from text:", error); - return "en"; - } - }, -}; + const dialog = document.createElement("vot-block"); + dialog.classList.add("vot-dialog"); -const DeeplServerAPI = { - async translate(text, fromLang = "auto", toLang = "ru") { - try { - const response = await GM_fetch( - translateUrls.deepl, - { - method: "POST", - headers: { - "content-type": "application/x-www-form-urlencoded", - }, - body: new URLSearchParams({ - text, - source_lang: fromLang, - target_lang: toLang, - }), - }, - { timeout: 3000 }, - ); + const contentWrapper = document.createElement("vot-block"); + contentWrapper.classList.add("vot-dialog-content-wrapper"); - if (response instanceof Error) { - throw response; - } + const headerContainer = document.createElement("vot-block"); + headerContainer.classList.add("vot-dialog-header-container"); - const content = await response.json(); + const bodyContainer = document.createElement("vot-block"); + bodyContainer.classList.add("vot-dialog-body-container"); - if (content.code !== 200) { - throw content.message; - } + const footerContainer = document.createElement("vot-block"); + footerContainer.classList.add("vot-dialog-footer-container"); - return content.data; - } catch (error) { - console.error("Error translating text:", error); - return text; - } - }, -}; + const titleContainer = document.createElement("vot-block"); + titleContainer.classList.add("vot-dialog-title-container"); -async function translate(text, fromLang = "", toLang = "ru") { - const service = await votStorage.get( - "translationService", - defaultTranslationService, + const closeButton = createIconButton( + Oe` + + `, ); - switch (service) { - case "yandex": { - const langPair = fromLang && toLang ? `${fromLang}-${toLang}` : toLang; - return await YandexTranslateAPI.translate(text, langPair); - } - case "deepl": { - return await DeeplServerAPI.translate(text, fromLang, toLang); - } - default: - return text; - } -} + closeButton.classList.add("vot-dialog-close-button"); -async function detect(text) { - const service = await votStorage.get("detectService", defaultDetectService); - switch (service) { - case "yandex": - return await YandexTranslateAPI.detect(text); - case "rust-server": - return await RustServerAPI.detect(text); - default: - return "en"; - } -} + backdrop.onclick = closeButton.onclick = () => { + container.hidden = true; + }; + + const title = document.createElement("vot-block"); + title.classList.add("vot-dialog-title"); + title.append(html); -const translateServices = Object.keys(translateUrls); -const detectServices = Object.keys(detectUrls).map((k) => - k === "rustServer" ? "rust-server" : k, -); + container.append(backdrop, dialog); + dialog.append(contentWrapper); + contentWrapper.append(headerContainer, bodyContainer, footerContainer); + headerContainer.append(titleContainer, closeButton); + titleContainer.append(title); + return { + container, + backdrop, + dialog, + contentWrapper, + headerContainer, + bodyContainer, + footerContainer, + titleContainer, + closeButton, + title, + }; +} +/** + * Create VOTButton + * + * @param {string|HTMLElement} label - label content + * @return {{ + * container: HTMLElement, + * translateButton: HTMLElement, + * separator: HTMLElement, + * pipButton: HTMLElement, + * separator2: HTMLElement, + * menuButton: HTMLElement, + * label: HTMLSpanElement, + * }} VOTButton elements + */ +function createVOTButton(labelHtml) { + const container = document.createElement("vot-block"); + container.classList.add("vot-segmented-button"); -;// ./src/utils/youtubeUtils.js + const translateButton = document.createElement("vot-block"); + translateButton.classList.add("vot-segment"); + translateButton.classList.add("vot-translate-button"); + Q( + Oe` + + + + `, + translateButton, + ); + const separator = document.createElement("vot-block"); + separator.classList.add("vot-separator"); + const pipButton = document.createElement("vot-block"); + pipButton.classList.add("vot-segment-only-icon"); + Q( + Oe` + + `, + pipButton, + ); + const separator2 = document.createElement("vot-block"); + separator2.classList.add("vot-separator"); + const menuButton = document.createElement("vot-block"); + menuButton.classList.add("vot-segment-only-icon"); + Q( + Oe` + + `, + menuButton, + ); + const label = document.createElement("span"); + label.classList.add("vot-segment-label"); + label.append(labelHtml); + container.append( + translateButton, + separator, + pipButton, + separator2, + menuButton, + ); + translateButton.append(label); -// Get the language code from the response or the text -async function getLanguage(player, response, title, description) { - if ( - !window.location.hostname.includes("m.youtube.com") && - player?.getAudioTrack - ) { - // ! Experimental ! get lang from selected audio track if availabled - const audioTracks = player.getAudioTrack(); - const trackInfo = audioTracks?.getLanguageInfo(); // get selected track info (id === "und" if tracks are not available) - if (trackInfo?.id !== "und") { - return langTo6391(trackInfo.id.split(".")[0]); - } - } + return { + container, + translateButton, + separator, + pipButton, + separator2, + menuButton, + label, + }; +} - // TODO: If the audio tracks will work fine, transfer the receipt of captions to the audioTracks variable - // Check if there is an automatic caption track in the response - const captionTracks = - response?.captions?.playerCaptionsTracklistRenderer?.captionTracks; - if (captionTracks?.length) { - const autoCaption = captionTracks.find((caption) => caption.kind === "asr"); - if (autoCaption && autoCaption.languageCode) { - return langTo6391(autoCaption.languageCode); - } - } +/** + * Create VOTMenu + * + * @param {string|HTMLElement} html - title content + * @return {{ + * container: HTMLElement, + * contentWrapper: HTMLElement, + * headerContainer: HTMLElement, + * bodyContainer: HTMLElement, + * footerContainer: HTMLElement, + * titleContainer: HTMLElement, + * title: HTMLSpanElement, + * }} VOTMenu elements + */ +function createVOTMenu(html) { + const container = document.createElement("vot-block"); + container.classList.add("vot-menu"); + container.hidden = true; - // If there is no caption track, use detect to get the language code from the description + const contentWrapper = document.createElement("vot-block"); + contentWrapper.classList.add("vot-menu-content-wrapper"); - const text = cleanText(title, description); + const headerContainer = document.createElement("vot-block"); + headerContainer.classList.add("vot-menu-header-container"); - utils_debug.log(`Detecting language text: ${text}`); + const bodyContainer = document.createElement("vot-block"); + bodyContainer.classList.add("vot-menu-body-container"); - return detect(text); -} + const footerContainer = document.createElement("vot-block"); + footerContainer.classList.add("vot-menu-footer-container"); -function isMobile() { - return /^m\.youtube\.com$/.test(window.location.hostname); -} + const titleContainer = document.createElement("vot-block"); + titleContainer.classList.add("vot-menu-title-container"); -function getPlayer() { - if (window.location.pathname.startsWith("/shorts/") && !isMobile()) { - return document.querySelector("#shorts-player"); - } + const title = document.createElement("vot-block"); + title.classList.add("vot-menu-title"); + title.append(html); - return document.querySelector("#movie_player"); -} + container.append(contentWrapper); + contentWrapper.append(headerContainer, bodyContainer, footerContainer); + headerContainer.append(titleContainer); + titleContainer.append(title); -function getPlayerResponse() { - const player = getPlayer(); - if (player?.getPlayerResponse) - return player?.getPlayerResponse?.call() ?? null; - return player?.data?.playerResponse ?? null; + return { + container, + contentWrapper, + headerContainer, + bodyContainer, + footerContainer, + titleContainer, + title, + }; } -function getPlayerData() { - const player = getPlayer(); - if (player?.getVideoData) return player?.getVideoData?.call() ?? null; - return player?.data?.playerResponse?.videoDetails ?? null; +/** + * Create VOTSelectLabel + * + * @param {string} text - label text + * @return {HTMLSpanElement} VOTSelectLabel element + */ +function createVOTSelectLabel(text) { + const label = document.createElement("span"); + label.classList.add("vot-select-label"); + label.textContent = text; + return label; } -function getVideoVolume() { - const player = getPlayer(); - if (player?.getVolume) { - return player.getVolume.call() / 100; - } +/** + * Create VOTSelect + * + * @param {string} selectTitle - select title + * @param {string} dialogTitle - dialog title + * @param {{label: string, value: string, selected: boolean}[]} items - items to select + * @param {{onSelectCb: function, labelElement: string}} options - items to select + * @return {{ + * container: HTMLElement, + * title: HTMLSpanElement, + * arrowIcon: HTMLElement, + * labelElement: HTMLElement, + * setTitle: (newTitle: string) => void, + * setSelected: (val: string) => void, + * updateItems: (newItems: {label: string, value: string, selected: boolean}[]) => void, + * }} VOTSelect elements + */ +function createVOTSelect(selectTitle, dialogTitle, items, options = {}) { + const { onSelectCb = function () {}, labelElement = "" } = options; + let selectedItems = []; - return 1; -} + const container = document.createElement("vot-block"); + container.classList.add("vot-select"); -function setVideoVolume(volume) { - const player = getPlayer(); - if (player?.setVolume) { - player.setVolume(Math.round(volume * 100)); - return true; + if (labelElement) { + container.append(labelElement); } -} -function isMuted() { - const player = getPlayer(); - if (player?.isMuted) { - return player.isMuted.call(); + const outer = document.createElement("vot-block"); + outer.classList.add("vot-select-outer"); + + const title = document.createElement("span"); + title.classList.add("vot-select-title"); + title.textContent = selectTitle; + + if (selectTitle === undefined) { + title.textContent = items.find((i) => i.selected === true)?.label; } - return false; -} + const arrowIcon = document.createElement("vot-block"); + arrowIcon.classList.add("vot-select-arrow-icon"); + Q(arrowIconRaw, arrowIcon); -function videoSeek(video, time) { - // * TIME IN MS - utils_debug.log("videoSeek", time); - const preTime = - getPlayer()?.getProgressState()?.seekableEnd || video.currentTime; - const finalTime = preTime - time; // we always throw it to the end of the stream - time - video.currentTime = finalTime; -} + outer.append(title, arrowIcon); + outer.onclick = () => { + const votSelectDialog = createDialog(dialogTitle); + votSelectDialog.container.classList.add("vot-dialog-temp"); + votSelectDialog.container.hidden = false; + document.documentElement.appendChild(votSelectDialog.container); -function isMusic() { - // Нужно доработать логику - const channelName = getPlayerData().author, - titleStr = getPlayerData().title.toUpperCase(), - titleWordsList = titleStr.match(/\w+/g), - playerData = document.body.querySelector("ytd-watch-flexy")?.playerData; + const contentList = document.createElement("vot-block"); + contentList.classList.add("vot-select-content-list"); - return ( - [ - titleStr, - document.URL, - channelName, - playerData?.microformat?.playerMicroformatRenderer.category, - playerData?.title, - ].some((i) => i?.toUpperCase().includes("MUSIC")) || - document.body.querySelector( - "#upload-info #channel-name .badge-style-type-verified-artist", - ) || - (channelName && - /(VEVO|Topic|Records|RECORDS|Recordings|AMV)$/.test(channelName)) || - (channelName && - /(MUSIC|ROCK|SOUNDS|SONGS)/.test(channelName.toUpperCase())) || - (titleWordsList?.length && - [ - "🎵", - "♫", - "SONG", - "SONGS", - "SOUNDTRACK", - "LYRIC", - "LYRICS", - "AMBIENT", - "MIX", - "VEVO", - "CLIP", - "KARAOKE", - "OPENING", - "COVER", - "COVERED", - "VOCAL", - "INSTRUMENTAL", - "ORCHESTRAL", - "DUBSTEP", - "DJ", - "DNB", - "BASS", - "BEAT", - "ALBUM", - "PLAYLIST", - "DUBSTEP", - "CHILL", - "RELAX", - "CLASSIC", - "CINEMATIC", - ].some((i) => titleWordsList.includes(i))) || - [ - "OFFICIAL VIDEO", - "OFFICIAL AUDIO", - "FEAT.", - "FT.", - "LIVE RADIO", - "DANCE VER", - "HIP HOP", - "ROCK N ROLL", - "HOUR VER", - "HOURS VER", - "INTRO THEME", - ].some((i) => titleStr.includes(i)) || - (titleWordsList?.length && - [ - "OP", - "ED", - "MV", - "OST", - "NCS", - "BGM", - "EDM", - "GMV", - "AMV", - "MMD", - "MAD", - ].some((i) => titleWordsList.includes(i))) - ); -} + for (const item of items) { + const contentItem = document.createElement("vot-block"); + contentItem.classList.add("vot-select-content-item"); + contentItem.textContent = item.label; + contentItem.dataset.votSelected = item.selected; + contentItem.dataset.votValue = item.value; + if (item.disabled) { + contentItem.inert = true; + } -function getSubtitles() { - const response = getPlayerResponse(); - const playerCaptions = response?.captions?.playerCaptionsTracklistRenderer; - if (!playerCaptions) { - return []; - } + contentItem.onclick = async (e) => { + if (e.target.inert) return; - let captionTracks = playerCaptions.captionTracks ?? []; - const translationLanguages = playerCaptions.translationLanguages ?? []; - const userLang = localizationProvider.lang; - const userLangSupported = translationLanguages.find( - (language) => language.languageCode === userLang, - ); - const asrLang = - captionTracks.find((captionTrack) => captionTrack?.kind === "asr") - ?.languageCode ?? "en"; - captionTracks = captionTracks.reduce((result, captionTrack) => { - if (!("languageCode" in captionTrack)) { - return result; - } + // removing the selected value for updating + const contentItems = contentList.childNodes; + for (let ci of contentItems) { + ci.dataset.votSelected = false; + } + // fixed selection after closing the modal and opening again + for (let i of items) { + i.selected = i.value === item.value; + } - const language = captionTrack.languageCode - ? langTo6391(captionTrack.languageCode) - : undefined; - const url = captionTrack?.url || captionTrack?.baseUrl; - if (!language || !url) { - return result; + contentItem.dataset.votSelected = true; + title.textContent = item.label; + + // !!! use e.target.dataset.votValue instead of e.target.value !!! + await onSelectCb(e); + }; + contentList.appendChild(contentItem); } - const captionUrl = `${ - url.startsWith("http") ? url : `${window.location.origin}/${url}` - }&fmt=json3`; - result.push({ - source: "youtube", - language, - isAutoGenerated: captionTrack?.kind === "asr", - url: captionUrl, - }); + // search logic + const votSearchLangTextfield = createTextfield( + localizationProvider.get("searchField"), + ); - if ( - userLangSupported && - captionTrack.isTranslatable && - captionTrack.languageCode === asrLang && - userLang !== language - ) { - // add translated youtube subtitles (if it possible) - result.push({ - source: "youtube", - language: userLang, - isAutoGenerated: captionTrack?.kind === "asr", - translatedFromLanguage: language, - url: `${captionUrl}&tlang=${userLang}`, - }); - } + votSearchLangTextfield.input.oninput = (e) => { + const searchText = e.target.value.toLowerCase(); + // check if there are lovercase characters in the string. used for smarter search + for (let i = 0; i < selectedItems.length; i++) { + const ci = selectedItems[i]; + ci.hidden = !ci.textContent.toLowerCase().includes(searchText); + } + }; - return result; - }, []); - utils_debug.log("youtube subtitles:", captionTracks); - return captionTracks; -} + votSelectDialog.bodyContainer.append( + votSearchLangTextfield.container, + contentList, + ); + selectedItems = contentList.childNodes; -// Get the video data from the player -async function youtubeUtils_getVideoData() { - const player = getPlayer(); - const response = getPlayerResponse(); // null in /embed - const data = getPlayerData(); - const { title: localizedTitle } = data ?? {}; - const { - shortDescription: description, - isLive, - title, - } = response?.videoDetails ?? {}; - let detectedLanguage = title - ? await getLanguage(player, response, title, description) - : "en"; - detectedLanguage = availableLangs.includes(detectedLanguage) - ? detectedLanguage - : "en"; - const videoData = { - isLive: !!isLive, - title, - localizedTitle, - description, - detectedLanguage, + // remove the modal so that they do not accumulate + votSelectDialog.backdrop.onclick = votSelectDialog.closeButton.onclick = + () => { + votSelectDialog.container.remove(); + selectedItems = []; + }; + }; + + container.append(outer); + + const setTitle = (newTitle) => { + title.textContent = newTitle; + }; + + const setSelected = (val) => { + const selectedItemsArray = Array.from(selectedItems).filter( + (ci) => !ci.inert, + ); + for (let i = 0; i < selectedItemsArray.length; i++) { + const ci = selectedItemsArray[i]; + ci.dataset.votSelected = ci.dataset.votValue === val; + } + + for (let i = 0; i < items.length; i++) { + const currentItem = items[i]; + currentItem.selected = String(currentItem.value) === val; + } }; - utils_debug.log("youtube video data:", videoData); - console.log("[VOT] Detected language: ", videoData.detectedLanguage); - return videoData; -} -/* harmony default export */ const youtubeUtils = ({ - isMobile, - getPlayer, - getPlayerResponse, - getPlayerData, - getVideoVolume, - getSubtitles, - getVideoData: youtubeUtils_getVideoData, - setVideoVolume, - videoSeek, - isMuted, - isMusic, -}); + const updateItems = (newItems) => { + items = newItems; + }; -;// ./src/subtitles.js + return { + container, + title, + arrowIcon, + labelElement, + setTitle, + setSelected, + updateItems, + }; +} +function createVOTLanguageSelect(options) { + const { + fromTitle = undefinedPhrase, + fromDialogTitle = undefinedPhrase, + fromItems = [], + fromOnSelectCB = null, + toTitle = undefinedPhrase, + toDialogTitle = undefinedPhrase, + toItems = [], + toOnSelectCB = null, + } = options; + const container = document.createElement("vot-block"); + container.classList.add("vot-lang-select"); + const fromSelect = createVOTSelect(fromTitle, fromDialogTitle, fromItems, { + onSelectCb: fromOnSelectCB, + }); + const icon = document.createElement("vot-block"); + icon.classList.add("vot-lang-select-icon"); + Q( + Oe` + + `, + icon, + ); + const toSelect = createVOTSelect(toTitle, toDialogTitle, toItems, { + onSelectCb: toOnSelectCB, + }); -function formatYandexSubtitlesTokens(line) { - const lineEndMs = line.startMs + line.durationMs; - return line.tokens.reduce((result, token, index) => { - const nextToken = line.tokens[index + 1]; - let lastToken; - if (result.length > 0) { - lastToken = result[result.length - 1]; - } - const alignRangeEnd = lastToken?.alignRange?.end ?? 0; - const newAlignRangeEnd = alignRangeEnd + token.text.length; - token.alignRange = { - start: alignRangeEnd, - end: newAlignRangeEnd, - }; - result.push(token); - if (nextToken) { - const endMs = token.startMs + token.durationMs; - const durationMs = nextToken.startMs - ? nextToken.startMs - endMs - : lineEndMs - endMs; - result.push({ - text: " ", - startMs: endMs, - durationMs, - alignRange: { - start: newAlignRangeEnd, - end: newAlignRangeEnd + 1, - }, - }); - } - return result; - }, []); -} + container.append(fromSelect.container, icon, toSelect.container); -function createSubtitlesTokens(line, previousLineLastToken) { - const tokens = line.text.split(/([\n \t])/).reduce((result, tokenText) => { - if (tokenText.length) { - const lastToken = result[result.length - 1] ?? previousLineLastToken; - const alignRangeStart = lastToken?.alignRange?.end ?? 0; - const alignRangeEnd = alignRangeStart + tokenText.length; - result.push({ - text: tokenText, - alignRange: { - start: alignRangeStart, - end: alignRangeEnd, - }, - }); - } - return result; - }, []); - const tokenDurationMs = Math.floor(line.durationMs / tokens.length); - const lineEndMs = line.startMs + line.durationMs; - return tokens.map((token, index) => { - const isLastToken = index === tokens.length - 1; - const startMs = line.startMs + tokenDurationMs * index; - const durationMs = isLastToken ? lineEndMs - startMs : tokenDurationMs; - return { - ...token, - startMs, - durationMs, - }; - }); + return { + container, + fromSelect, + icon, + toSelect, + }; } -function getSubtitlesTokens(subtitles, subtitlesObject) { - const result = []; - let lastToken; - const { source, isAutoGenerated } = subtitlesObject; - for (let i = 0; i < subtitles.subtitles.length; i++) { - const line = subtitles.subtitles[i]; - const hasTokens = line?.tokens?.length; +function createDetails(titleHtml) { + const container = document.createElement("vot-block"); + container.classList.add("vot-details"); - let tokens = - hasTokens && - (source === "yandex" || (source === "youtube" && isAutoGenerated)) - ? formatYandexSubtitlesTokens(line) - : createSubtitlesTokens(line, lastToken); - lastToken = tokens[tokens.length - 1]; - result.push({ - ...line, - tokens, - }); - } - subtitles.containsTokens = true; - return result; -} + const header = document.createElement("vot-block"); + header.append(titleHtml); -function formatYoutubeSubtitles(subtitles, isAsr = false) { - const result = { - containsTokens: isAsr, - subtitles: [], - }; - if (typeof subtitles !== "object" || !Array.isArray(subtitles.events)) { - console.error("[VOT] Failed to format youtube subtitles", subtitles); - return result; - } + const arrowIcon = document.createElement("vot-block"); + arrowIcon.classList.add("vot-details-arrow-icon"); + Q(arrowIconRaw, arrowIcon); - for (let i = 0; i < subtitles.events.length; i++) { - const subtitle = subtitles.events[i]; - if (!subtitle.segs) continue; + container.append(header, arrowIcon); - let durationMs = subtitle.dDurationMs; - if ( - subtitles.events[i + 1] && - subtitle.tStartMs + subtitle.dDurationMs > - subtitles.events[i + 1].tStartMs - ) { - durationMs = subtitles.events[i + 1].tStartMs - subtitle.tStartMs; - } + return { + container, + header, + arrowIcon, + }; +} - const tokens = []; - let lastSegDuration = durationMs; - for (let j = 0; j < subtitle.segs.length; j++) { - const seg = subtitle.segs[j]; - const text = seg.utf8.trim(); - if (text === "\n") { - continue; - } +/** + * + * @export + * @param {SVGElement} votLoader + * @param {string} [primaryColor="139, 180, 245"] + * @return {Function} Update animation function + */ +function animateLoader(votLoader, primaryColor = "139, 180, 245") { + const votLoaderHelper = votLoader.querySelector(".vot-loader-helper"); + const votLoaderMain = votLoader.querySelector(".vot-loader-main"); + anime + .timeline({ + ...animeOpts, + targets: [votLoaderHelper, votLoaderMain], + duration: 250, + }) + .add({ + "fill-opacity": 0, + "stroke-width": 2, + d: "M 12 1.5 C 17.799 1.5 22.5 6.201 22.5 12 C 22.5 17.799 17.799 22.5 12 22.5 C 6.201 22.5 1.5 17.799 1.5 12 C 1.5 6.201 6.201 1.5 12 1.5 Z", + duration: 0, + }) + .add( + { + targets: votLoaderHelper, + stroke: `rgb(${primaryColor})`, + // make empty by default + "stroke-opacity": 0, + duration: 0, + }, + 0, + ) + .add( + { + targets: votLoaderMain, + stroke: "#888888", + "stroke-opacity": 0.25, + }, + 0, + ); + const animation = anime + .timeline({ + targets: votLoaderHelper, + easing: "easeInOutSine", + duration: 1000, + autoplay: false, + }) + .add( + { + // prevent full fill on 0% + strokeOpacity: 1, + duration: 0, + }, + 0, + ) + .add( + { + strokeDashoffset: [anime.setDashoffset, 0], + }, + 0, + ); - const offset = seg.tOffsetMs ?? 0; - let segDuration = durationMs; - const nextSeg = subtitle.segs[j + 1]; - if (nextSeg?.tOffsetMs) { - segDuration = nextSeg.tOffsetMs - offset; - lastSegDuration -= segDuration; - } + return (percentage) => { + animation.seek(animation.duration * (percentage / 100)); + }; +} - tokens.push({ - text, - startMs: subtitle.tStartMs + offset, - durationMs: nextSeg ? segDuration : lastSegDuration, - }); - } +function afterAnimateLoader(votLoader, primaryColor = "139, 180, 245") { + const votLoaderHelper = votLoader.querySelector(".vot-loader-helper"); + const votLoaderMain = votLoader.querySelector(".vot-loader-main"); + anime + .timeline({ + ...animeOpts, + targets: votLoaderMain, + duration: 600, + }) + .add({ + d: "M 9.0596 14.8571 L 9.7667 15.5642 L 10.4738 14.8571 L 17.0071 8.3238 C 17.0457 8.2852 17.0937 8.25 17.2333 8.25 C 17.373 8.25 17.421 8.2852 17.4596 8.3238 C 17.4981 8.3624 17.5333 8.4104 17.5333 8.55 C 17.5333 8.6896 17.4981 8.7376 17.4596 8.7762 L 9.9929 16.2429 C 9.9011 16.3346 9.8397 16.35 9.7667 16.35 C 9.6937 16.35 9.6322 16.3346 9.5404 16.2429 L 6.0738 12.7762 C 6.0352 12.7376 6 12.6897 6 12.55 C 6 12.4103 6.0352 12.3624 6.0738 12.3238 C 6.1124 12.2852 6.1603 12.25 6.3 12.25 C 6.4397 12.25 6.4876 12.2852 6.5262 12.3238 L 9.0596 14.8571 Z", + duration: 0, + }) + .add({ + strokeDashoffset: [anime.setDashoffset, 0], + stroke: `rgb(${primaryColor})`, + "stroke-opacity": 1, + }); - const text = tokens.map((e) => e.text).join(" "); - if (text) { - result.subtitles.push({ - text, - startMs: subtitle.tStartMs, - durationMs, - ...(isAsr ? { tokens } : {}), - speakerId: "0", + setTimeout(() => { + anime + .timeline({ + ...animeOpts, + targets: votLoaderMain, + duration: 600, + }) + .add({ + d: "M12 15.575C11.8667 15.575 11.7417 15.5542 11.625 15.5125C11.5083 15.4708 11.4 15.4 11.3 15.3L7.7 11.7C7.5 11.5 7.40417 11.2667 7.4125 11C7.42083 10.7333 7.51667 10.5 7.7 10.3C7.9 10.1 8.1375 9.99583 8.4125 9.9875C8.6875 9.97917 8.925 10.075 9.125 10.275L11 12.15V5C11 4.71667 11.0958 4.47917 11.2875 4.2875C11.4792 4.09583 11.7167 4 12 4C12.2833 4 12.5208 4.09583 12.7125 4.2875C12.9042 4.47917 13 4.71667 13 5V12.15L14.875 10.275C15.075 10.075 15.3125 9.97917 15.5875 9.9875C15.8625 9.99583 16.1 10.1 16.3 10.3C16.4833 10.5 16.5792 10.7333 16.5875 11C16.5958 11.2667 16.5 11.5 16.3 11.7L12.7 15.3C12.6 15.4 12.4917 15.4708 12.375 15.5125C12.2583 15.5542 12.1333 15.575 12 15.575ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V16C4 15.7167 4.09583 15.4792 4.2875 15.2875C4.47917 15.0958 4.71667 15 5 15C5.28333 15 5.52083 15.0958 5.7125 15.2875C5.90417 15.4792 6 15.7167 6 16V18H18V16C18 15.7167 18.0958 15.4792 18.2875 15.2875C18.4792 15.0958 18.7167 15 19 15C19.2833 15 19.5208 15.0958 19.7125 15.2875C19.9042 15.4792 20 15.7167 20 16V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z", + duration: 100, + }) + .add( + { + targets: votLoaderHelper, + d: "", + duration: 200, + }, + 0, + ) + .add({ + targets: votLoaderMain, + "stroke-width": "0", + stroke: `rgba(${primaryColor}), 0)`, + "fill-opacity": "1", + "stroke-dasharray": "0", + "stroke-dashoffset": "0", + duration: 0, }); - } - } - return result; + }, 2000); } -async function fetchSubtitles(subtitlesObject) { - const { source, isAutoGenerated, format, url } = subtitlesObject; - const fetchPromise = (async () => { - try { - const response = await GM_fetch(url, { timeout: 5000 }); - if (["vtt", "srt"].includes(format)) { - const plain = await response.text(); - return convertSubs(plain, "json"); - } - return await response.json(); - } catch (error) { - console.error("[VOT] Failed to fetch subtitles.", error); - return { - containsTokens: false, - subtitles: [], - }; - } - })(); +/* harmony default export */ const ui = ({ + createHeader, + createInformation, + createButton, + createTextButton, + createOutlinedButton, + createIconButton, + createCheckbox, + createSlider, + createTextfield, + createDialog, + createVOTButton, + createVOTMenu, + createVOTSelectLabel, + createVOTSelect, + createVOTLanguageSelect, + updateSlider, + animateLoader, + afterAnimateLoader, + createDetails, +}); - let subtitles = await fetchPromise; - if (source === "youtube") { - subtitles = formatYoutubeSubtitles(subtitles, isAutoGenerated); +;// ./src/utils/volume.js +// element - audio / video element +function syncVolume(element, sliderVolume, otherSliderVolume, tempVolume) { + let finalValue = sliderVolume; + if (sliderVolume > tempVolume) { + // sliderVolume = 100 + // tempVolume = 69 + // volume = 15 + // 100 - 69 = 31 + // 15 + 31 = 46 - final video volume + finalValue = otherSliderVolume + (sliderVolume - tempVolume); + finalValue = finalValue > 100 ? 100 : Math.max(finalValue, 0); + + element.volume = finalValue / 100; + } else if (sliderVolume < tempVolume) { + // sliderVolume = 69 + // tempVolume = 100 + // volume = 15 + // 100 - 69 = 31 + // 15 - 31 = 0 - final video volume + finalValue = otherSliderVolume - (tempVolume - sliderVolume); + finalValue = finalValue > 100 ? 100 : Math.max(finalValue, 0); + + element.volume = finalValue / 100; } - subtitles.subtitles = getSubtitlesTokens(subtitles, subtitlesObject); - console.log("[VOT] subtitles:", subtitles); - return subtitles; + return finalValue; } -async function subtitles_getSubtitles(client, videoData) { - const { - host, - url, - detectedLanguage: requestLang, - videoId, - duration, - subtitles, - } = videoData; - const extraSubtitles = - host === "youtube" ? youtubeUtils.getSubtitles() : subtitles ?? []; - - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error("Timeout")), 5000), - ); +// 0.00 - 1.00 +const percentToDecibels = (percent) => 20 * Math.log10(percent / 1); +const decibelsToPercent = (dB) => Math.pow(10, dB / 20); - try { - const res = await Promise.race([ - client.getSubtitles({ - videoData: { host, url, videoId, duration }, - requestLang, - }), - timeoutPromise, - ]); - console.log("[VOT] Subtitles response: ", res); - if (res.waiting) { - console.error("[VOT] Failed to get yandex subtitles"); - } +// EXTERNAL MODULE: ./node_modules/requestidlecallback-polyfill/index.js +var requestidlecallback_polyfill = __webpack_require__("./node_modules/requestidlecallback-polyfill/index.js"); +;// ./src/utils/EventImpl.js +class EventImpl { + constructor() { + this.listeners = new Set(); + } - // Обработка субтитров - let subtitles = res.subtitles ?? []; - subtitles = subtitles.reduce((result, yaSubtitlesObject) => { - if ( - yaSubtitlesObject.language && - !result.find( - (e) => - e.source === "yandex" && - e.language === yaSubtitlesObject.language && - !e.translatedFromLanguage, - ) - ) { - result.push({ - source: "yandex", - language: yaSubtitlesObject.language, - url: yaSubtitlesObject.url, - }); - } - if (yaSubtitlesObject.translatedLanguage) { - result.push({ - source: "yandex", - language: yaSubtitlesObject.translatedLanguage, - translatedFromLanguage: yaSubtitlesObject.language, - url: yaSubtitlesObject.translatedUrl, - }); - } - return result; - }, []); + hasListener(e) { + return this.listeners.has(e); + } - return [...subtitles, ...extraSubtitles].sort((a, b) => { - if (a.source !== b.source) return a.source === "yandex" ? -1 : 1; - if ( - a.language !== b.language && - (a.language === lang || b.language === lang) - ) - return a.language === lang ? -1 : 1; - if (a.source === "yandex") { - // sort by translation - if (a.translatedFromLanguage !== b.translatedFromLanguage) { - // sort by translatedFromLanguage - if (!a.translatedFromLanguage || !b.translatedFromLanguage) { - // sort by isTranslated - if (a.language === b.language) - return a.translatedFromLanguage ? 1 : -1; - return !a.translatedFromLanguage ? 1 : -1; - } - return a.translatedFromLanguage === requestLang ? -1 : 1; - } - // sort non translated by language - if (!a.translatedFromLanguage) - return a.language === requestLang ? -1 : 1; - } - // sort by isAutoGenerated - if (a.source !== "yandex" && a.isAutoGenerated !== b.isAutoGenerated) - return a.isAutoGenerated ? 1 : -1; - return 0; - }); - } catch (error) { - if (error.message === "Timeout") { - console.error("[VOT] Failed to get yandex subtitles. Reason: timeout"); - } else { - console.error("[VOT] Error in getSubtitles function", error); + dispatchToListener(handler, ...args) { + try { + handler(...args); + } catch (exception) { + console.error("[VOT]", exception); + } + } + + addListener(handler) { + if (this.hasListener(handler)) { + throw new Error("[VOT] The listener has already been added."); + } + this.listeners.add(handler); + } + + removeListener(handler) { + if (!this.hasListener(handler)) { + throw new Error("[VOT] The listener has not been added yet."); + } + this.listeners.delete(handler); + } + + dispatch(...args) { + for (const handler of Array.from(this.listeners)) { + this.dispatchToListener(handler, ...args); } - // на сайтах, где нет сабов всегда красит кнопку - throw error; } } -class SubtitlesWidget { - constructor(video, container, site) { - this.video = video; - this.container = - site.host === "youtube" && site.additionalData !== "mobile" - ? container.parentElement - : container; - this.site = site; +;// ./src/utils/VideoObserver.js - this.subtitlesContainer = this.createSubtitlesContainer(); - this.position = { left: 25, top: 75 }; - this.dragging = { active: false, offset: { x: 0, y: 0 } }; - this.subtitles = null; - this.lastContent = null; - this.highlightWords = false; - this.fontSize = 20; - this.opacity = 0.2; - this.maxLength = 300; - this.maxLengthRegexp = /.{1,300}(?:\s|$)/g; - this.bindEvents(); - this.updateContainerRect(); + +const adKeywords = new Set([ + "advertise", + "promo", + "sponsor", + "banner", + "commercial", + "preroll", + "midroll", + "postroll", + "ad-container", + "sponsored", +]); + +const adKeywordsRegex = (() => { + const pattern = Array.from(adKeywords).join("|"); + return new RegExp(pattern, "i"); +})(); + +const filterVideoNodes = (nodes) => { + const result = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (node instanceof HTMLVideoElement) { + result.push(node); + } else if (node instanceof HTMLElement) { + const videos = node.querySelectorAll("video"); + for (let j = 0; j < videos.length; j++) { + result.push(videos[j]); + } + } else if (node.shadowRoot) { + const shadowVideos = node.shadowRoot.querySelectorAll("video"); + for (let k = 0; k < shadowVideos.length; k++) { + result.push(shadowVideos[k]); + } + } } + return result; +}; - createSubtitlesContainer() { - const container = document.createElement("vot-block"); - container.classList.add("vot-subtitles-widget"); - this.container.appendChild(container); - return container; +const isAdVideo = (video) => { + if ( + adKeywordsRegex.test(video.className) || + adKeywordsRegex.test(video.title) + ) + return true; + + let parent = video.parentElement; + while (parent) { + if ( + adKeywordsRegex.test(parent.className) || + adKeywordsRegex.test(parent.id) + ) + return true; + parent = parent.parentElement; } - bindEvents() { - this.onMouseDownBound = (e) => this.onMouseDown(e); - this.onMouseUpBound = () => this.onMouseUp(); - this.onMouseMoveBound = (e) => this.onMouseMove(e); - this.onTimeUpdateBound = this.debounce(() => this.update(), 100); + return false; +}; - document.addEventListener("mousedown", this.onMouseDownBound); - document.addEventListener("mouseup", this.onMouseUpBound); - document.addEventListener("mousemove", this.onMouseMoveBound); - this.video?.addEventListener("timeupdate", this.onTimeUpdateBound); +const isMutedVideo = (video) => { + return ( + video.hasAttribute("muted") && + !video.classList.contains("vjs-tech") && + !video.preload + ); +}; - this.resizeObserver = new ResizeObserver(() => this.onResize()); - this.resizeObserver.observe(this.container); +const isVideoReady = (video) => video.readyState >= 3; + +const waitForVideoReady = (video, callback) => { + const checkVideoState = () => { + if (isVideoReady(video)) { + callback(video); + } else { + requestAnimationFrame(checkVideoState); + } + }; + + checkVideoState(); +}; + +class VideoObserver { + constructor() { + this.videoCache = new Set(); + this.onVideoAdded = new EventImpl(); + this.onVideoRemoved = new EventImpl(); + + this.observer = new MutationObserver(this.handleMutations); + this.intersectionObserver = new IntersectionObserver( + this.handleIntersections, + { threshold: 0.1 }, + ); } - onMouseDown(e) { - if (this.subtitlesContainer.contains(e.target)) { - const rect = this.subtitlesContainer.getBoundingClientRect(); - const containerRect = this.container.getBoundingClientRect(); - this.dragging = { - active: true, - offset: { - x: e.clientX - rect.left, - y: e.clientY - rect.top, - }, - containerOffset: { - x: containerRect.left, - y: containerRect.top, - }, - }; + handleMutations = (mutationsList) => { + window.requestIdleCallback( + () => { + for (let i = 0; i < mutationsList.length; i++) { + const mutation = mutationsList[i]; + if (mutation.type !== "childList") continue; + + const addedVideos = filterVideoNodes(mutation.addedNodes); + for (let j = 0; j < addedVideos.length; j++) { + this.checkAndHandleVideo(addedVideos[j]); + } + + const removedVideos = filterVideoNodes(mutation.removedNodes); + for (let k = 0; k < removedVideos.length; k++) { + this.handleVideoRemoved(removedVideos[k]); + } + } + }, + { timeout: 1000 }, + ); + }; + + handleIntersections = (entries) => { + for (let i = 0; i < entries.length; i++) { + const entry = entries[i]; + if (entry.isIntersecting) { + this.handleIntersectingVideo(entry.target); + } + } + }; + + enable() { + this.observer.observe(document, { childList: true, subtree: true }); + const videos = this.getAllVideoEls(); + for (let i = 0; i < videos.length; i++) { + this.checkAndHandleVideo(videos[i]); } } - onMouseUp() { - this.dragging.active = false; + disable() { + this.observer.disconnect(); + this.intersectionObserver.disconnect(); } - onMouseMove(e) { - if (this.dragging.active) { - e.preventDefault(); - const { width, height } = this.container.getBoundingClientRect(); - const containerOffset = this.dragging.containerOffset; - this.position = { - left: - ((e.clientX - this.dragging.offset.x - containerOffset.x) / width) * - 100, - top: - ((e.clientY - this.dragging.offset.y - containerOffset.y) / height) * - 100, - }; - this.applySubtitlePosition(); + getAllVideoEls() { + const videos = document.querySelectorAll("video"); + if (videos.length) return Array.from(videos); + + // Use it only if we don't find videos + // It takes a long time to complete + const videoElements = new Set(); + const traverseShadowRoot = (root) => { + if (!root) return; + const shadowVideos = root.querySelectorAll("video"); + for (let i = 0; i < shadowVideos.length; i++) { + videoElements.add(shadowVideos[i]); + } + const shadowElements = root.querySelectorAll("*"); + for (let i = 0; i < shadowElements.length; i++) { + if (shadowElements[i].shadowRoot) + traverseShadowRoot(shadowElements[i].shadowRoot); + } + }; + + const allElements = document.querySelectorAll("*"); + for (let i = 0; i < allElements.length; i++) { + if (allElements[i].shadowRoot) + traverseShadowRoot(allElements[i].shadowRoot); } - } - onResize() { - this.updateContainerRect(); + return Array.from(videoElements); } - updateContainerRect() { - this.containerRect = this.container.getBoundingClientRect(); - this.applySubtitlePosition(); - } + checkAndHandleVideo = (video) => { + if (this.videoCache.has(video)) return; + this.videoCache.add(video); + this.intersectionObserver.observe(video); + }; + + handleIntersectingVideo = (video) => { + this.intersectionObserver.unobserve(video); + if (isAdVideo(video) || isMutedVideo(video)) { + debug.log("The promotional/muted video was ignored", video); + return; + } + waitForVideoReady(video, this.handleVideoAdded); + }; + + handleVideoAdded = (video) => { + this.onVideoAdded.dispatch(video); + }; - applySubtitlePosition() { - const { width, height } = this.containerRect; - const { offsetWidth, offsetHeight } = this.subtitlesContainer; + handleVideoRemoved = (video) => { + if (!document.contains(video)) { + this.videoCache.delete(video); + this.onVideoRemoved.dispatch(video); + } + }; +} - const maxLeft = ((width - offsetWidth) / width) * 100; - const maxTop = ((height - offsetHeight) / height) * 100; +;// ./node_modules/chaimu/dist/config.js +/* harmony default export */ const dist_config = ({ + version: "1.0.2", + debug: false, + fetchFn: fetch.bind(window), +}); - this.position.left = Math.max(0, Math.min(this.position.left, maxLeft)); - this.position.top = Math.max(0, Math.min(this.position.top, maxTop)); +;// ./node_modules/soundtouchjs/dist/soundtouch.js +/* + * SoundTouch JS v0.1.30 audio processing library + * Copyright (c) Olli Parviainen + * Copyright (c) Ryan Berdeen + * Copyright (c) Jakub Fiala + * Copyright (c) Steve 'Cutter' Blades + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ - this.subtitlesContainer.style.left = `${this.position.left}%`; - this.subtitlesContainer.style.top = `${this.position.top}%`; +class FifoSampleBuffer { + constructor() { + this._vector = new Float32Array(); + this._position = 0; + this._frameCount = 0; } - - setContent(subtitles) { - if (subtitles && this.video) { - this.subtitles = subtitles; - this.update(); - } else { - this.subtitles = null; - Q(null, this.subtitlesContainer); + get vector() { + return this._vector; + } + get position() { + return this._position; + } + get startIndex() { + return this._position * 2; + } + get frameCount() { + return this._frameCount; + } + get endIndex() { + return (this._position + this._frameCount) * 2; + } + clear() { + this.receive(this._frameCount); + this.rewind(); + } + put(numFrames) { + this._frameCount += numFrames; + } + putSamples(samples, position, numFrames = 0) { + position = position || 0; + const sourceOffset = position * 2; + if (!(numFrames >= 0)) { + numFrames = (samples.length - sourceOffset) / 2; + } + const numSamples = numFrames * 2; + this.ensureCapacity(numFrames + this._frameCount); + const destOffset = this.endIndex; + this.vector.set(samples.subarray(sourceOffset, sourceOffset + numSamples), destOffset); + this._frameCount += numFrames; + } + putBuffer(buffer, position, numFrames = 0) { + position = position || 0; + if (!(numFrames >= 0)) { + numFrames = buffer.frameCount - position; } + this.putSamples(buffer.vector, buffer.position + position, numFrames); } - - setMaxLength(len) { - if (typeof len === "number" && len) { - this.maxLength = len; - this.maxLengthRegexp = new RegExp(`.{1,${len}}(?:\\s|$)`, "g"); - this.update(); + receive(numFrames) { + if (!(numFrames >= 0) || numFrames > this._frameCount) { + numFrames = this.frameCount; } + this._frameCount -= numFrames; + this._position += numFrames; } - - setHighlightWords(value) { - this.highlightWords = Boolean(value); - this.update(); + receiveSamples(output, numFrames = 0) { + const numSamples = numFrames * 2; + const sourceOffset = this.startIndex; + output.set(this._vector.subarray(sourceOffset, sourceOffset + numSamples)); + this.receive(numFrames); } - - setFontSize(size) { - this.fontSize = size; - const subtitlesEl = - this.subtitlesContainer?.querySelector(".vot-subtitles"); - if (subtitlesEl) { - subtitlesEl.style.fontSize = `${this.fontSize}px`; + extract(output, position = 0, numFrames = 0) { + const sourceOffset = this.startIndex + position * 2; + const numSamples = numFrames * 2; + output.set(this._vector.subarray(sourceOffset, sourceOffset + numSamples)); + } + ensureCapacity(numFrames = 0) { + const minLength = parseInt(numFrames * 2); + if (this._vector.length < minLength) { + const newVector = new Float32Array(minLength); + newVector.set(this._vector.subarray(this.startIndex, this.endIndex)); + this._vector = newVector; + this._position = 0; + } else { + this.rewind(); } } - - /** - * Set subtitles opacity by percentage where 100 - full transparent, 0 - not transparent - * - * @param {number} rate - 0-100 percent of opacity - */ - setOpacity(rate) { - this.opacity = ((100 - +rate) / 100).toFixed(2); - const subtitlesEl = - this.subtitlesContainer?.querySelector(".vot-subtitles"); - if (subtitlesEl) { - subtitlesEl.style.setProperty("--vot-subtitles-opacity", this.opacity); + ensureAdditionalCapacity(numFrames = 0) { + this.ensureCapacity(this._frameCount + numFrames); + } + rewind() { + if (this._position > 0) { + this._vector.set(this._vector.subarray(this.startIndex, this.endIndex)); + this._position = 0; } } +} - update() { - if (!this.video || !this.subtitles) return; - - const time = this.video.currentTime * 1000; - const line = this.subtitles.subtitles?.findLast( - (e) => e.startMs < time && time < e.startMs + e.durationMs, - ); - - if (!line) { - Q(null, this.subtitlesContainer); - return; +class AbstractFifoSamplePipe { + constructor(createBuffers) { + if (createBuffers) { + this._inputBuffer = new FifoSampleBuffer(); + this._outputBuffer = new FifoSampleBuffer(); + } else { + this._inputBuffer = this._outputBuffer = null; } + } + get inputBuffer() { + return this._inputBuffer; + } + set inputBuffer(inputBuffer) { + this._inputBuffer = inputBuffer; + } + get outputBuffer() { + return this._outputBuffer; + } + set outputBuffer(outputBuffer) { + this._outputBuffer = outputBuffer; + } + clear() { + this._inputBuffer.clear(); + this._outputBuffer.clear(); + } +} - let tokens = this.processTokens(line.tokens); - const content = this.renderTokens(tokens, time); - const stringContent = JSON.stringify(content); - if (stringContent !== this.lastContent) { - this.lastContent = stringContent; - Q( - ke`${content}`, - this.subtitlesContainer, - ); +class RateTransposer extends AbstractFifoSamplePipe { + constructor(createBuffers) { + super(createBuffers); + this.reset(); + this._rate = 1; + } + set rate(rate) { + this._rate = rate; + } + reset() { + this.slopeCount = 0; + this.prevSampleL = 0; + this.prevSampleR = 0; + } + clone() { + const result = new RateTransposer(); + result.rate = this._rate; + return result; + } + process() { + const numFrames = this._inputBuffer.frameCount; + this._outputBuffer.ensureAdditionalCapacity(numFrames / this._rate + 1); + const numFramesOutput = this.transpose(numFrames); + this._inputBuffer.receive(); + this._outputBuffer.put(numFramesOutput); + } + transpose(numFrames = 0) { + if (numFrames === 0) { + return 0; + } + const src = this._inputBuffer.vector; + const srcOffset = this._inputBuffer.startIndex; + const dest = this._outputBuffer.vector; + const destOffset = this._outputBuffer.endIndex; + let used = 0; + let i = 0; + while (this.slopeCount < 1.0) { + dest[destOffset + 2 * i] = (1.0 - this.slopeCount) * this.prevSampleL + this.slopeCount * src[srcOffset]; + dest[destOffset + 2 * i + 1] = (1.0 - this.slopeCount) * this.prevSampleR + this.slopeCount * src[srcOffset + 1]; + i = i + 1; + this.slopeCount += this._rate; + } + this.slopeCount -= 1.0; + if (numFrames !== 1) { + out: while (true) { + while (this.slopeCount > 1.0) { + this.slopeCount -= 1.0; + used = used + 1; + if (used >= numFrames - 1) { + break out; + } + } + const srcIndex = srcOffset + 2 * used; + dest[destOffset + 2 * i] = (1.0 - this.slopeCount) * src[srcIndex] + this.slopeCount * src[srcIndex + 2]; + dest[destOffset + 2 * i + 1] = (1.0 - this.slopeCount) * src[srcIndex + 1] + this.slopeCount * src[srcIndex + 3]; + i = i + 1; + this.slopeCount += this._rate; + } } + this.prevSampleL = src[srcOffset + 2 * numFrames - 2]; + this.prevSampleR = src[srcOffset + 2 * numFrames - 1]; + return i; } +} - processTokens(tokens) { - if (tokens.at(-1).alignRange.end <= this.maxLength) return tokens; - - let chunks = []; - let chunkTokens = []; - let length = 0; - - for (const token of tokens) { - length += token.text.length; - chunkTokens.push(token); - - if (length > this.maxLength) { - chunks.push(this.trimChunk(chunkTokens)); - chunkTokens = []; - length = 0; +class FilterSupport { + constructor(pipe) { + this._pipe = pipe; + } + get pipe() { + return this._pipe; + } + get inputBuffer() { + return this._pipe.inputBuffer; + } + get outputBuffer() { + return this._pipe.outputBuffer; + } + fillInputBuffer() { + throw new Error('fillInputBuffer() not overridden'); + } + fillOutputBuffer(numFrames = 0) { + while (this.outputBuffer.frameCount < numFrames) { + const numInputFrames = 8192 * 2 - this.inputBuffer.frameCount; + this.fillInputBuffer(numInputFrames); + if (this.inputBuffer.frameCount < 8192 * 2) { + break; } + this._pipe.process(); } + } + clear() { + this._pipe.clear(); + } +} - if (chunkTokens.length) chunks.push(this.trimChunk(chunkTokens)); +const noop = function () { + return; +}; - const time = this.video.currentTime * 1000; - return ( - chunks.find( - (chunk) => - chunk[0].startMs < time && - time < chunk.at(-1).startMs + chunk.at(-1).durationMs, - ) || chunks[0] - ); +class SimpleFilter extends FilterSupport { + constructor(sourceSound, pipe, callback = noop) { + super(pipe); + this.callback = callback; + this.sourceSound = sourceSound; + this.historyBufferSize = 22050; + this._sourcePosition = 0; + this.outputBufferPosition = 0; + this._position = 0; } - - trimChunk(tokens) { - if (tokens[0].text === " ") tokens.shift(); - if (tokens.at(-1).text === " ") tokens.pop(); - return tokens; + get position() { + return this._position; } - - renderTokens(tokens, time) { - return tokens.map((token) => { - const passed = - this.highlightWords && - (time > token.startMs + token.durationMs / 2 || - (time > token.startMs - 100 && - token.startMs + token.durationMs / 2 - time < 275)); - return ke`${token.text.replace("\\n", "
")}
`; - }); + set position(position) { + if (position > this._position) { + throw new RangeError('New position may not be greater than current position'); + } + const newOutputBufferPosition = this.outputBufferPosition - (this._position - position); + if (newOutputBufferPosition < 0) { + throw new RangeError('New position falls outside of history buffer'); + } + this.outputBufferPosition = newOutputBufferPosition; + this._position = position; } - - debounce(func, wait) { - let timeout; - return (...args) => { - clearTimeout(timeout); - timeout = setTimeout(() => func.apply(this, args), wait); - }; + get sourcePosition() { + return this._sourcePosition; } - - release() { - document.removeEventListener("mousedown", this.onMouseDownBound); - document.removeEventListener("mouseup", this.onMouseUpBound); - document.removeEventListener("mousemove", this.onMouseMoveBound); - this.video?.removeEventListener("timeupdate", this.onTimeUpdateBound); - this.resizeObserver.disconnect(); - this.subtitlesContainer.remove(); + set sourcePosition(sourcePosition) { + this.clear(); + this._sourcePosition = sourcePosition; + } + onEnd() { + this.callback(); + } + fillInputBuffer(numFrames = 0) { + const samples = new Float32Array(numFrames * 2); + const numFramesExtracted = this.sourceSound.extract(samples, numFrames, this._sourcePosition); + this._sourcePosition += numFramesExtracted; + this.inputBuffer.putSamples(samples, 0, numFramesExtracted); + } + extract(target, numFrames = 0) { + this.fillOutputBuffer(this.outputBufferPosition + numFrames); + const numFramesExtracted = Math.min(numFrames, this.outputBuffer.frameCount - this.outputBufferPosition); + this.outputBuffer.extract(target, this.outputBufferPosition, numFramesExtracted); + const currentFrames = this.outputBufferPosition + numFramesExtracted; + this.outputBufferPosition = Math.min(this.historyBufferSize, currentFrames); + this.outputBuffer.receive(Math.max(currentFrames - this.historyBufferSize, 0)); + this._position += numFramesExtracted; + return numFramesExtracted; + } + handleSampleData(event) { + this.extract(event.data, 4096); + } + clear() { + super.clear(); + this.outputBufferPosition = 0; } } -// EXTERNAL MODULE: ./node_modules/requestidlecallback-polyfill/index.js -var requestidlecallback_polyfill = __webpack_require__("./node_modules/requestidlecallback-polyfill/index.js"); -;// ./src/utils/EventImpl.js -class EventImpl { - constructor() { - this.listeners = new Set(); +const USE_AUTO_SEQUENCE_LEN = 0; +const DEFAULT_SEQUENCE_MS = USE_AUTO_SEQUENCE_LEN; +const USE_AUTO_SEEKWINDOW_LEN = 0; +const DEFAULT_SEEKWINDOW_MS = USE_AUTO_SEEKWINDOW_LEN; +const DEFAULT_OVERLAP_MS = 8; +const _SCAN_OFFSETS = [[124, 186, 248, 310, 372, 434, 496, 558, 620, 682, 744, 806, 868, 930, 992, 1054, 1116, 1178, 1240, 1302, 1364, 1426, 1488, 0], [-100, -75, -50, -25, 25, 50, 75, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [-20, -15, -10, -5, 5, 10, 15, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [-4, -3, -2, -1, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]; +const AUTOSEQ_TEMPO_LOW = 0.5; +const AUTOSEQ_TEMPO_TOP = 2.0; +const AUTOSEQ_AT_MIN = 125.0; +const AUTOSEQ_AT_MAX = 50.0; +const AUTOSEQ_K = (AUTOSEQ_AT_MAX - AUTOSEQ_AT_MIN) / (AUTOSEQ_TEMPO_TOP - AUTOSEQ_TEMPO_LOW); +const AUTOSEQ_C = AUTOSEQ_AT_MIN - AUTOSEQ_K * AUTOSEQ_TEMPO_LOW; +const AUTOSEEK_AT_MIN = 25.0; +const AUTOSEEK_AT_MAX = 15.0; +const AUTOSEEK_K = (AUTOSEEK_AT_MAX - AUTOSEEK_AT_MIN) / (AUTOSEQ_TEMPO_TOP - AUTOSEQ_TEMPO_LOW); +const AUTOSEEK_C = AUTOSEEK_AT_MIN - AUTOSEEK_K * AUTOSEQ_TEMPO_LOW; +class Stretch extends AbstractFifoSamplePipe { + constructor(createBuffers) { + super(createBuffers); + this._quickSeek = true; + this.midBufferDirty = false; + this.midBuffer = null; + this.overlapLength = 0; + this.autoSeqSetting = true; + this.autoSeekSetting = true; + this._tempo = 1; + this.setParameters(44100, DEFAULT_SEQUENCE_MS, DEFAULT_SEEKWINDOW_MS, DEFAULT_OVERLAP_MS); } - - hasListener(e) { - return this.listeners.has(e); + clear() { + super.clear(); + this.clearMidBuffer(); } - - dispatchToListener(handler, ...args) { - try { - handler(...args); - } catch (exception) { - console.error("[VOT]", exception); + clearMidBuffer() { + if (this.midBufferDirty) { + this.midBufferDirty = false; + this.midBuffer = null; } } - - addListener(handler) { - if (this.hasListener(handler)) { - throw new Error("[VOT] The listener has already been added."); + setParameters(sampleRate, sequenceMs, seekWindowMs, overlapMs) { + if (sampleRate > 0) { + this.sampleRate = sampleRate; } - this.listeners.add(handler); + if (overlapMs > 0) { + this.overlapMs = overlapMs; + } + if (sequenceMs > 0) { + this.sequenceMs = sequenceMs; + this.autoSeqSetting = false; + } else { + this.autoSeqSetting = true; + } + if (seekWindowMs > 0) { + this.seekWindowMs = seekWindowMs; + this.autoSeekSetting = false; + } else { + this.autoSeekSetting = true; + } + this.calculateSequenceParameters(); + this.calculateOverlapLength(this.overlapMs); + this.tempo = this._tempo; } - - removeListener(handler) { - if (!this.hasListener(handler)) { - throw new Error("[VOT] The listener has not been added yet."); + set tempo(newTempo) { + let intskip; + this._tempo = newTempo; + this.calculateSequenceParameters(); + this.nominalSkip = this._tempo * (this.seekWindowLength - this.overlapLength); + this.skipFract = 0; + intskip = Math.floor(this.nominalSkip + 0.5); + this.sampleReq = Math.max(intskip + this.overlapLength, this.seekWindowLength) + this.seekLength; + } + get tempo() { + return this._tempo; + } + get inputChunkSize() { + return this.sampleReq; + } + get outputChunkSize() { + return this.overlapLength + Math.max(0, this.seekWindowLength - 2 * this.overlapLength); + } + calculateOverlapLength(overlapInMsec = 0) { + let newOvl; + newOvl = this.sampleRate * overlapInMsec / 1000; + newOvl = newOvl < 16 ? 16 : newOvl; + newOvl -= newOvl % 8; + this.overlapLength = newOvl; + this.refMidBuffer = new Float32Array(this.overlapLength * 2); + this.midBuffer = new Float32Array(this.overlapLength * 2); + } + checkLimits(x, mi, ma) { + return x < mi ? mi : x > ma ? ma : x; + } + calculateSequenceParameters() { + let seq; + let seek; + if (this.autoSeqSetting) { + seq = AUTOSEQ_C + AUTOSEQ_K * this._tempo; + seq = this.checkLimits(seq, AUTOSEQ_AT_MAX, AUTOSEQ_AT_MIN); + this.sequenceMs = Math.floor(seq + 0.5); + } + if (this.autoSeekSetting) { + seek = AUTOSEEK_C + AUTOSEEK_K * this._tempo; + seek = this.checkLimits(seek, AUTOSEEK_AT_MAX, AUTOSEEK_AT_MIN); + this.seekWindowMs = Math.floor(seek + 0.5); + } + this.seekWindowLength = Math.floor(this.sampleRate * this.sequenceMs / 1000); + this.seekLength = Math.floor(this.sampleRate * this.seekWindowMs / 1000); + } + set quickSeek(enable) { + this._quickSeek = enable; + } + clone() { + const result = new Stretch(); + result.tempo = this._tempo; + result.setParameters(this.sampleRate, this.sequenceMs, this.seekWindowMs, this.overlapMs); + return result; + } + seekBestOverlapPosition() { + return this._quickSeek ? this.seekBestOverlapPositionStereoQuick() : this.seekBestOverlapPositionStereo(); + } + seekBestOverlapPositionStereo() { + let bestOffset; + let bestCorrelation; + let correlation; + let i = 0; + this.preCalculateCorrelationReferenceStereo(); + bestOffset = 0; + bestCorrelation = Number.MIN_VALUE; + for (; i < this.seekLength; i = i + 1) { + correlation = this.calculateCrossCorrelationStereo(2 * i, this.refMidBuffer); + if (correlation > bestCorrelation) { + bestCorrelation = correlation; + bestOffset = i; + } } - this.listeners.delete(handler); + return bestOffset; } - - dispatch(...args) { - for (const handler of Array.from(this.listeners)) { - this.dispatchToListener(handler, ...args); + seekBestOverlapPositionStereoQuick() { + let bestOffset; + let bestCorrelation; + let correlation; + let scanCount = 0; + let correlationOffset; + let tempOffset; + this.preCalculateCorrelationReferenceStereo(); + bestCorrelation = Number.MIN_VALUE; + bestOffset = 0; + correlationOffset = 0; + tempOffset = 0; + for (; scanCount < 4; scanCount = scanCount + 1) { + let j = 0; + while (_SCAN_OFFSETS[scanCount][j]) { + tempOffset = correlationOffset + _SCAN_OFFSETS[scanCount][j]; + if (tempOffset >= this.seekLength) { + break; + } + correlation = this.calculateCrossCorrelationStereo(2 * tempOffset, this.refMidBuffer); + if (correlation > bestCorrelation) { + bestCorrelation = correlation; + bestOffset = tempOffset; + } + j = j + 1; + } + correlationOffset = bestOffset; + } + return bestOffset; + } + preCalculateCorrelationReferenceStereo() { + let i = 0; + let context; + let temp; + for (; i < this.overlapLength; i = i + 1) { + temp = i * (this.overlapLength - i); + context = i * 2; + this.refMidBuffer[context] = this.midBuffer[context] * temp; + this.refMidBuffer[context + 1] = this.midBuffer[context + 1] * temp; + } + } + calculateCrossCorrelationStereo(mixingPosition, compare) { + const mixing = this._inputBuffer.vector; + mixingPosition += this._inputBuffer.startIndex; + let correlation = 0; + let i = 2; + const calcLength = 2 * this.overlapLength; + let mixingOffset; + for (; i < calcLength; i = i + 2) { + mixingOffset = i + mixingPosition; + correlation += mixing[mixingOffset] * compare[i] + mixing[mixingOffset + 1] * compare[i + 1]; + } + return correlation; + } + overlap(overlapPosition) { + this.overlapStereo(2 * overlapPosition); + } + overlapStereo(inputPosition) { + const input = this._inputBuffer.vector; + inputPosition += this._inputBuffer.startIndex; + const output = this._outputBuffer.vector; + const outputPosition = this._outputBuffer.endIndex; + let i = 0; + let context; + let tempFrame; + const frameScale = 1 / this.overlapLength; + let fi; + let inputOffset; + let outputOffset; + for (; i < this.overlapLength; i = i + 1) { + tempFrame = (this.overlapLength - i) * frameScale; + fi = i * frameScale; + context = 2 * i; + inputOffset = context + inputPosition; + outputOffset = context + outputPosition; + output[outputOffset + 0] = input[inputOffset + 0] * fi + this.midBuffer[context + 0] * tempFrame; + output[outputOffset + 1] = input[inputOffset + 1] * fi + this.midBuffer[context + 1] * tempFrame; + } + } + process() { + let offset; + let temp; + let overlapSkip; + if (this.midBuffer === null) { + if (this._inputBuffer.frameCount < this.overlapLength) { + return; + } + this.midBuffer = new Float32Array(this.overlapLength * 2); + this._inputBuffer.receiveSamples(this.midBuffer, this.overlapLength); + } + while (this._inputBuffer.frameCount >= this.sampleReq) { + offset = this.seekBestOverlapPosition(); + this._outputBuffer.ensureAdditionalCapacity(this.overlapLength); + this.overlap(Math.floor(offset)); + this._outputBuffer.put(this.overlapLength); + temp = this.seekWindowLength - 2 * this.overlapLength; + if (temp > 0) { + this._outputBuffer.putBuffer(this._inputBuffer, offset + this.overlapLength, temp); + } + const start = this._inputBuffer.startIndex + 2 * (offset + this.seekWindowLength - this.overlapLength); + this.midBuffer.set(this._inputBuffer.vector.subarray(start, start + 2 * this.overlapLength)); + this.skipFract += this.nominalSkip; + overlapSkip = Math.floor(this.skipFract); + this.skipFract -= overlapSkip; + this._inputBuffer.receive(overlapSkip); } } } -;// ./src/utils/VideoObserver.js - - - - -const adKeywords = new Set([ - "advertise", - "promo", - "sponsor", - "banner", - "commercial", - "preroll", - "midroll", - "postroll", - "ad-container", - "sponsored", -]); - -const adKeywordsRegex = (() => { - const pattern = Array.from(adKeywords).join("|"); - return new RegExp(pattern, "i"); -})(); +const testFloatEqual = function (a, b) { + return (a > b ? a - b : b - a) > 1e-10; +}; -const filterVideoNodes = (nodes) => { - const result = []; - for (let i = 0; i < nodes.length; i++) { - const node = nodes[i]; - if (node instanceof HTMLVideoElement) { - result.push(node); - } else if (node instanceof HTMLElement) { - const videos = node.querySelectorAll("video"); - for (let j = 0; j < videos.length; j++) { - result.push(videos[j]); +class SoundTouch { + constructor() { + this.transposer = new RateTransposer(false); + this.stretch = new Stretch(false); + this._inputBuffer = new FifoSampleBuffer(); + this._intermediateBuffer = new FifoSampleBuffer(); + this._outputBuffer = new FifoSampleBuffer(); + this._rate = 0; + this._tempo = 0; + this.virtualPitch = 1.0; + this.virtualRate = 1.0; + this.virtualTempo = 1.0; + this.calculateEffectiveRateAndTempo(); + } + clear() { + this.transposer.clear(); + this.stretch.clear(); + } + clone() { + const result = new SoundTouch(); + result.rate = this.rate; + result.tempo = this.tempo; + return result; + } + get rate() { + return this._rate; + } + set rate(rate) { + this.virtualRate = rate; + this.calculateEffectiveRateAndTempo(); + } + set rateChange(rateChange) { + this._rate = 1.0 + 0.01 * rateChange; + } + get tempo() { + return this._tempo; + } + set tempo(tempo) { + this.virtualTempo = tempo; + this.calculateEffectiveRateAndTempo(); + } + set tempoChange(tempoChange) { + this.tempo = 1.0 + 0.01 * tempoChange; + } + set pitch(pitch) { + this.virtualPitch = pitch; + this.calculateEffectiveRateAndTempo(); + } + set pitchOctaves(pitchOctaves) { + this.pitch = Math.exp(0.69314718056 * pitchOctaves); + this.calculateEffectiveRateAndTempo(); + } + set pitchSemitones(pitchSemitones) { + this.pitchOctaves = pitchSemitones / 12.0; + } + get inputBuffer() { + return this._inputBuffer; + } + get outputBuffer() { + return this._outputBuffer; + } + calculateEffectiveRateAndTempo() { + const previousTempo = this._tempo; + const previousRate = this._rate; + this._tempo = this.virtualTempo / this.virtualPitch; + this._rate = this.virtualRate * this.virtualPitch; + if (testFloatEqual(this._tempo, previousTempo)) { + this.stretch.tempo = this._tempo; + } + if (testFloatEqual(this._rate, previousRate)) { + this.transposer.rate = this._rate; + } + if (this._rate > 1.0) { + if (this._outputBuffer != this.transposer.outputBuffer) { + this.stretch.inputBuffer = this._inputBuffer; + this.stretch.outputBuffer = this._intermediateBuffer; + this.transposer.inputBuffer = this._intermediateBuffer; + this.transposer.outputBuffer = this._outputBuffer; } - } else if (node.shadowRoot) { - const shadowVideos = node.shadowRoot.querySelectorAll("video"); - for (let k = 0; k < shadowVideos.length; k++) { - result.push(shadowVideos[k]); + } else { + if (this._outputBuffer != this.stretch.outputBuffer) { + this.transposer.inputBuffer = this._inputBuffer; + this.transposer.outputBuffer = this._intermediateBuffer; + this.stretch.inputBuffer = this._intermediateBuffer; + this.stretch.outputBuffer = this._outputBuffer; } } } - return result; -}; - -const isAdVideo = (video) => { - if ( - adKeywordsRegex.test(video.className) || - adKeywordsRegex.test(video.title) - ) - return true; + process() { + if (this._rate > 1.0) { + this.stretch.process(); + this.transposer.process(); + } else { + this.transposer.process(); + this.stretch.process(); + } + } +} - let parent = video.parentElement; - while (parent) { - if ( - adKeywordsRegex.test(parent.className) || - adKeywordsRegex.test(parent.id) - ) - return true; - parent = parent.parentElement; +class WebAudioBufferSource { + constructor(buffer) { + this.buffer = buffer; + this._position = 0; + } + get dualChannel() { + return this.buffer.numberOfChannels > 1; + } + get position() { + return this._position; + } + set position(value) { + this._position = value; } + extract(target, numFrames = 0, position = 0) { + this.position = position; + let left = this.buffer.getChannelData(0); + let right = this.dualChannel ? this.buffer.getChannelData(1) : this.buffer.getChannelData(0); + let i = 0; + for (; i < numFrames; i++) { + target[i * 2] = left[i + position]; + target[i * 2 + 1] = right[i + position]; + } + return Math.min(numFrames, left.length - position); + } +} - return false; +const getWebAudioNode = function (context, filter, sourcePositionCallback = noop, bufferSize = 4096) { + const node = context.createScriptProcessor(bufferSize, 2, 2); + const samples = new Float32Array(bufferSize * 2); + node.onaudioprocess = event => { + let left = event.outputBuffer.getChannelData(0); + let right = event.outputBuffer.getChannelData(1); + let framesExtracted = filter.extract(samples, bufferSize); + sourcePositionCallback(filter.sourcePosition); + if (framesExtracted === 0) { + filter.onEnd(); + } + let i = 0; + for (; i < framesExtracted; i++) { + left[i] = samples[i * 2]; + right[i] = samples[i * 2 + 1]; + } + }; + return node; }; -const isMutedVideo = (video) => { - return ( - video.hasAttribute("muted") && - !video.classList.contains("vjs-tech") && - !video.preload - ); +const pad = function (n, width, z) { + z = z || '0'; + n = n + ''; + return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; +}; +const minsSecs = function (secs) { + const mins = Math.floor(secs / 60); + const seconds = secs - mins * 60; + return `${mins}:${pad(parseInt(seconds), 2)}`; }; -const isVideoReady = (video) => video.readyState >= 3; - -const waitForVideoReady = (video, callback) => { - const checkVideoState = () => { - if (isVideoReady(video)) { - callback(video); - } else { - requestAnimationFrame(checkVideoState); +const onUpdate = function (sourcePosition) { + const currentTimePlayed = this.timePlayed; + const sampleRate = this.sampleRate; + this.sourcePosition = sourcePosition; + this.timePlayed = sourcePosition / sampleRate; + if (currentTimePlayed !== this.timePlayed) { + const timePlayed = new CustomEvent('play', { + detail: { + timePlayed: this.timePlayed, + formattedTimePlayed: this.formattedTimePlayed, + percentagePlayed: this.percentagePlayed + } + }); + this._node.dispatchEvent(timePlayed); + } +}; +class PitchShifter { + constructor(context, buffer, bufferSize, onEnd = noop) { + this._soundtouch = new SoundTouch(); + const source = new WebAudioBufferSource(buffer); + this.timePlayed = 0; + this.sourcePosition = 0; + this._filter = new SimpleFilter(source, this._soundtouch, onEnd); + this._node = getWebAudioNode(context, this._filter, sourcePostion => onUpdate.call(this, sourcePostion), bufferSize); + this.tempo = 1; + this.rate = 1; + this.duration = buffer.duration; + this.sampleRate = context.sampleRate; + this.listeners = []; + } + get formattedDuration() { + return minsSecs(this.duration); + } + get formattedTimePlayed() { + return minsSecs(this.timePlayed); + } + get percentagePlayed() { + return 100 * this._filter.sourcePosition / (this.duration * this.sampleRate); + } + set percentagePlayed(perc) { + this._filter.sourcePosition = parseInt(perc * this.duration * this.sampleRate); + this.sourcePosition = this._filter.sourcePosition; + this.timePlayed = this.sourcePosition / this.sampleRate; + } + get node() { + return this._node; + } + set pitch(pitch) { + this._soundtouch.pitch = pitch; + } + set pitchSemitones(semitone) { + this._soundtouch.pitchSemitones = semitone; + } + set rate(rate) { + this._soundtouch.rate = rate; + } + set tempo(tempo) { + this._soundtouch.tempo = tempo; + } + connect(toNode) { + this._node.connect(toNode); + } + disconnect() { + this._node.disconnect(); + } + on(eventName, cb) { + this.listeners.push({ + name: eventName, + cb: cb + }); + this._node.addEventListener(eventName, event => cb(event.detail)); + } + off(eventName = null) { + let listeners = this.listeners; + if (eventName) { + listeners = listeners.filter(e => e.name === eventName); } - }; + listeners.forEach(e => { + this._node.removeEventListener(e.name, event => e.cb(event.detail)); + }); + } +} - checkVideoState(); -}; -class VideoObserver { - constructor() { - this.videoCache = new Set(); - this.onVideoAdded = new EventImpl(); - this.onVideoRemoved = new EventImpl(); +//# sourceMappingURL=soundtouch.js.map - this.observer = new MutationObserver(this.handleMutations); - this.intersectionObserver = new IntersectionObserver( - this.handleIntersections, - { threshold: 0.1 }, - ); - } +;// ./node_modules/chaimu/dist/debug.js - handleMutations = (mutationsList) => { - window.requestIdleCallback( - () => { - for (let i = 0; i < mutationsList.length; i++) { - const mutation = mutationsList[i]; - if (mutation.type !== "childList") continue; +/* harmony default export */ const dist_debug = ({ + log: (...text) => { + if (!dist_config.debug) { + return; + } + return console.log(`%c✦ chaimu.js v${dist_config.version} ✦`, "background: #000; color: #fff; padding: 0 8px", ...text); + }, +}); - const addedVideos = filterVideoNodes(mutation.addedNodes); - for (let j = 0; j < addedVideos.length; j++) { - this.checkAndHandleVideo(addedVideos[j]); - } +;// ./node_modules/chaimu/dist/player.js - const removedVideos = filterVideoNodes(mutation.removedNodes); - for (let k = 0; k < removedVideos.length; k++) { - this.handleVideoRemoved(removedVideos[k]); - } - } - }, - { timeout: 1000 }, - ); - }; - handleIntersections = (entries) => { - for (let i = 0; i < entries.length; i++) { - const entry = entries[i]; - if (entry.isIntersecting) { - this.handleIntersectingVideo(entry.target); - } + +const videoLipSyncEvents = [ + "playing", + "ratechange", + "play", + "waiting", + "pause", + "seeked", +]; +function initAudioContext() { + const audioContext = window.AudioContext || window.webkitAudioContext; + return audioContext ? new audioContext() : undefined; +} +class BasePlayer { + static name = "BasePlayer"; + chaimu; + _src; + fetch; + constructor(chaimu, src) { + this.chaimu = chaimu; + this._src = src; + this.fetch = dist_config.fetchFn; + } + async init() { + return new Promise((resolve) => { + return resolve(this); + }); + } + clear() { + return new Promise((resolve) => { + return resolve(this); + }); + } + lipSync(mode = false) { + return this; + } + handleVideoEvent = (event) => { + dist_debug.log(`handle video ${event.type}`); + this.lipSync(event.type); + return this; + }; + removeVideoEvents() { + for (const e of videoLipSyncEvents) { + this.chaimu.video.removeEventListener(e, this.handleVideoEvent); + } + return this; + } + addVideoEvents() { + for (const e of videoLipSyncEvents) { + this.chaimu.video.addEventListener(e, this.handleVideoEvent); + } + return this; + } + async play() { + return new Promise((resolve) => { + return resolve(this); + }); + } + async pause() { + return new Promise((resolve) => { + return resolve(this); + }); + } + get name() { + return this.constructor.name; + } + set src(url) { + this._src = url; + } + get src() { + return this._src; + } + get currentSrc() { + return this._src; + } + set volume(value) { + return; + } + get volume() { + return 0; + } + get playbackRate() { + return 0; + } + set playbackRate(value) { + return; + } + get currentTime() { + return 0; + } +} +class AudioPlayer extends BasePlayer { + static name = "AudioPlayer"; + audio; + gainNode; + audioSource; + constructor(chaimu, src) { + super(chaimu, src); + this.audio = new Audio(src); + this.audio.crossOrigin = "anonymous"; + } + initAudioBooster() { + if (!this.chaimu.audioContext) { + return this; + } + if (this.gainNode && this.audioSource) { + this.audioSource.disconnect(this.gainNode); + this.gainNode.disconnect(); + } + this.gainNode = this.chaimu.audioContext.createGain(); + this.gainNode.connect(this.chaimu.audioContext.destination); + this.audioSource = this.chaimu.audioContext.createMediaElementSource(this.audio); + this.audioSource.connect(this.gainNode); + return this; + } + async init() { + return new Promise((resolve) => { + this.initAudioBooster(); + return resolve(this); + }); + } + audioErrorHandle = (e) => { + console.error("[AudioPlayer]", e); + }; + lipSync(mode = false) { + dist_debug.log("[AudioPlayer] lipsync video", this.chaimu.video); + if (!this.chaimu.video) { + return this; + } + this.audio.currentTime = this.chaimu.video.currentTime; + this.audio.playbackRate = this.chaimu.video.playbackRate; + if (!mode) { + dist_debug.log("[AudioPlayer] lipsync mode isn't set"); + return this; + } + dist_debug.log(`[AudioPlayer] lipsync mode is ${mode}`); + switch (mode) { + case "play": + case "playing": + case "seeked": { + if (!this.chaimu.video.paused) { + this.syncPlay(); + } + return this; + } + case "pause": + case "waiting": { + void this.pause(); + return this; + } + default: { + return this; + } + } + } + async clear() { + return new Promise((resolve) => { + this.audio.pause(); + this.audio.src = ""; + this.audio.removeAttribute("src"); + return resolve(this); + }); + } + syncPlay() { + dist_debug.log("[AudioPlayer] sync play called"); + this.audio.play().catch(this.audioErrorHandle); + return this; + } + async play() { + dist_debug.log("[AudioPlayer] play called"); + await this.audio.play().catch(this.audioErrorHandle); + return this; + } + async pause() { + return new Promise((resolve) => { + dist_debug.log("[AudioPlayer] pause called"); + this.audio.pause(); + return resolve(this); + }); + } + set src(url) { + this._src = url; + if (!url) { + void this.clear(); + return; + } + this.audio.src = url; + } + get src() { + return this._src; + } + get currentSrc() { + return this.audio.currentSrc; + } + set volume(value) { + if (this.gainNode) { + this.gainNode.gain.value = value; + return; + } + this.audio.volume = value; + } + get volume() { + return this.gainNode ? this.gainNode.gain.value : this.audio.volume; + } + get playbackRate() { + return this.audio.playbackRate; + } + set playbackRate(value) { + this.audio.playbackRate = value; + } + get currentTime() { + return this.audio.currentTime; + } +} +class ChaimuPlayer extends BasePlayer { + static name = "ChaimuPlayer"; + audioBuffer; + sourceNode; + gainNode; + audioShifter; + cleanerRunned = false; + async fetchAudio() { + if (!this._src) { + throw new Error("No audio source provided"); + } + if (!this.chaimu.audioContext) { + throw new Error("No audio context available"); + } + dist_debug.log(`[ChaimuPlayer] Fetching audio from ${this._src}...`); + try { + const res = await this.fetch(this._src); + dist_debug.log(`[ChaimuPlayer] Decoding fetched audio...`); + const data = await res.arrayBuffer(); + this.audioBuffer = await this.chaimu.audioContext.decodeAudioData(data); + } + catch (err) { + throw new Error(`Failed to fetch audio file, because ${err.message}`); + } + return this; + } + initAudioBooster() { + if (!this.chaimu.audioContext) { + return this; + } + if (this.gainNode) { + this.gainNode.disconnect(); + } + this.gainNode = this.chaimu.audioContext.createGain(); + return this; + } + async init() { + await this.fetchAudio(); + this.initAudioBooster(); + return this; + } + lipSync(mode = false) { + dist_debug.log("[ChaimuPlayer] lipsync video", this.chaimu.video, this); + if (!this.chaimu.video) { + return this; + } + if (!mode) { + dist_debug.log("[ChaimuPlayer] lipsync mode isn't set"); + return this; + } + dist_debug.log(`[ChaimuPlayer] lipsync mode is ${mode}`); + switch (mode) { + case "play": + case "playing": + case "ratechange": + case "seeked": { + if (!this.chaimu.video.paused) { + void this.start(); + } + return this; + } + case "pause": + case "waiting": { + void this.pause(); + return this; + } + default: { + return this; + } + } + } + async reopenCtx() { + if (!this.chaimu.audioContext) { + throw new Error("No audio context available"); + } + try { + await this.chaimu.audioContext.close(); + } + catch { + } + return this; + } + async clear() { + if (!this.chaimu.audioContext) { + throw new Error("No audio context available"); + } + dist_debug.log("clear audio context"); + this.cleanerRunned = true; + await this.pause(); + if (!this.gainNode) { + this.cleanerRunned = false; + return this; + } + if (this.sourceNode) { + this.sourceNode.stop(); + this.sourceNode.disconnect(this.gainNode); + this.sourceNode = undefined; + } + if (this.audioShifter) { + this.audioShifter._node.disconnect(this.gainNode); + this.audioShifter = undefined; + } + this.gainNode.disconnect(); + const oldVolume = this.volume; + this.gainNode = undefined; + await this.reopenCtx(); + this.chaimu.audioContext = initAudioContext(); + this.initAudioBooster(); + this.volume = oldVolume; + this.cleanerRunned = false; + return this; + } + async start() { + if (!this.chaimu.audioContext) { + throw new Error("No audio context available"); + } + if (!this.audioBuffer) { + throw new Error("The player isn't initialized"); + } + if (!this.gainNode || + (this.audioShifter && this.audioShifter.duration < this.chaimu.video.currentTime)) { + dist_debug.log("Skip starting player"); + return this; + } + if (this.cleanerRunned) { + dist_debug.log("The other cleaner is still running, waiting..."); + return this; + } + dist_debug.log("starting audio"); + await this.clear(); + await this.play(); + this.audioShifter = new PitchShifter(this.chaimu.audioContext, this.audioBuffer, 1024); + this.audioShifter.tempo = this.chaimu.video.playbackRate; + this.audioShifter.percentagePlayed = this.chaimu.video.currentTime / this.audioShifter.duration; + this.sourceNode = this.chaimu.audioContext.createBufferSource(); + this.sourceNode.buffer = null; + this.sourceNode.connect(this.gainNode); + this.audioShifter.connect(this.gainNode); + this.gainNode.connect(this.chaimu.audioContext.destination); + this.sourceNode.start(undefined, this.chaimu.video.currentTime); + return this; + } + async pause() { + if (!this.chaimu.audioContext) { + throw new Error("No audio context available"); + } + if (this.chaimu.audioContext.state !== "running") { + return this; + } + await this.chaimu.audioContext.suspend(); + return this; + } + async play() { + if (!this.chaimu.audioContext) { + throw new Error("No audio context available"); + } + await this.chaimu.audioContext.resume(); + return this; } - }; - - enable() { - this.observer.observe(document, { childList: true, subtree: true }); - const videos = this.getAllVideoEls(); - for (let i = 0; i < videos.length; i++) { - this.checkAndHandleVideo(videos[i]); + set src(url) { + this._src = url; } - } - - disable() { - this.observer.disconnect(); - this.intersectionObserver.disconnect(); - } + get src() { + return this._src; + } + get currentSrc() { + return this._src; + } + set volume(value) { + if (this.gainNode) { + this.gainNode.gain.value = value; + } + } + get volume() { + return this.gainNode ? this.gainNode.gain.value : 0; + } + set playbackRate(value) { + if (!this.audioShifter) { + throw new Error("No audio source available"); + } + this.audioShifter.pitch = value; + } + get playbackRate() { + return this.audioShifter?._soundtouch?.tempo ?? 0; + } + get currentTime() { + return this.chaimu.video.currentTime; + } +} - getAllVideoEls() { - const videos = document.querySelectorAll("video"); - if (videos.length) return Array.from(videos); +;// ./node_modules/chaimu/dist/client.js - // Use it only if we don't find videos - // It takes a long time to complete - const videoElements = new Set(); - const traverseShadowRoot = (root) => { - if (!root) return; - const shadowVideos = root.querySelectorAll("video"); - for (let i = 0; i < shadowVideos.length; i++) { - videoElements.add(shadowVideos[i]); - } - const shadowElements = root.querySelectorAll("*"); - for (let i = 0; i < shadowElements.length; i++) { - if (shadowElements[i].shadowRoot) - traverseShadowRoot(shadowElements[i].shadowRoot); - } - }; - const allElements = document.querySelectorAll("*"); - for (let i = 0; i < allElements.length; i++) { - if (allElements[i].shadowRoot) - traverseShadowRoot(allElements[i].shadowRoot); +class Chaimu { + _debug = false; + audioContext; + player; + video; + constructor({ url, video, debug = false, fetchFn = dist_config.fetchFn, preferAudio = false, }) { + this._debug = dist_config.debug = debug; + dist_config.fetchFn = fetchFn; + this.audioContext = initAudioContext(); + this.player = + this.audioContext && !preferAudio ? new ChaimuPlayer(this, url) : new AudioPlayer(this, url); + this.video = video; } + async init() { + await this.player.init(); + if (this.video && !this.video.paused) { + this.player.lipSync("play"); + } + this.player.addVideoEvents(); + } + set debug(value) { + this._debug = dist_config.debug = value; + } + get debug() { + return this._debug; + } +} - return Array.from(videoElements); - } - - checkAndHandleVideo = (video) => { - if (this.videoCache.has(video)) return; - this.videoCache.add(video); - this.intersectionObserver.observe(video); - }; +;// ./node_modules/chaimu/dist/index.js - handleIntersectingVideo = (video) => { - this.intersectionObserver.unobserve(video); - if (isAdVideo(video) || isMutedVideo(video)) { - utils_debug.log("The promotional/muted video was ignored", video); - return; - } - waitForVideoReady(video, this.handleVideoAdded); - }; - handleVideoAdded = (video) => { - this.onVideoAdded.dispatch(video); - }; - handleVideoRemoved = (video) => { - if (!document.contains(video)) { - this.videoCache.delete(video); - this.onVideoRemoved.dispatch(video); - } - }; -} ;// ./src/index.js @@ -7039,20 +8930,6 @@ class VideoObserver { const browserInfo = es5.getParser(window.navigator.userAgent).getResult(); -const cfOnlyExtensions = [ - "Violentmonkey", - "FireMonkey", - "Greasemonkey", - "AdGuard", - "OrangeMonkey", -]; -const videoLipSyncEvents = [ - "playing", - "ratechange", - "play", - "waiting", - "pause", -]; function genOptionsByOBJ(obj, conditionString) { return obj.map((code) => ({ @@ -7070,20 +8947,48 @@ const createHotkeyText = (hotkey) => : localizationProvider.get("VOTCreateTranslationHotkey"); class VideoHandler { - // translate properties - translateFromLang = "en"; // default language of video - translateToLang = lang; // default language of audio response + /** + * default language of video + * + * @type {import("./index").VideoHandler['translateFromLang']} + */ + translateFromLang = "en"; + + /** + * default language of audio response + * + * @type {import("./index").VideoHandler['translateToLang']} + */ + translateToLang = lang; + /** + * @type {import("./index").VideoHandler['timer']} + */ timer; + /** + * @type {import("./index").VideoHandler['videoData']} + */ videoData = ""; + + /** + * @type {import("./index").VideoHandler['firstPlay']} + */ firstPlay = true; - audio = new Audio(); + + /** + * @type {import("./index").VideoHandler['audioContext']} + */ audioContext = initAudioContext(); hls = initHls(); // debug enabled only in dev mode votClient; + /** + * @type {import("chaimu").default} + */ + audioPlayer; + videoTranslations = []; videoTranslationTTL = 7200; cachedTranslation; @@ -7101,7 +9006,11 @@ class VideoHandler { subtitlesList = []; subtitlesListVideoId = null; - // button move + /** + * button move + * + * @type {import("./index").VideoHandler['dragging']} + */ dragging; /** @@ -7112,7 +9021,7 @@ class VideoHandler { * @param {Object} site - The site object associated with the video. */ constructor(video, container, site) { - utils_debug.log( + debug.log( "[VideoHandler] add video:", video, "container:", @@ -7141,7 +9050,7 @@ class VideoHandler { translationHelp = null, ) { clearTimeout(this.autoRetry); - utils_debug.log( + debug.log( videoData, `Translate video (requestLang: ${requestLang}, responseLang: ${responseLang})`, ); @@ -7157,9 +9066,9 @@ class VideoHandler { responseLang, translationHelp, }); - utils_debug.log("Translate video result", res); + debug.log("Translate video result", res); if (res.translated && res.remainingTime < 1) { - utils_debug.log("Video translation finished with this data: ", res); + debug.log("Video translation finished with this data: ", res); return res; } @@ -7205,7 +9114,7 @@ class VideoHandler { */ async translateStreamImpl(videoData, requestLang, responseLang) { clearTimeout(this.autoRetry); - utils_debug.log( + debug.log( videoData, `Translate stream (requestLang: ${requestLang}, responseLang: ${responseLang})`, ); @@ -7220,7 +9129,7 @@ class VideoHandler { requestLang, responseLang, }); - utils_debug.log("Translate stream result", res); + debug.log("Translate stream result", res); if (!res.translated && res.interval === 10) { await this.updateTranslationErrorMsg( localizationProvider.get("translationTakeFewMinutes"), @@ -7240,19 +9149,19 @@ class VideoHandler { } if (res.message) { - utils_debug.log(`Stream translation aborted! Message: ${res.message}`); + debug.log(`Stream translation aborted! Message: ${res.message}`); throw new VOTLocalizedError("streamNoConnectionToServer"); } if (!res.result) { - utils_debug.log("Failed to find translation result! Data:", res); + debug.log("Failed to find translation result! Data:", res); throw new VOTLocalizedError("audioNotReceived"); } - utils_debug.log("Stream translated successfully. Running...", res); + debug.log("Stream translated successfully. Running...", res); this.streamPing = setInterval(async () => { - utils_debug.log("Ping stream translation", res.pingId); + debug.log("Ping stream translation", res.pingId); this.votClient.pingStream({ pingId: res.pingId, }); @@ -7287,6 +9196,40 @@ class VideoHandler { } } + getPreferAudio() { + if (!this.audioContext) { + return true; + } + + if (!this.data.newAudioPlayer) { + return true; + } + + if (this.videoData.isStream) { + // streams use old player for work with hls + return true; + } + + if (this.data.newAudioPlayer && !this.data.onlyBypassMediaCSP) { + return false; + } + + return !this.site.needBypassCSP; + } + + createPlayer() { + const preferAudio = this.getPreferAudio(); + debug.log("preferAudio:", preferAudio); + this.audioPlayer = new Chaimu({ + video: this.video, + debug: false, + // debug: true, + fetchFn: GM_fetch, + preferAudio, + }); + return this; + } + /** * Initializes the VideoHandler class by setting up data promises, fetching data, initializing UI elements, and setting up event listeners. */ @@ -7311,8 +9254,12 @@ class VideoHandler { responseLanguage: votStorage.get("responseLanguage", lang), defaultVolume: votStorage.get("defaultVolume", 100), audioProxy: votStorage.get("audioProxy", 0), - bypassMediaCSP: votStorage.get( - "bypassMediaCSP", + onlyBypassMediaCSP: votStorage.get( + "onlyBypassMediaCSP", + Number(!!this.audioContext), + ), + newAudioPlayer: votStorage.get( + "newAudioPlayer", Number(!!this.audioContext), ), showPiPButton: votStorage.get("showPiPButton", 0), @@ -7364,14 +9311,14 @@ class VideoHandler { if ( !this.data.translateProxyEnabled && GM_info?.scriptHandler && - cfOnlyExtensions.includes(GM_info.scriptHandler) + proxyOnlyExtensions.includes(GM_info.scriptHandler) ) { this.data.translateProxyEnabled = 1; await votStorage.set("translateProxyEnabled", 1); - utils_debug.log("translateProxyEnabled", this.data.translateProxyEnabled); + debug.log("translateProxyEnabled", this.data.translateProxyEnabled); } - utils_debug.log("Extension compatibility passed..."); + debug.log("Extension compatibility passed..."); this.votOpts = { headers: this.data.translateProxyEnabled @@ -7411,9 +9358,9 @@ class VideoHandler { this.initUI(); this.initUIEvents(); - this.initAudioBooster(); this.videoData = await this.getVideoData(); + this.createPlayer(); this.setSelectMenuValues( this.videoData.detectedLanguage, this.data.responseLanguage ?? "ru", @@ -7430,8 +9377,7 @@ class VideoHandler { /** * Set translation button status and text * - * @param {"none"|"success"|"error"} status - button status - * @param {string} text - visible button text + * @type {import('./index').VideoHandler['transformBtn']} */ transformBtn(status, text) { this.votButton.container.dataset.status = status; @@ -7441,25 +9387,17 @@ class VideoHandler { this.setLoadingBtn(isLoading); this.votButton.label.textContent = text; this.votButton.container.title = status === "error" ? text : ""; + return this; } /** * Set loading icon to translation button * - * @param {boolean} loading + * @type {import('./index').VideoHandler['setLoadingBtn']} */ setLoadingBtn(loading = false) { this.votButton.container.dataset.loading = loading; - } - - initAudioBooster() { - this.audio.crossOrigin = "anonymous"; - if (this.audioContext) { - this.gainNode = this.audioContext.createGain(); - this.gainNode.connect(this.audioContext.destination); - this.audioSource = this.audioContext.createMediaElementSource(this.audio); - this.audioSource.connect(this.gainNode); - } + return this; } initUI() { @@ -7562,7 +9500,7 @@ class VideoHandler { this.videoData.detectedLanguage, ), fromOnSelectCB: async (e) => { - utils_debug.log( + debug.log( "[fromOnSelectCB] select from language", e.target.dataset.votValue, ); @@ -7577,10 +9515,10 @@ class VideoHandler { toItems: genOptionsByOBJ(availableTTS, this.videoData.responseLanguage), toOnSelectCB: async (e) => { const newLang = e.target.dataset.votValue; - utils_debug.log("[toOnSelectCB] select to language", newLang); + debug.log("[toOnSelectCB] select to language", newLang); this.data.responseLanguage = this.translateToLang = newLang; await votStorage.set("responseLanguage", this.data.responseLanguage); - utils_debug.log( + debug.log( "Response Language value changed. New value: ", this.data.responseLanguage, ); @@ -7848,20 +9786,40 @@ class VideoHandler { this.votAudioProxyCheckbox.container, ); - this.votBypassMediaCSPCheckbox = ui.createCheckbox( - localizationProvider.get("VOTBypassMediaCSP") + + this.votNewAudioPlayerCheckbox = ui.createCheckbox( + localizationProvider.get("VOTNewAudioPlayer"), + this.data?.newAudioPlayer ?? false, + ); + if (!this.audioContext) { + this.votNewAudioPlayerCheckbox.input.disabled = true; + this.votNewAudioPlayerCheckbox.container.title = + localizationProvider.get("VOTNeedWebAudioAPI"); + } + this.votSettingsDialog.bodyContainer.appendChild( + this.votNewAudioPlayerCheckbox.container, + ); + + this.votOnlyBypassMediaCSPCheckbox = ui.createCheckbox( + localizationProvider.get("VOTOnlyBypassMediaCSP") + (this.site.needBypassCSP ? ` (${localizationProvider.get("VOTMediaCSPEnabledOnSite")})` : ""), - this.data?.bypassMediaCSP ?? false, + this.data?.onlyBypassMediaCSP ?? false, + ); + this.votOnlyBypassMediaCSPCheckbox.container.classList.add( + "vot-checkbox-sub", ); if (!this.audioContext) { - this.votBypassMediaCSPCheckbox.input.disabled = true; - this.votBypassMediaCSPCheckbox.container.title = + this.votOnlyBypassMediaCSPCheckbox.container.title = localizationProvider.get("VOTNeedWebAudioAPI"); } + this.votOnlyBypassMediaCSPCheckbox.input.disabled = + !this.data.newAudioPlayer && this.audioContext; + if (!this.data.newAudioPlayer) { + this.votOnlyBypassMediaCSPCheckbox.container.hidden = true; + } this.votSettingsDialog.bodyContainer.appendChild( - this.votBypassMediaCSPCheckbox.container, + this.votOnlyBypassMediaCSPCheckbox.container, ); // ABOUT @@ -7964,20 +9922,28 @@ class VideoHandler { } async handleTranslationBtnClick() { - if (this.audio.src || this.playSound) { - utils_debug.log("[click translationBtn] audio.src is not empty"); + debug.log( + "[click translationBtn]", + this.audioPlayer, + this.audioPlayer.player, + ); + if (this.audioPlayer.player.src) { + debug.log( + "[click translationBtn] audio.src is not empty", + this.audioPlayer.player.src, + ); this.stopTranslate(); return; } if (this.hls.url) { - utils_debug.log("[click translationBtn] hls is not empty"); + debug.log("[click translationBtn] hls is not empty", this.hls.url); this.stopTranslate(); return; } try { - utils_debug.log("[click translationBtn] trying execute translation"); + debug.log("[click translationBtn] trying execute translation"); if (!this.videoData.videoId) { throw new VOTLocalizedError("VOTNoVideoIDFound"); @@ -8118,9 +10084,7 @@ class VideoHandler { this.votSettingsDialog.container.hidden = !this.votSettingsDialog.container.hidden; if (document.fullscreenElement || document.webkitFullscreenElement) { - // eslint-disable-next-line sonarjs/no-unused-expressions document.webkitExitFullscreen && document.webkitExitFullscreen(); - // eslint-disable-next-line sonarjs/no-unused-expressions document.exitFullscreen && document.exitFullscreen(); } }); @@ -8145,7 +10109,7 @@ class VideoHandler { this.votVideoTranslationVolumeSlider.label.querySelector( "strong", ).textContent = `${this.data.defaultVolume}%`; - this.setAudioVolume(this.data.defaultVolume / 100); + this.audioPlayer.player.volume = this.data.defaultVolume / 100; if (!this.data.syncVolume) { return; } @@ -8172,7 +10136,7 @@ class VideoHandler { votStorage.set("autoTranslate", this.data.autoTranslate), this.autoTranslate(), ]); - utils_debug.log( + debug.log( "autoTranslate value changed. New value: ", this.data.autoTranslate, ); @@ -8188,7 +10152,7 @@ class VideoHandler { "dontTranslateYourLang", this.data.dontTranslateYourLang, ); - utils_debug.log( + debug.log( "dontTranslateYourLang value changed. New value: ", this.data.dontTranslateYourLang, ); @@ -8221,7 +10185,7 @@ class VideoHandler { "autoSetVolumeYandexStyle", this.data.autoSetVolumeYandexStyle, ); - utils_debug.log( + debug.log( "autoSetVolumeYandexStyle value changed. New value: ", this.data.autoSetVolumeYandexStyle, ); @@ -8243,7 +10207,7 @@ class VideoHandler { (async () => { this.data.showVideoSlider = Number(e.target.checked); await votStorage.set("showVideoSlider", this.data.showVideoSlider); - utils_debug.log( + debug.log( "showVideoSlider value changed. New value: ", this.data.showVideoSlider, ); @@ -8257,7 +10221,7 @@ class VideoHandler { (async () => { this.data.audioBooster = Number(e.target.checked); await votStorage.set("audioBooster", this.data.audioBooster); - utils_debug.log( + debug.log( "audioBooster value changed. New value: ", this.data.audioBooster, ); @@ -8282,7 +10246,7 @@ class VideoHandler { (async () => { this.data.syncVolume = Number(e.target.checked); await votStorage.set("syncVolume", this.data.syncVolume); - utils_debug.log( + debug.log( "syncVolume value changed. New value: ", this.data.syncVolume, ); @@ -8293,7 +10257,7 @@ class VideoHandler { (async () => { this.data.downloadWithName = Number(e.target.checked); await votStorage.set("downloadWithName", this.data.downloadWithName); - utils_debug.log( + debug.log( "downloadWithName value changed. New value: ", this.data.downloadWithName, ); @@ -8309,7 +10273,7 @@ class VideoHandler { "translateAPIErrors", this.data.translateAPIErrors, ); - utils_debug.log( + debug.log( "translateAPIErrors value changed. New value: ", this.data.translateAPIErrors, ); @@ -8401,7 +10365,7 @@ class VideoHandler { (async () => { this.data.highlightWords = Number(e.target.checked); await votStorage.set("highlightWords", this.data.highlightWords); - utils_debug.log( + debug.log( "highlightWords value changed. New value: ", this.data.highlightWords, ); @@ -8464,7 +10428,7 @@ class VideoHandler { (async () => { this.data.showPiPButton = Number(e.target.checked); await votStorage.set("showPiPButton", this.data.showPiPButton); - utils_debug.log( + debug.log( "showPiPButton value changed. New value: ", this.data.showPiPButton, ); @@ -8481,7 +10445,7 @@ class VideoHandler { (async () => { this.data.m3u8ProxyHost = e.target.value || m3u8ProxyHost; await votStorage.set("m3u8ProxyHost", this.data.m3u8ProxyHost); - utils_debug.log( + debug.log( "m3u8ProxyHost value changed. New value: ", this.data.m3u8ProxyHost, ); @@ -8492,7 +10456,7 @@ class VideoHandler { (async () => { this.data.proxyWorkerHost = e.target.value || proxyWorkerHost; await votStorage.set("proxyWorkerHost", this.data.proxyWorkerHost); - utils_debug.log( + debug.log( "proxyWorkerHost value changed. New value: ", this.data.proxyWorkerHost, ); @@ -8506,22 +10470,46 @@ class VideoHandler { (async () => { this.data.audioProxy = Number(e.target.checked); await votStorage.set("audioProxy", this.data.audioProxy); - utils_debug.log( + debug.log( "audioProxy value changed. New value: ", this.data.audioProxy, ); })(); }); - this.votBypassMediaCSPCheckbox.input.addEventListener("change", (e) => { + this.votOnlyBypassMediaCSPCheckbox.input.addEventListener( + "change", + (e) => { + (async () => { + this.data.onlyBypassMediaCSP = Number(e.target.checked); + await votStorage.set( + "onlyBypassMediaCSP", + this.data.onlyBypassMediaCSP, + ); + debug.log( + "onlyBypassMediaCSP value changed. New value: ", + this.data.onlyBypassMediaCSP, + ); + this.stopTranslate(); + this.createPlayer(); + })(); + }, + ); + + this.votNewAudioPlayerCheckbox.input.addEventListener("change", (e) => { (async () => { - this.data.bypassMediaCSP = Number(e.target.checked); - await votStorage.set("bypassMediaCSP", this.data.bypassMediaCSP); - utils_debug.log( - "bypassMediaCSP value changed. New value: ", - this.data.bypassMediaCSP, + const checked = e.target.checked; + this.data.newAudioPlayer = Number(checked); + await votStorage.set("newAudioPlayer", this.data.newAudioPlayer); + debug.log( + "newAudioPlayer value changed. New value: ", + this.data.newAudioPlayer, ); this.stopTranslate(); + this.createPlayer(); + + this.votOnlyBypassMediaCSPCheckbox.input.disabled = + this.votOnlyBypassMediaCSPCheckbox.container.hidden = !checked; })(); }); @@ -8615,7 +10603,7 @@ class VideoHandler { this.site.additionalData !== "mobile" ) { this.syncVolumeObserver = new MutationObserver((mutations) => { - if (!this.audio.src || !this.data.syncVolume) { + if (!this.audioPlayer.player.src || !this.data.syncVolume) { return; } @@ -8639,7 +10627,7 @@ class VideoHandler { const finalVolume = Math.round(videoVolume); this.data.defaultVolume = finalVolume; - this.setAudioVolume(this.data.defaultVolume / 100); + this.audioPlayer.player.volume = this.data.defaultVolume / 100; this.syncVolumeWrapper("video", finalVolume); } } @@ -8671,7 +10659,7 @@ class VideoHandler { const isSettings = settings.contains(e); const isTempDialog = tempDialog?.contains(e) ?? false; - utils_debug.log( + debug.log( `[document click] ${isButton} ${isMenu} ${isVideo} ${isSettings} ${isTempDialog}`, ); if (!(!isButton && !isMenu && !isSettings && !isTempDialog)) return; @@ -8749,7 +10737,7 @@ class VideoHandler { (await getVideoID(this.site, this.video)) === this.videoData.videoId ) return; - utils_debug.log("lipsync mode is emptied"); + debug.log("lipsync mode is emptied"); this.videoData = ""; this.stopTranslation(); }); @@ -8762,7 +10750,7 @@ class VideoHandler { if (this.site.host === "youtube" && !this.site.additionalData) { addExtraEventListener(document, "yt-page-data-updated", async () => { - utils_debug.log("yt-page-data-updated"); + debug.log("yt-page-data-updated"); // fix #802 if (!window.location.pathname.includes("/shorts/")) { return; @@ -8777,7 +10765,7 @@ class VideoHandler { return; await this.handleSrcChanged(); await this.autoTranslate(); - utils_debug.log("lipsync mode is canplay"); + debug.log("lipsync mode is canplay"); } logout(n) { @@ -8800,7 +10788,7 @@ class VideoHandler { }; async changeSubtitlesLang(subs) { - utils_debug.log("[onchange] subtitles", subs); + debug.log("[onchange] subtitles", subs); this.votSubtitlesSelect.setSelected(subs); if (subs === "disabled") { this.votSubtitlesSelect.setTitle( @@ -8887,7 +10875,7 @@ class VideoHandler { try { this.subtitlesList = await subtitles_getSubtitles(this.votClient, this.videoData); } catch (err) { - utils_debug.log("Error with yandex server, try auto-fix...", err); + debug.log("Error with yandex server, try auto-fix...", err); this.votOpts = { fetchFn: GM_fetch, hostVOT: votBackendUrl, @@ -8906,7 +10894,11 @@ class VideoHandler { await this.updateSubtitlesLangSelect(); } - // Get video volume in 0.00-1.00 format + /** + * Get video volume in 0.00-1.00 format + * + * @type {import('./index').VideoHandler['getVideoVolume']} + */ getVideoVolume() { let videoVolume = this.video?.volume; if (["youtube", "googledrive"].includes(this.site.host)) { @@ -8916,30 +10908,26 @@ class VideoHandler { return videoVolume; } - // Set video volume in 0.00-1.00 format + /** + * Set video volume in 0.00-1.00 format + * + * @type {import('./index').VideoHandler['setVideoVolume']} + */ setVideoVolume(volume) { if (["youtube", "googledrive"].includes(this.site.host)) { const videoVolume = youtubeUtils.setVideoVolume(volume); if (videoVolume) { - return; + return this; } } this.video.volume = volume; + return this; } - getAudioVolume() { - return this.gainNode ? this.gainNode.gain.value : this.audio.volume; - } - - setAudioVolume(volume) { - if (this.gainNode) { - return (this.gainNode.gain.value = volume); - } - - return (this.audio.volume = volume); - } - + /** + * @type {import('./index').VideoHandler['isMuted']} + */ isMuted() { return ["youtube", "googledrive"].includes(this.site.host) ? youtubeUtils.isMuted() @@ -8991,7 +10979,7 @@ class VideoHandler { const currentSliderValue = Number(slider.input.value); const finalValue = syncVolume( - fromType === "translation" ? this.video : this.audio, + fromType === "translation" ? this.video : this.audioPlayer.player, newVolume, currentSliderValue, fromType === "translation" ? this.tempVolume : this.tempOriginalVolume, @@ -9065,7 +11053,7 @@ class VideoHandler { "dailymotion", "trovo", "yandexdisk", - "coursehunter", + "coursehunterLike", "archive", "nineanimetv", "directlink", @@ -9078,7 +11066,7 @@ class VideoHandler { videoValidator() { if (["youtube", "ok.ru", "vk"].includes(this.site.host)) { - utils_debug.log("VideoValidator videoData: ", this.videoData); + debug.log("VideoValidator videoData: ", this.videoData); if ( this.data.dontTranslateYourLang === 1 && this.videoData.detectedLanguage === this.data.dontTranslateLanguage @@ -9094,156 +11082,22 @@ class VideoHandler { return true; } - /** - * Synchronizes the lip sync of the video and audio context. - * - * @param {boolean|string} [mode=false] - The lip sync mode. - * @return {void} - */ - lipsyncAudioContext(mode = false) { - if (this.playSound) { - this.playSound.playbackRate.value = this.video.playbackRate; - } - - if (!mode) { - utils_debug.log("lipsync mode is not set"); - return; - } - - if (mode == "play") { - utils_debug.log("lipsync mode is play"); - try { - this.playSound.start(0, this.audio.currentTime); - } catch { - /* empty */ - } - return; - } - - // video is inactive - if (["pause", "stop", "waiting"].includes(mode)) { - utils_debug.log(`lipsync mode is ${mode}`); - try { - this.playSound.stop(); - } catch { - /* empty */ - } - - this.playSound = this.audioContext.createBufferSource(); - this.playSound.buffer = this.audioBuffer; - this.playSound.connect(this.gainNode); - return; - } - - if (mode == "playing") { - utils_debug.log("lipsync mode is playing"); - try { - this.playSound.start(0, this.audio.currentTime); - } catch { - /* empty */ - } - } - } - - /** - * Synchronizes the lip sync of the video and audio element. - * - * @param {boolean|string} [mode=false] - The lip sync mode. - * @return {void} - */ - lipsyncAudio(mode = false) { - if (!mode) { - utils_debug.log("lipsync mode is not set"); - return; - } - - if (mode == "play") { - utils_debug.log("lipsync mode is play"); - const audioPromise = this.audio.play(); - if (audioPromise !== undefined) { - audioPromise.catch(async (e) => { - console.error("[VOT]", e); - if (e.name === "NotAllowedError") { - this.transformBtn( - "error", - localizationProvider.get("grantPermissionToAutoPlay"), - ); - throw new VOTLocalizedError("grantPermissionToAutoPlay"); - } else if (e.name === "NotSupportedError") { - this.data.audioProxy = 1; - await votStorage.set("audioProxy", 1); - } - }); - } - return; - } - - // video is inactive - if (["pause", "stop", "waiting"].includes(mode)) { - utils_debug.log(`lipsync mode is ${mode}`); - this.audio.pause(); - return; - } - - if (mode == "playing") { - utils_debug.log("lipsync mode is playing"); - this.audio.play(); - } - } - - /** - * Synchronizes the lip sync of the video and audio elements. - * - * @param {boolean|string} [mode=false] - The lip sync mode. - * @return {void} - */ - lipSync(mode = false) { - utils_debug.log("lipsync video", this.video); - if (!this.video) { - return; - } - this.audio.currentTime = this.video.currentTime; - this.audio.playbackRate = this.video.playbackRate; - - return this.needBypassCSP() - ? this.lipsyncAudioContext(mode) - : this.lipsyncAudio(mode); - } - - // Define a function to handle common events - handleVideoEvent = (event) => { - utils_debug.log(`video ${event.type}`); - this.lipSync(event.type); - }; - - needBypassCSP = () => this.data.bypassMediaCSP && this.site.needBypassCSP; - // Default actions on stop translate stopTranslate() { - for (const e of videoLipSyncEvents) { - this.video.removeEventListener(e, this.handleVideoEvent); - } - if (this.playSound) { - try { - this.playSound.stop(); - this.playSound = null; - } catch { - /* empty */ - } - } - this.audio.pause(); - this.audio.src = ""; - this.audio.removeAttribute("src"); + this.audioPlayer.player.removeVideoEvents(); + this.audioPlayer.player.clear(); + this.audioPlayer.player.src = undefined; + debug.log("audioPlayer after stopTranslate", this.audioPlayer); + this.votVideoVolumeSlider.container.hidden = true; this.votVideoTranslationVolumeSlider.container.hidden = true; this.votDownloadButton.hidden = true; this.downloadTranslationUrl = null; this.transformBtn("none", localizationProvider.get("translateVideo")); - utils_debug.log(`Volume on start: ${this.volumeOnStart}`); + debug.log(`Volume on start: ${this.volumeOnStart}`); if (this.volumeOnStart) { this.setVideoVolume(this.volumeOnStart); } - this.volumeOnStart = ""; clearInterval(this.streamPing); clearTimeout(this.autoRetry); this.hls?.destroy(); @@ -9252,7 +11106,7 @@ class VideoHandler { } async translateExecutor(VIDEO_ID) { - utils_debug.log("Run translateFunc", VIDEO_ID); + debug.log("Run translateFunc", VIDEO_ID); await this.translateFunc( VIDEO_ID, this.videoData.isStream, @@ -9322,73 +11176,42 @@ class VideoHandler { method: "HEAD", timeout: 5000, }); - utils_debug.log("Test audio response", response); - if (response.status === 404) { - utils_debug.log("Yandex returned not valid audio, trying to fix..."); - let translateRes = await this.translateVideoImpl( - this.videoData, - (this.videoData.detectedLanguage = "auto"), - this.videoData.responseLanguage, - this.videoData.translationHelp, - ); - this.setSelectMenuValues( - this.videoData.detectedLanguage, - this.videoData.responseLanguage, - ); - audioUrl = translateRes.url; - utils_debug.log("Fixed audio audioUrl", audioUrl); - } else { - utils_debug.log("Valid audioUrl", audioUrl); + debug.log("Test audio response", response); + if (response.status !== 404) { + debug.log("Valid audioUrl", audioUrl); + return audioUrl; } + + debug.log("Yandex returned not valid audio, trying to fix..."); + let translateRes = await this.translateVideoImpl( + this.videoData, + (this.videoData.detectedLanguage = "auto"), + this.videoData.responseLanguage, + this.videoData.translationHelp, + ); + this.setSelectMenuValues( + this.videoData.detectedLanguage, + this.videoData.responseLanguage, + ); + audioUrl = translateRes.url; + debug.log("Fixed audio audioUrl", audioUrl); } catch (err) { if (err.message === "Timeout") { - utils_debug.log("Request timed out. Handling timeout error..."); + debug.log("Request timed out. Handling timeout error..."); this.data.audioProxy = 1; await votStorage.set("audioProxy", 1); } else { - utils_debug.log("Test audio error:", err); + debug.log("Test audio error:", err); } } return audioUrl; } - /** - * Download audio file and connect it to audio context - * - * @param {string} audioUrl - * @return {Promise} - * @memberof VideoHandler - */ - async configurePlaySound(audioUrl) { - try { - utils_debug.log("[VOT] Trying bypass audio CSP..."); - const res = await GM_fetch(audioUrl); - const data = await res.arrayBuffer(); - - this.audioBuffer = await this.audioContext.decodeAudioData(data); - this.playSound = this.audioContext.createBufferSource(); - this.playSound.buffer = this.audioBuffer; - this.playSound.connect(this.gainNode); - // this.playSound.start(); - } catch (err) { - console.error("[VOT] Failed to bypass CSP", err); - if (err.message === "Timeout") { - utils_debug.log("Request timed out. Handling timeout error..."); - this.data.audioProxy = 1; - await votStorage.set("audioProxy", 1); - } - } - } - // update translation audio src async updateTranslation(audioUrl) { // ! Don't use this function for streams - //debug.log("cachedTranslation", this.cachedTranslation?.url, this.audio.currentSrc); - if (this.cachedTranslation?.url === this.audio.currentSrc) { - utils_debug.log("[translateFunc] Audio src is the same"); - this.audio.src = audioUrl; - } else { + if (this.cachedTranslation?.url !== this.audioPlayer.player.currentSrc) { audioUrl = await this.validateAudioUrl(audioUrl); } @@ -9404,31 +11227,28 @@ class VideoHandler { console.log(`[VOT] Audio proxied via ${audioUrl}`); } - // eslint-disable-next-line sonarjs/no-unused-expressions - this.needBypassCSP() - ? await this.configurePlaySound(audioUrl) - : (this.audio.src = audioUrl); + if (this.audioPlayer.player.src !== audioUrl) { + this.audioPlayer.player.src = audioUrl; + } - if (!this.volumeOnStart) { - this.volumeOnStart = this.getVideoVolume(); + try { + this.audioPlayer.init(); + } catch (err) { + if (err.message.includes("Failed to fetch audio file")) { + this.videoHandler.data.audioProxy = 1; + await votStorage.set("audioProxy", 1); + } else { + this.videoHandler.transformBtn("error", err.message); + } } this.setupAudioSettings(); - switch (this.site.host) { - case "twitter": - document - .querySelector('button[data-testid="app-bar-back"][role="button"]') - .addEventListener("click", this.stopTranslation); - break; - case "invidious": - case "piped": - break; + if (this.site.host === "twitter") { + document + .querySelector('button[data-testid="app-bar-back"][role="button"]') + .addEventListener("click", this.stopTranslation); } - if (this.video && !this.video.paused) this.lipSync("play"); - for (const e of videoLipSyncEvents) { - this.video.addEventListener(e, this.handleVideoEvent); - } this.transformBtn("success", localizationProvider.get("disableTranslate")); this.afterUpdateTranslation(audioUrl); } @@ -9443,9 +11263,10 @@ class VideoHandler { ) { console.log("[VOT] Video Data: ", this.videoData); // fix enabling the old requested voiceover when changing the language to the native language (#414) - utils_debug.log("Run videoValidator"); + debug.log("Run videoValidator"); this.videoValidator(); this.setLoadingBtn(true); + this.volumeOnStart = this.getVideoVolume(); if (isStream) { let translateRes = await this.translateStreamImpl( @@ -9455,7 +11276,7 @@ class VideoHandler { ); if (!translateRes) { - utils_debug.log("Skip translation"); + debug.log("Skip translation"); return; } @@ -9473,11 +11294,6 @@ class VideoHandler { return this.stopTranslation(); } - if (this.video && !this.video.paused) this.lipSync("play"); - for (const e of videoLipSyncEvents) { - this.video.addEventListener(e, this.handleVideoEvent); - } - return this.afterUpdateTranslation(streamURL); } @@ -9491,7 +11307,7 @@ class VideoHandler { if (this.cachedTranslation) { await this.updateTranslation(this.cachedTranslation.url); - utils_debug.log("[translateFunc] Cached translation was received"); + debug.log("[translateFunc] Cached translation was received"); return; } @@ -9502,9 +11318,9 @@ class VideoHandler { translationHelp, ); - utils_debug.log("[translateRes]", translateRes); + debug.log("[translateRes]", translateRes); if (!translateRes) { - utils_debug.log("Skip translation"); + debug.log("Skip translation"); return; } @@ -9534,15 +11350,16 @@ class VideoHandler { // Вспомогательные методы setupHLS(streamURL) { this.hls.on(Hls.Events.MEDIA_ATTACHED, function () { - utils_debug.log("audio and hls.js are now bound together !"); + debug.log("audio and hls.js are now bound together !"); }); this.hls.on(Hls.Events.MANIFEST_PARSED, function (data) { - utils_debug.log( + debug.log( "manifest loaded, found " + data?.levels?.length + " quality level", ); }); this.hls.loadSource(streamURL); - this.hls.attachMedia(this.audio); + // doesn't work + this.hls.attachMedia(this.audioPlayer.player.audio); this.hls.on(Hls.Events.ERROR, function (data) { if (data.fatal) { switch (data.type) { @@ -9564,7 +11381,7 @@ class VideoHandler { } } }); - utils_debug.log(this.hls); + debug.log(this.hls); } setHLSSource(url) { @@ -9577,9 +11394,11 @@ class VideoHandler { )}&url=${encodeURIComponent(url)}`; if (this.hls) { this.setupHLS(streamURL); - } else if (this.audio.canPlayType("application/vnd.apple.mpegurl")) { + } else if ( + this.audioPlayer.player.audio.canPlayType("application/vnd.apple.mpegurl") + ) { // safari - this.audio.src = streamURL; + this.audioPlayer.player.src = streamURL; // TODO: make class for HLS audio player } else { // browser doesn't support m3u8 (hls unsupported and it isn't a safari) throw new VOTLocalizedError("audioFormatNotSupported"); @@ -9590,7 +11409,7 @@ class VideoHandler { setupAudioSettings() { if (typeof this.data.defaultVolume === "number") { - this.setAudioVolume(this.data.defaultVolume / 100); + this.audioPlayer.player.volume = this.data.defaultVolume / 100; } if ( @@ -9608,7 +11427,7 @@ class VideoHandler { }; async handleSrcChanged() { - utils_debug.log("[VideoHandler] src changed", this); + debug.log("[VideoHandler] src changed", this); this.firstPlay = true; this.stopTranslation(); @@ -9627,11 +11446,9 @@ class VideoHandler { this.container.append(this.votButton.container, this.votMenu.container); } - await Promise.all([ - (this.videoData = await this.getVideoData()), - this.updateSubtitles(), - (this.translateToLang = this.data.responseLanguage ?? "ru"), - ]); + this.videoData = await this.getVideoData(); + await this.updateSubtitles(); + this.translateToLang = this.data.responseLanguage ?? "ru"; this.setSelectMenuValues( this.videoData.detectedLanguage, this.videoData.responseLanguage, @@ -9639,7 +11456,7 @@ class VideoHandler { } async release() { - utils_debug.log("[VideoHandler] release"); + debug.log("[VideoHandler] release"); this.initialized = false; this.releaseExtraEvents(); @@ -9695,11 +11512,11 @@ function findContainer(site, video) { } async function src_main() { - utils_debug.log("Loading extension..."); + debug.log("Loading extension..."); await localizationProvider.update(); - utils_debug.log(`Selected menu language: ${localizationProvider.lang}`); + debug.log(`Selected menu language: ${localizationProvider.lang}`); // I haven't figured out how to do it any other way if (window.location.origin === "https://9animetv.to") { diff --git a/eslint.config.js b/eslint.config.js index e9aef1e6..59c82b68 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,7 +1,6 @@ import js from "@eslint/js"; import globals from "globals"; import oxlint from "eslint-plugin-oxlint"; -import sonarjs from "eslint-plugin-sonarjs"; // import github from "eslint-plugin-github"; export default [ @@ -9,7 +8,6 @@ export default [ ignores: ["dist/*"], }, js.configs.recommended, - sonarjs.configs.recommended, { // plugins: { // github: github, @@ -17,16 +15,6 @@ export default [ rules: { "no-control-regex": 0, "no-async-promise-executor": 0, - "sonarjs/max-switch-cases": 0, - "sonarjs/prefer-for-of": 0, - "sonarjs/new-cap": 0, - "sonarjs/todo-tag": "warn", - "sonarjs/no-commented-code": 0, - "sonarjs/no-nested-assignment": 0, - "sonarjs/cognitive-complexity": "warn", - "sonarjs/slow-regex": 0, - // sonarjs/sonar-no-fallthrough crashed in 2.0.1 - "sonarjs/sonar-no-fallthrough": 0, // return after update github eslint plugin to full support eslint 9 // "github/no-innerText": "error", // "github/no-inner-html": "error", @@ -45,6 +33,7 @@ export default [ protobuf: "readonly", Hls: "readonly", anime: "readonly", + Tone: "readonly", // WEBPACK ENVIRONMENT DEBUG_MODE: "readonly", AVAILABLE_LOCALES: "readonly", diff --git a/package-lock.json b/package-lock.json index 011e8d63..517ddf4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,30 +11,30 @@ "license": "MIT", "dependencies": { "bowser": "^2.11.0", - "lit": "^3.2.0", + "chaimu": "^1.0.2", + "lit": "^3.2.1", "requestidlecallback-polyfill": "^1.0.2", - "vot.js": "^1.3.1" + "vot.js": "^1.3.8" }, "devDependencies": { + "@types/bun": "^1.1.13", "browser-id3-writer": "^6.1.0", - "browserslist": "^4.24.0", - "bun-types": "^1.1.29", + "browserslist": "^4.24.2", "enquirer": "^2.4.1", - "eslint": "^9.11.1", - "eslint-plugin-oxlint": "^0.9.8", - "eslint-plugin-sonarjs": "^2.0.2", + "eslint": "^9.14.0", + "eslint-plugin-oxlint": "^0.11.0", "eslint-webpack-plugin": "^4.2.0", - "globals": "^15.9.0", + "globals": "^15.12.0", "husky": "^9.1.6", - "lightningcss": "^1.27.0", + "lightningcss": "^1.28.1", "lint-staged": "^15.2.10", - "npm-run-all2": "^6.2.3", - "oxlint": "^0.9.8", + "npm-run-all2": "^7.0.1", + "oxlint": "^0.11.0", "patch-package": "^8.0.0", - "postinstall-postinstall": "^2.1.0", - "sass": "^1.79.3", - "typescript": "^5.6.2", - "webpack": "^5.95.0", + "sass": "^1.80.6", + "ts-loader": "^9.5.1", + "typescript": "^5.6.3", + "webpack": "^5.96.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0", "webpack-monkey": "^0.2.1" @@ -49,5663 +49,2318 @@ "node": ">=0.10.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", "dev": true, - "bin": { - "json5": "lib/cli.js" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/generator": { - "version": "7.25.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", - "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { - "@babel/types": "^7.25.4", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "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" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "node_modules/@eslint/js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", - "semver": "^6.3.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18.18.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz", + "integrity": "sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" + "node": ">=10.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@jsonjoy.com/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, "engines": { - "node": ">=4" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", + "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" + }, + "node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", "dependencies": { - "color-name": "1.1.3" + "@lit-labs/ssr-dom-shim": "^1.2.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/@oxlint/darwin-arm64": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-arm64/-/darwin-arm64-0.11.0.tgz", + "integrity": "sha512-qQ1C5yvRYECp+FP8DCOSqNX4+e72xXyApJ2O8QyIeYFuGGF2MoDVQz3NYJEOjOfArZ9YXGsELwM3UFtjTGIZVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@oxlint/darwin-x64": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-x64/-/darwin-x64-0.11.0.tgz", + "integrity": "sha512-pAqp6/6+mAIPr8WBndzmEuRbcXW8WNdn80hd8fLeR9teJI8eMpTkYL6kQIU7VjJ3NxpmzBLO7nh979/bwmmuBQ==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=0.8.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@oxlint/linux-arm64-gnu": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-0.11.0.tgz", + "integrity": "sha512-RmpjCWjX0RJ1MdIcqGQsOlXh9WgXnVgVolZLCs8MHqNuYtaIA+0VOxOhJOr7CQ0HmwV+ysPTAiQ2SVSI2tVJQQ==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@oxlint/linux-arm64-musl": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-musl/-/linux-arm64-musl-0.11.0.tgz", + "integrity": "sha512-totBeaOeZlblKRpSZi3svVWpJjFlhxR7Xzrh3nhPTgHMM3696qjzyb80Yg0K8gAlOrIDlBblLG0JnaxvdM2yjg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@babel/parser": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", - "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", + "node_modules/@oxlint/linux-x64-gnu": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-gnu/-/linux-x64-gnu-0.11.0.tgz", + "integrity": "sha512-tXiJ97WH4vwTIkGMnXYPx5NqwQiYLW9MbmnGkKkm5Xv/wpAaN761PkHRJT0zsYoAgoU3nZVp3qhit9MpHq1SQg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.25.4" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "node_modules/@oxlint/linux-x64-musl": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-musl/-/linux-x64-musl-0.11.0.tgz", + "integrity": "sha512-LgjgD80fiz37g31t/jMm9kyDM31WPjcTkXXXU702WQsdhujXVUZDWid9/QeVvi51EVufyyekaTYgNR8REVVZZg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "node_modules/@oxlint/win32-arm64": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/win32-arm64/-/win32-arm64-0.11.0.tgz", + "integrity": "sha512-lfANFSWt0vU6x9JQYeMEy6uy8wniZGYQt0nT45P3BwXIMhAJbEC3yEX+bP5x8eTQrgkDu4dwIDURGCeeUL/NdA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "node_modules/@oxlint/win32-x64": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-0.11.0.tgz", + "integrity": "sha512-5CHtAp82xbv0jnh/HGi3QE0ANBr3+R338MA0wgZXc7477Vuri0aSK0T9oRU+K/pVloPVJaWKSDCCZoiZIYckzg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", - "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-decorators": "^7.24.1" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", - "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", - "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", + "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@types/bun": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.1.13.tgz", + "integrity": "sha512-KmQxSBgVWCl6RSuerlLGZlIWfdxkKqat0nxN61+qu4y1KDn0Ll3j7v1Pl8GnaL3a/U6GGWVTJh75ap62kR1E8Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bun-types": "1.1.34" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@types/connect": { + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", + "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", - "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "node_modules/@types/express-serve-static-core": { + "version": "4.17.39", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", + "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "node_modules/@types/http-errors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.13", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", + "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "dev": true }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", - "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", + "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "undici-types": "~5.26.4" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/@types/qs": { + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "dev": true }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@types/range-parser": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "node_modules/@types/send": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", + "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/express": "*" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "node_modules/@types/yargs": { + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", + "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/yargs-parser": "*" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", - "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", + "node_modules/@types/yargs-parser": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-flow": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@xtuc/long": "4.2.2" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", - "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", - "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", - "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", - "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", - "dev": true, - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", - "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", - "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", - "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.1", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.1", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.1.tgz", - "integrity": "sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-flow-strip-types": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", - "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.4", - "@babel/parser": "^7.25.4", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.4", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", - "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "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" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/js": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", - "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", - "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", - "dev": true, - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", - "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", - "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" - }, - "node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oxlint/darwin-arm64": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/darwin-arm64/-/darwin-arm64-0.9.8.tgz", - "integrity": "sha512-4wuEraeF9euP50sLYEB77tPKVuxNVnRK963CQ64ITkItbopTyZ2Fxh6PT8UyENqUojDXmLmCdwxMPP4sbexxwg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@oxlint/darwin-x64": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/darwin-x64/-/darwin-x64-0.9.8.tgz", - "integrity": "sha512-SZsmFT9SOjQCqULb4gDh6P7xnIb9zxD0rPolH/ytGcpHtqe9eZGupEeLWBHjbjAhNiBgkuqULkUO27vUJ+6cPA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@oxlint/linux-arm64-gnu": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-0.9.8.tgz", - "integrity": "sha512-UOI88tlIuc4bfBPmLJn9vTfWqePWpk+NoA4Spwkt1Iz+kCgtftL2EmNRapn95ye+JUKBV+zOHTNjnpIjRHv6Xw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxlint/linux-arm64-musl": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-musl/-/linux-arm64-musl-0.9.8.tgz", - "integrity": "sha512-pHb5zjBwzQt++6CBFC0mw7sc5wXsvWf7GYugA8JW1Satei9SZaPkbfJPYMPKru+yAlFmm6GggUFKF1A2k20OMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxlint/linux-x64-gnu": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-gnu/-/linux-x64-gnu-0.9.8.tgz", - "integrity": "sha512-9aGoJLGKSnx8HrU7pacfKqxHNuZdSfXCDIlJWOcfDX1ecYrti+taNDPhk9KepkUW1mkVv73HCoXyvMC88am9fA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxlint/linux-x64-musl": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-musl/-/linux-x64-musl-0.9.8.tgz", - "integrity": "sha512-49QJtguJT+DovDKALR57WBKMuLlCZ0n2DKZIe/ehaSD824K7Ovk9kcoCN8M9FjzktOPSwZ/0udqNfZv01OEu3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxlint/win32-arm64": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/win32-arm64/-/win32-arm64-0.9.8.tgz", - "integrity": "sha512-5CqY88g/y50olp7WfHXfezjClNa9ztCYqNKzKNJR3hkBJTa03f74M526KnS0fkSaOC2tr8WjqNZ+vDS3Zhx27Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@oxlint/win32-x64": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-0.9.8.tgz", - "integrity": "sha512-wPa3vQb73Pl0z6nkEVmY6G4sO+2xf6QXPqAxDtd7kzxrGrSkTXvTNS/gKIxmvuUy+KjKDcSC2pfJL/074yE6aQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.12.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", - "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", - "dev": true - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-extension-url-match": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/browser-extension-url-match/-/browser-extension-url-match-0.3.3.tgz", - "integrity": "sha512-x7uphFW6fxHF8/RfNqUQomZL4KsKgNb3f8ZrLsYsxSVTaOyeg9I3w/8iuQ2I51vVmrtiYiv37Tfq5gQyMN3j2Q==", - "dev": true, - "dependencies": { - "fancy-regex": "^0.4.3" - } - }, - "node_modules/browser-id3-writer": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-6.1.0.tgz", - "integrity": "sha512-99mQN3GAZlqWnbA0cispSAab9uJJzzv86ffoA/w6ohfqAi/5qOGbEhh0fRAQMrnhsOBsy89mqMc+JdnaWtJObw==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bun-types": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.29.tgz", - "integrity": "sha512-En3/TzSPMPyl5UlUB1MHzHpcrZDakTm7mS203eLoX1fBoEa3PW+aSS8GAqVJ7Is/m34Z5ogL+ECniLY0uDaCPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001663", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", - "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", - "dev": true, - "dependencies": { - "browserslist": "^4.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, "engines": { - "node": ">=12" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/destroy": { + "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/dom-parser": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/dom-parser/-/dom-parser-1.1.5.tgz", - "integrity": "sha512-lCiFG48ZUzGXjKN0qhSkxD/i3ndyV6I37zQ3W2VFYLjF1ob8A+QgSsM7Ps2UT0d3LpJxLMmMHiJJ34z5hkKLiA==", - "license": "ISC" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", - "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", - "dev": true, - "license": "ISC" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "engines": { - "node": ">= 0.8" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/envinfo": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", - "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" + "peerDependencies": { + "ajv": "^8.0.0" }, - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "environment": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">= 4.0.0" } }, - "node_modules/es-shim-unscopables": { + "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "dependencies": { - "hasown": "^2.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/escalade": { + "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/eslint": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", - "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, - "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.1", - "@eslint/plugin-kit": "^0.2.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.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", - "is-path-inside": "^3.0.3", - "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", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "multicast-dns": "^7.2.5" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "debug": "^3.2.7" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "node": ">=8" } }, - "node_modules/eslint-plugin-oxlint": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-0.9.8.tgz", - "integrity": "sha512-SR6tUbnjXkx6BS5COhqcq9cAW4i1HnHhzZpwpQT0EOI+01O0Yc5FnqrN11xXxu/FKprDIOYT7TEpg57LRNwXUA==", + "node_modules/browser-extension-url-match": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/browser-extension-url-match/-/browser-extension-url-match-0.3.3.tgz", + "integrity": "sha512-x7uphFW6fxHF8/RfNqUQomZL4KsKgNb3f8ZrLsYsxSVTaOyeg9I3w/8iuQ2I51vVmrtiYiv37Tfq5gQyMN3j2Q==", "dev": true, - "license": "MIT", "dependencies": { - "scule": "^1.3.0" + "fancy-regex": "^0.4.3" } }, - "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "node_modules/browser-id3-writer": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-6.1.0.tgz", + "integrity": "sha512-99mQN3GAZlqWnbA0cispSAab9uJJzzv86ffoA/w6ohfqAi/5qOGbEhh0fRAQMrnhsOBsy89mqMc+JdnaWtJObw==", "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } + "license": "MIT" }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { - "resolve": "bin/resolve" + "browserslist": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, - "node_modules/eslint-plugin-sonarjs": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-2.0.2.tgz", - "integrity": "sha512-0JUYTlUDk/up3mS0rFP9vHCRvhIYNTy06m99IPFeyMDUWL8u0ebz+nFPYn6OWDBTIEfbvQ/Xe0PdjWO8w0WD0Q==", - "dev": true, - "dependencies": { - "@babel/core": "7.24.3", - "@babel/eslint-parser": "7.24.1", - "@babel/plugin-proposal-decorators": "7.24.1", - "@babel/preset-env": "7.24.3", - "@babel/preset-flow": "7.24.1", - "@babel/preset-react": "7.24.1", - "@eslint-community/regexpp": "4.10.0", - "@typescript-eslint/eslint-plugin": "7.16.1", - "@typescript-eslint/utils": "^7.16.1", - "builtin-modules": "3.3.0", - "bytes": "3.1.2", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-react": "^7.35.0", - "eslint-plugin-react-hooks": "4.6.0", - "eslint-scope": "8.0.1", - "functional-red-black-tree": "1.0.1", - "jsx-ast-utils": "^3.3.5", - "minimatch": "^9.0.3", - "scslre": "0.3.0", - "semver": "7.6.0", - "typescript": "*", - "vue-eslint-parser": "9.4.3" - }, - "peerDependencies": { - "eslint": "^8.0.0 || ^9.0.0" + "node_modules/bun-types": { + "version": "1.1.34", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.34.tgz", + "integrity": "sha512-br5QygTEL/TwB4uQOb96Ky22j4Gq2WxWH/8Oqv20fk5HagwKXo/akB+LiYgSfzexCt6kkcUaVm+bKiPl71xPvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" + "run-applescript": "^7.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", - "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/type-utils": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", - "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1" - }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", - "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001677", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz", + "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==", "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } + ], + "license": "CC-BY-4.0" }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", - "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node_modules/chaimu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chaimu/-/chaimu-1.0.2.tgz", + "integrity": "sha512-4JtFq1oVUtycdFqPa3b2EqisZj4CVdU4bi7qUJz83SuG7vOMjNctddalbkV+ttSJyBxAWoXU4jXyEUmuASS7FA==", + "license": "MIT", + "dependencies": { + "soundtouchjs": "^0.1.30" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", - "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", - "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">= 8.10.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://paulmillr.com/funding/" }, - "peerDependencies": { - "eslint": "^8.56.0" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", - "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.16.1", - "eslint-visitor-keys": "^3.4.3" + "is-glob": "^4.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 6" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.0" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" } + ], + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=18" }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", - "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", - "dev": true, - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=4.0" + "node": ">=18" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "engines": { + "node": ">=6" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=7.0.0" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.8.0" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "ms": "2.0.0" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=0.8" } }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.6" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.6" } }, - "node_modules/eslint-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==", + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, - "dependencies": { - "@types/eslint": "^8.56.10", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0" - }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0 || ^9.0.0", - "webpack": "^5.0.0" + "node": ">= 0.6" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 8" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, "engines": { - "node": ">=4.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 0.8" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" + "node": ">=6" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/dom-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/dom-parser/-/dom-parser-1.1.5.tgz", + "integrity": "sha512-lCiFG48ZUzGXjKN0qhSkxD/i3ndyV6I37zQ3W2VFYLjF1ob8A+QgSsM7Ps2UT0d3LpJxLMmMHiJJ34z5hkKLiA==", + "license": "ISC" }, - "node_modules/fancy-regex": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/fancy-regex/-/fancy-regex-0.4.3.tgz", - "integrity": "sha512-c9R6Q7cM8pX5i0ZF3sAjYWPFsjGOUthPWPnkuZgDP8i6bzRtTnSXX5PJeWc34w/C0tbGj/bO3GSmdnEEj4K5PQ==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "node_modules/electron-to-chromium": { + "version": "1.5.50", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz", + "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==", + "dev": true, + "license": "ISC" }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.8" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" + "node": ">=10.13.0" } }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" + "bin": { + "envinfo": "dist/cli.js" }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, "engines": { - "node": ">=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { "node": ">=10" }, @@ -5713,710 +2368,699 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "node_modules/eslint": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", "dev": true, + "license": "MIT", "dependencies": { - "micromatch": "^4.0.2" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.14.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.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", + "text-table": "^0.2.0" + }, "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" }, "peerDependenciesMeta": { - "debug": { + "jiti": { "optional": true } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/eslint-plugin-oxlint": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-0.11.0.tgz", + "integrity": "sha512-9CHYh1eLt2Z83ShLbvj79G6lqC2qLJBfsd7baGWOwDmLM2GXu2COi1r4tMMS2OI8gfB4s2uOgS8ZiYzHhN8uzQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" + "jsonc-parser": "^3.3.1" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/eslint-webpack-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@types/eslint": "^8.56.10", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0" }, "engines": { - "node": ">=10" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0", + "webpack": "^5.0.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/eslint/node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=4.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.8.x" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/fancy-regex": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/fancy-regex/-/fancy-regex-0.4.3.tgz", + "integrity": "sha512-c9R6Q7cM8pX5i0ZF3sAjYWPFsjGOUthPWPnkuZgDP8i6bzRtTnSXX5PJeWc34w/C0tbGj/bO3GSmdnEEj4K5PQ==", "dev": true }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 4.9.1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "has-symbols": "^1.0.3" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "micromatch": "^4.0.2" } }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "bin": { + "flat": "cli.js" } }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "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" + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" } - ] - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.6" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": ">=10" } }, - "node_modules/husky": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", - "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "license": "MIT", - "bin": { - "husky": "bin.js" - }, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18" - }, + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { - "url": "https://github.com/sponsors/typicode" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hyperdyperid": { + "node_modules/get-east-asian-width": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, "engines": { - "node": ">=10.18" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.13.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "engines": { - "node": ">= 10" + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -6424,15 +3068,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, "engines": { "node": ">= 0.4" }, @@ -6440,324 +3080,293 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "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" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.1.0" } }, - "node_modules/is-callable": { + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "dependencies": { - "is-typed-array": "^1.1.13" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "node_modules/husky": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", "dev": true, + "license": "MIT", "bin": { - "is-docker": "cli.js" + "husky": "bin.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.18" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" + "bin": { + "import-local-fixture": "fixtures/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-network-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz", - "integrity": "sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ==", - "dev": true, "engines": { - "node": ">=16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { - "node": ">=0.12.0" + "node": ">=0.8.19" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.13.0" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "binary-extensions": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6766,89 +3375,103 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.14" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/is-network-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz", + "integrity": "sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "isobject": "^3.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, "node_modules/is-wsl": { @@ -6887,19 +3510,6 @@ "node": ">=0.10.0" } }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -6947,12 +3557,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -6965,18 +3569,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -7025,17 +3617,12 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", @@ -7058,21 +3645,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -7100,24 +3672,6 @@ "graceful-fs": "^4.1.11" } }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/launch-editor": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", @@ -7142,9 +3696,9 @@ } }, "node_modules/lightningcss": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", - "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.1.tgz", + "integrity": "sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -7158,22 +3712,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.27.0", - "lightningcss-darwin-x64": "1.27.0", - "lightningcss-freebsd-x64": "1.27.0", - "lightningcss-linux-arm-gnueabihf": "1.27.0", - "lightningcss-linux-arm64-gnu": "1.27.0", - "lightningcss-linux-arm64-musl": "1.27.0", - "lightningcss-linux-x64-gnu": "1.27.0", - "lightningcss-linux-x64-musl": "1.27.0", - "lightningcss-win32-arm64-msvc": "1.27.0", - "lightningcss-win32-x64-msvc": "1.27.0" + "lightningcss-darwin-arm64": "1.28.1", + "lightningcss-darwin-x64": "1.28.1", + "lightningcss-freebsd-x64": "1.28.1", + "lightningcss-linux-arm-gnueabihf": "1.28.1", + "lightningcss-linux-arm64-gnu": "1.28.1", + "lightningcss-linux-arm64-musl": "1.28.1", + "lightningcss-linux-x64-gnu": "1.28.1", + "lightningcss-linux-x64-musl": "1.28.1", + "lightningcss-win32-arm64-msvc": "1.28.1", + "lightningcss-win32-x64-msvc": "1.28.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", - "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.1.tgz", + "integrity": "sha512-VG3vvzM0m/rguCdm76DdobNeNJnHK+jWcdkNLFWHLh9YCotRvbRIt45JxwcHlIF8TDqWStVLTdghq5NaigVCBQ==", "cpu": [ "arm64" ], @@ -7192,9 +3746,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", - "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.1.tgz", + "integrity": "sha512-O7ORdislvKfMohFl4Iq7fxKqdJOuuxArcglVI3amuFO5DJ0wfV3Gxgi1JRo49slfr7OVzJQEHLG4muTWYM5cTQ==", "cpu": [ "x64" ], @@ -7213,9 +3767,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", - "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.1.tgz", + "integrity": "sha512-b7sF89B31kYYijxVcFO7l5u6UNA862YstNu+3YbLl/IQKzveL4a5cwR5cdpG+OOhErg/c2u9WCmzZoX2I5GBvw==", "cpu": [ "x64" ], @@ -7234,9 +3788,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", - "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.1.tgz", + "integrity": "sha512-p61kXwvhUDLLzkWHjzSFfUBW/F0iy3jr3CWi3k8SKULtJEsJXTI9DqRm9EixxMSe2AMBQBt4auTYiQL4B1N51A==", "cpu": [ "arm" ], @@ -7255,9 +3809,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", - "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.1.tgz", + "integrity": "sha512-iO+fN9hOMmzfwqcG2/BgUtMKD48H2JO/SXU44fyIwpY2veb65QF5xiRrQ9l1FwIxbGK3231KBYCtAqv+xf+NsQ==", "cpu": [ "arm64" ], @@ -7276,9 +3830,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", - "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.1.tgz", + "integrity": "sha512-dnMHeXEmCUzHHZjaDpQBYuBKcN9nPC3nPFKl70bcj5Bkn5EmkcgEqm5p035LKOgvAwk1XwLpQCML6pXmCwz0NQ==", "cpu": [ "arm64" ], @@ -7297,9 +3851,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", - "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.1.tgz", + "integrity": "sha512-7vWDISaMUn+oo2TwRdf2hl/BLdPxvywv9JKEqNZB/0K7bXwV4XE9wN/C2sAp1gGuh6QBA8lpjF4JIPt3HNlCHA==", "cpu": [ "x64" ], @@ -7318,9 +3872,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", - "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.1.tgz", + "integrity": "sha512-IHCu9tVGP+x5BCpA2rF3D04DBokcBza/a8AuHQU+1AiMKubuMegPwcL7RatBgK4ztFHeYnnD5NdhwhRfYMAtNA==", "cpu": [ "x64" ], @@ -7339,9 +3893,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", - "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.1.tgz", + "integrity": "sha512-Erm72kHmMg/3h350PTseskz+eEGBM17Fuu79WW2Qqt0BfWSF1jHHc12lkJCWMYl5jcBHPs5yZdgNHtJ7IJS3Uw==", "cpu": [ "arm64" ], @@ -7360,9 +3914,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", - "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.1.tgz", + "integrity": "sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA==", "cpu": [ "x64" ], @@ -7615,9 +4169,10 @@ "dev": true }, "node_modules/lit": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.0.tgz", - "integrity": "sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz", + "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", + "license": "BSD-3-Clause", "dependencies": { "@lit/reactive-element": "^2.0.4", "lit-element": "^4.1.0", @@ -7672,12 +4227,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -7773,29 +4322,11 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" }, "node_modules/media-typer": { "version": "0.3.0", @@ -7846,15 +4377,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -7995,6 +4517,14 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -8020,18 +4550,19 @@ } }, "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", "dev": true, + "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-run-all2": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.3.tgz", - "integrity": "sha512-5RsxC7jEc/RjxOYBVdEfrJf5FsJ0pHA7jr2/OxrThXknajETCTYjigOCG3iaGjdYIKEQlDuCG0ir0T1HTva8pg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-7.0.1.tgz", + "integrity": "sha512-Adbv+bJQ8UTAM03rRODqrO5cx0YU5KCG2CvHtSURiadvdTjjgGJXdbc1oQ9CXBh9dnGfHSoSB1Web/0Dzp6kOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8040,8 +4571,9 @@ "memorystream": "^0.3.1", "minimatch": "^9.0.0", "pidtree": "^0.6.0", - "read-package-json-fast": "^3.0.2", - "shell-quote": "^1.7.3" + "read-package-json-fast": "^4.0.0", + "shell-quote": "^1.7.3", + "which": "^5.0.0" }, "bin": { "npm-run-all": "bin/npm-run-all/index.js", @@ -8050,8 +4582,8 @@ "run-s": "bin/run-s/index.js" }, "engines": { - "node": "^14.18.0 || ^16.13.0 || >=18.0.0", - "npm": ">= 8" + "node": "^18.17.0 || >=20.5.0", + "npm": ">= 9" } }, "node_modules/npm-run-all2/node_modules/ansi-styles": { @@ -8075,6 +4607,16 @@ "balanced-match": "^1.0.0" } }, + "node_modules/npm-run-all2/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, "node_modules/npm-run-all2/node_modules/minimatch": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", @@ -8090,13 +4632,20 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/npm-run-all2/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/object-inspect": { @@ -8108,22 +4657,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -8133,87 +4666,6 @@ "node": ">= 0.4" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -8295,12 +4747,13 @@ } }, "node_modules/oxlint": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-0.9.8.tgz", - "integrity": "sha512-FnRcPEerznjvFuAD6fvg04ZwXuihzWZa/ciN2g7o2/rV0uRJGGl4hazrFpetf8uv2pnUr3n5TJ6u4d5rSvaapQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-0.11.0.tgz", + "integrity": "sha512-uY6/R4k5bECwJBR+y8CqGRcUb5hxNReziBjt5+pk6DKxj46DqMd6HwEk090KnaH1czVf23r8mcEsJYGowMWeIA==", "dev": true, "license": "MIT", "bin": { + "oxc_language_server": "bin/oxc_language_server", "oxlint": "bin/oxlint" }, "engines": { @@ -8310,14 +4763,14 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxlint/darwin-arm64": "0.9.8", - "@oxlint/darwin-x64": "0.9.8", - "@oxlint/linux-arm64-gnu": "0.9.8", - "@oxlint/linux-arm64-musl": "0.9.8", - "@oxlint/linux-x64-gnu": "0.9.8", - "@oxlint/linux-x64-musl": "0.9.8", - "@oxlint/win32-arm64": "0.9.8", - "@oxlint/win32-x64": "0.9.8" + "@oxlint/darwin-arm64": "0.11.0", + "@oxlint/darwin-x64": "0.11.0", + "@oxlint/linux-arm64-gnu": "0.11.0", + "@oxlint/linux-arm64-musl": "0.11.0", + "@oxlint/linux-x64-gnu": "0.11.0", + "@oxlint/linux-x64-musl": "0.11.0", + "@oxlint/win32-arm64": "0.11.0", + "@oxlint/win32-x64": "0.11.0" } }, "node_modules/p-limit": { @@ -8509,20 +4962,12 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8609,25 +5054,9 @@ "p-limit": "^2.2.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/postinstall-postinstall": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", - "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", - "dev": true, - "hasInstallScript": true - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8643,15 +5072,28 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" } }, "node_modules/proxy-addr": { @@ -8700,26 +5142,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -8762,32 +5184,28 @@ "node": ">= 0.8" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", + "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", "dev": true, + "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/readable-stream": { @@ -8828,141 +5246,6 @@ "node": ">= 10.13.0" } }, - "node_modules/refa": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", - "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.8.0" - }, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp-ast-analysis": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", - "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.8.0", - "refa": "^0.12.1" - }, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/requestidlecallback-polyfill": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/requestidlecallback-polyfill/-/requestidlecallback-polyfill-1.0.2.tgz", @@ -9082,16 +5365,6 @@ "node": ">= 4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -9123,53 +5396,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9190,23 +5416,6 @@ } ] }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -9214,9 +5423,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz", - "integrity": "sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==", + "version": "1.80.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.6.tgz", + "integrity": "sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==", "dev": true, "license": "MIT", "dependencies": { @@ -9229,6 +5438,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass/node_modules/chokidar": { @@ -9292,26 +5504,6 @@ "ajv": "^8.8.2" } }, - "node_modules/scslre": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", - "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.8.0", - "refa": "^0.12.0", - "regexp-ast-analysis": "^0.7.0" - }, - "engines": { - "node": "^14.0.0 || >=16.0.0" - } - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -9508,21 +5700,6 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -9649,6 +5826,12 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/soundtouchjs": { + "version": "0.1.30", + "resolved": "https://registry.npmjs.org/soundtouchjs/-/soundtouchjs-0.1.30.tgz", + "integrity": "sha512-qc1kMCPQ+SH8tmoPwVSpVInGAE4XFyQ5uZLm1rLyGjwD+MT2ZdBWHWureyq2akDBYBE81GI0I0FdLCNBf86zDQ==", + "license": "LGPL-2.1" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9683,162 +5866,55 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0" } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.2.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.6.19" } }, "node_modules/strip-ansi": { @@ -9853,15 +5929,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -10073,15 +6140,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10119,35 +6177,43 @@ "tslib": "2" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, "engines": { - "node": ">=16" + "node": ">=12.0.0" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": "*", + "webpack": "^5.0.0" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -10174,83 +6240,10 @@ "node": ">= 0.6" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10260,66 +6253,10 @@ "node": ">=14.17" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/universalify": { "version": "2.0.1", @@ -10340,9 +6277,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -10358,9 +6295,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -10412,12 +6350,13 @@ } }, "node_modules/vot.js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vot.js/-/vot.js-1.3.1.tgz", - "integrity": "sha512-haeNu1XyLEnrReWAkOpZVDYLKMzz8jwzpWyrufffsO+KBLX8rIZlMDcWk/u2A6fST2rLRzylK9SGsdhAYCAMUg==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/vot.js/-/vot.js-1.3.8.tgz", + "integrity": "sha512-CKCKB+VpYyrtULWvbPTIaoWKLRQ0mmTUeNmjsBMO2Dgk88hjW/1H4Wz+qCViju0nulAbuE0dtFMAWM2rnaG5fA==", "license": "MIT", "dependencies": { - "dom-parser": "^1.1.5" + "dom-parser": "^1.1.5", + "protobufjs": "^7.4.0" }, "engines": { "node": ">=18" @@ -10426,63 +6365,6 @@ "typescript": "^5.0.0" } }, - "node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -10506,19 +6388,19 @@ } }, "node_modules/webpack": { - "version": "5.95.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", - "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -10853,91 +6735,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -11050,12 +6847,6 @@ } } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yaml": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", diff --git a/package.json b/package.json index e5376e1a..2f2f179f 100644 --- a/package.json +++ b/package.json @@ -16,31 +16,31 @@ "voice-over-translation" ], "devDependencies": { + "@types/bun": "^1.1.13", "browser-id3-writer": "^6.1.0", - "browserslist": "^4.24.0", - "bun-types": "^1.1.29", + "browserslist": "^4.24.2", "enquirer": "^2.4.1", - "eslint": "^9.11.1", - "eslint-plugin-oxlint": "^0.9.8", - "eslint-plugin-sonarjs": "^2.0.2", + "eslint": "^9.14.0", + "eslint-plugin-oxlint": "^0.11.0", "eslint-webpack-plugin": "^4.2.0", - "globals": "^15.9.0", + "globals": "^15.12.0", "husky": "^9.1.6", - "lightningcss": "^1.27.0", + "lightningcss": "^1.28.1", "lint-staged": "^15.2.10", - "npm-run-all2": "^6.2.3", - "oxlint": "^0.9.8", + "npm-run-all2": "^7.0.1", + "oxlint": "^0.11.0", "patch-package": "^8.0.0", "postinstall-postinstall": "^2.1.0", - "sass": "^1.79.3", - "typescript": "^5.6.2", - "webpack": "^5.95.0", + "sass": "^1.80.6", + "ts-loader": "^9.5.1", + "typescript": "^5.6.3", + "webpack": "^5.96.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0", "webpack-monkey": "^0.2.1" }, "scripts": { - "test": "webpack build -c .webpack/config.ui-test.js", + "test:ui": "webpack build -c .webpack/config.ui-test.js", "build": "webpack build -c .webpack/webpack.config.js", "build:min": "webpack build -c .webpack/webpack.config.js --env build_type=minify", "build:all": "run-p build build:min", @@ -55,8 +55,9 @@ }, "dependencies": { "bowser": "^2.11.0", - "lit": "^3.2.0", + "chaimu": "^1.0.2", + "lit": "^3.2.1", "requestidlecallback-polyfill": "^1.0.2", - "vot.js": "^1.3.1" + "vot.js": "^1.3.8" } } diff --git a/patches/vot.js+1.3.0+006+added-udemy.patch b/patches/vot.js+1.3.3+006+added-udemy.patch similarity index 85% rename from patches/vot.js+1.3.0+006+added-udemy.patch rename to patches/vot.js+1.3.3+006+added-udemy.patch index f6ad432a..99c0dcb0 100644 --- a/patches/vot.js+1.3.0+006+added-udemy.patch +++ b/patches/vot.js+1.3.3+006+added-udemy.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/vot.js/dist/config/sites.js b/node_modules/vot.js/dist/config/sites.js -index e47e78f..410e593 100644 +index 7efee76..9c2d6a0 100644 --- a/node_modules/vot.js/dist/config/sites.js +++ b/node_modules/vot.js/dist/config/sites.js -@@ -355,6 +355,14 @@ export default [ +@@ -362,6 +362,14 @@ export default [ needExtraData: true, needBypassCSP: true, }, @@ -18,61 +18,61 @@ index e47e78f..410e593 100644 host: VideoService.watchpornto, url: "https://watchporn.to/", diff --git a/node_modules/vot.js/dist/helpers/index.d.ts b/node_modules/vot.js/dist/helpers/index.d.ts -index a7ae927..a27aac5 100644 +index 58491fa..26077c7 100644 --- a/node_modules/vot.js/dist/helpers/index.d.ts +++ b/node_modules/vot.js/dist/helpers/index.d.ts @@ -13,6 +13,7 @@ import OdyseeHelper from "./odysee.js"; - import CoursehunterHelper from "./coursehunter.js"; + import CoursehunterLikeHelper from "./coursehunterLike.js"; import TwitchHelper from "./twitch.js"; import SapHelper from "./sap.js"; +import UdemyHelper from "./udemy.js"; import LinkedinHelper from "./linkedin.js"; import VimeoHelper from "./vimeo.js"; - export * as MailRuHelper from "./mailru.js"; -@@ -29,6 +30,7 @@ export * as OdyseeHelper from "./odysee.js"; - export * as CoursehunterHelper from "./coursehunter.js"; + import YandexDiskHelper from "./yandexdisk.js"; +@@ -34,6 +35,7 @@ export * as OdyseeHelper from "./odysee.js"; + export * as CoursehunterLikeHelper from "./coursehunterLike.js"; export * as TwitchHelper from "./twitch.js"; export * as SapHelper from "./sap.js"; +export * as UdemyHelper from "./udemy.js"; export * as LinkedinHelper from "./linkedin.js"; export * as VimeoHelper from "./vimeo.js"; - export declare const availableHelpers: { -@@ -46,6 +48,7 @@ export declare const availableHelpers: { - coursehunter: typeof CoursehunterHelper; + export * as YandexDiskHelper from "./yandexdisk.js"; +@@ -56,6 +58,7 @@ export declare const availableHelpers: { + coursehunterLike: typeof CoursehunterLikeHelper; twitch: typeof TwitchHelper; sap: typeof SapHelper; + udemy: typeof UdemyHelper; linkedin: typeof LinkedinHelper; vimeo: typeof VimeoHelper; - }; + yandexdisk: typeof YandexDiskHelper; diff --git a/node_modules/vot.js/dist/helpers/index.js b/node_modules/vot.js/dist/helpers/index.js -index ec204a1..e52597f 100644 +index 8f0e60a..28a55a5 100644 --- a/node_modules/vot.js/dist/helpers/index.js +++ b/node_modules/vot.js/dist/helpers/index.js @@ -13,6 +13,7 @@ import OdyseeHelper from "./odysee.js"; - import CoursehunterHelper from "./coursehunter.js"; + import CoursehunterLikeHelper from "./coursehunterLike.js"; import TwitchHelper from "./twitch.js"; import SapHelper from "./sap.js"; +import UdemyHelper from "./udemy.js"; import LinkedinHelper from "./linkedin.js"; import VimeoHelper from "./vimeo.js"; - export * as MailRuHelper from "./mailru.js"; -@@ -29,6 +30,7 @@ export * as OdyseeHelper from "./odysee.js"; - export * as CoursehunterHelper from "./coursehunter.js"; + import YandexDiskHelper from "./yandexdisk.js"; +@@ -34,6 +35,7 @@ export * as OdyseeHelper from "./odysee.js"; + export * as CoursehunterLikeHelper from "./coursehunterLike.js"; export * as TwitchHelper from "./twitch.js"; export * as SapHelper from "./sap.js"; +export * as UdemyHelper from "./udemy.js"; export * as LinkedinHelper from "./linkedin.js"; export * as VimeoHelper from "./vimeo.js"; - export const availableHelpers = { -@@ -46,6 +48,7 @@ export const availableHelpers = { - [VideoService.coursehunter]: CoursehunterHelper, + export * as YandexDiskHelper from "./yandexdisk.js"; +@@ -56,6 +58,7 @@ export const availableHelpers = { + [VideoService.coursehunterLike]: CoursehunterLikeHelper, [VideoService.twitch]: TwitchHelper, [VideoService.sap]: SapHelper, + [VideoService.udemy]: UdemyHelper, [VideoService.linkedin]: LinkedinHelper, [VideoService.vimeo]: VimeoHelper, - }; + [VideoService.yandexdisk]: YandexDiskHelper, diff --git a/node_modules/vot.js/dist/helpers/udemy.d.ts b/node_modules/vot.js/dist/helpers/udemy.d.ts new file mode 100644 index 0000000..c2b768d @@ -103,13 +103,13 @@ index 0000000..c2b768d \ No newline at end of file diff --git a/node_modules/vot.js/dist/helpers/udemy.js b/node_modules/vot.js/dist/helpers/udemy.js new file mode 100644 -index 0000000..115633d +index 0000000..1861f2e --- /dev/null +++ b/node_modules/vot.js/dist/helpers/udemy.js @@ -0,0 +1,126 @@ +import { BaseHelper } from "./base.js"; -+import debug from "../../../../src/utils/debug.js"; -+import { langTo6391 } from "../../../../src/utils/utils.js"; ++import debug from "../../../../src/utils/debug.ts"; ++import { normalizeLang } from "../utils/utils.js"; +import { localizationProvider } from "../../../../src/localization/localizationProvider.js"; +import { availableLangs } from "../consts.js"; +import sites from "../config/sites.js"; @@ -160,12 +160,12 @@ index 0000000..115633d + + findSubtitleUrl(captions, detectedLanguage) { + let subtitle = captions?.find( -+ (caption) => langTo6391(caption.locale_id) === detectedLanguage, ++ (caption) => normalizeLang(caption.locale_id) === detectedLanguage, + ); + + if (!subtitle) { + subtitle = captions?.find( -+ (caption) => langTo6391(caption.locale_id) === "en", ++ (caption) => normalizeLang(caption.locale_id) === "en", + ) ?? captions?.[0]; + } + @@ -195,7 +195,7 @@ index 0000000..115633d + + const courseLangData = await this.getCourseLang(courseId); + let { locale: { locale: courseLang } } = courseLangData; -+ courseLang = courseLang ? langTo6391(courseLang) : "en"; ++ courseLang = courseLang ? normalizeLang(courseLang) : "en"; + if (!availableLangs.includes(courseLang)) { + courseLang = "en"; + } @@ -299,26 +299,26 @@ index 0000000..0aacd4e +export {} \ No newline at end of file diff --git a/node_modules/vot.js/dist/types/yandex.d.ts b/node_modules/vot.js/dist/types/yandex.d.ts -index d070401..76b3521 100644 +index d2cee0f..555b4ac 100644 --- a/node_modules/vot.js/dist/types/yandex.d.ts +++ b/node_modules/vot.js/dist/types/yandex.d.ts @@ -59,6 +59,7 @@ export declare enum VideoService { odysee = "odysee", - coursehunter = "coursehunter", + coursehunterLike = "coursehunterLike", sap = "sap", + udemy = "udemy", watchpornto = "watchpornto", - linkedin = "linkedin" - } + linkedin = "linkedin", + ricktube = "ricktube", diff --git a/node_modules/vot.js/dist/types/yandex.js b/node_modules/vot.js/dist/types/yandex.js -index 92a4d77..3ca4e11 100644 +index 0b7b80a..520989c 100644 --- a/node_modules/vot.js/dist/types/yandex.js +++ b/node_modules/vot.js/dist/types/yandex.js @@ -49,6 +49,7 @@ export var VideoService; VideoService["odysee"] = "odysee"; - VideoService["coursehunter"] = "coursehunter"; + VideoService["coursehunterLike"] = "coursehunterLike"; VideoService["sap"] = "sap"; + VideoService["udemy"] = "udemy"; VideoService["watchpornto"] = "watchpornto"; VideoService["linkedin"] = "linkedin"; - })(VideoService || (VideoService = {})); + VideoService["ricktube"] = "ricktube"; diff --git a/patches/vot.js+1.3.1+007+added-coursera.patch b/patches/vot.js+1.3.3+007+added-coursera.patch similarity index 86% rename from patches/vot.js+1.3.1+007+added-coursera.patch rename to patches/vot.js+1.3.3+007+added-coursera.patch index e8d4553e..d2293f70 100644 --- a/patches/vot.js+1.3.1+007+added-coursera.patch +++ b/patches/vot.js+1.3.3+007+added-coursera.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/vot.js/dist/config/sites.js b/node_modules/vot.js/dist/config/sites.js -index d5d0dc9..87e664f 100644 +index 9c2d6a0..199665d 100644 --- a/node_modules/vot.js/dist/config/sites.js +++ b/node_modules/vot.js/dist/config/sites.js -@@ -364,6 +364,14 @@ export default [ +@@ -370,6 +370,14 @@ export default [ 'div[data-purpose="curriculum-item-viewer-content"] > section > div > div > div > div:nth-of-type(2)', needExtraData: true, }, @@ -42,12 +42,12 @@ index 0000000..fc46e72 \ No newline at end of file diff --git a/node_modules/vot.js/dist/helpers/coursera.js b/node_modules/vot.js/dist/helpers/coursera.js new file mode 100644 -index 0000000..0b07c60 +index 0000000..b59fbc5 --- /dev/null +++ b/node_modules/vot.js/dist/helpers/coursera.js @@ -0,0 +1,94 @@ +import { BaseHelper } from "./base.js"; -+import { langTo6391 } from "../../../../src/utils/utils.js"; ++import { normalizeLang } from "../utils/utils.js"; +import { availableLangs } from "vot.js/consts"; +import sites from "vot.js/sites"; +import { VideoService } from "../types/yandex.js"; @@ -77,12 +77,12 @@ index 0000000..0b07c60 + + findSubtitleUrl(captions, detectedLanguage) { + let subtitle = captions?.find( -+ (caption) => langTo6391(caption.srclang) === detectedLanguage, ++ (caption) => normalizeLang(caption.srclang) === detectedLanguage, + ); + + if (!subtitle) { + subtitle = captions?.find( -+ (caption) => langTo6391(caption.srclang) === "en", ++ (caption) => normalizeLang(caption.srclang) === "en", + ) || captions?.[0]; + } + @@ -103,7 +103,7 @@ index 0000000..0b07c60 + + const { primaryLanguageCodes } = await this.getCourseData(courseId); + let courseLang = primaryLanguageCodes?.[0]; -+ courseLang = courseLang ? langTo6391(courseLang) : "en"; ++ courseLang = courseLang ? normalizeLang(courseLang) : "en"; + + if (!availableLangs.includes(courseLang)) { + courseLang = "en"; @@ -142,61 +142,61 @@ index 0000000..0b07c60 +} \ No newline at end of file diff --git a/node_modules/vot.js/dist/helpers/index.d.ts b/node_modules/vot.js/dist/helpers/index.d.ts -index a27aac5..403a7a7 100644 +index 26077c7..4bb3148 100644 --- a/node_modules/vot.js/dist/helpers/index.d.ts +++ b/node_modules/vot.js/dist/helpers/index.d.ts -@@ -14,6 +14,7 @@ import CoursehunterHelper from "./coursehunter.js"; +@@ -14,6 +14,7 @@ import CoursehunterLikeHelper from "./coursehunterLike.js"; import TwitchHelper from "./twitch.js"; import SapHelper from "./sap.js"; import UdemyHelper from "./udemy.js"; +import CourseraHelper from "./coursera.js"; import LinkedinHelper from "./linkedin.js"; import VimeoHelper from "./vimeo.js"; - export * as MailRuHelper from "./mailru.js"; -@@ -31,6 +32,7 @@ export * as CoursehunterHelper from "./coursehunter.js"; + import YandexDiskHelper from "./yandexdisk.js"; +@@ -36,6 +37,7 @@ export * as CoursehunterLikeHelper from "./coursehunterLike.js"; export * as TwitchHelper from "./twitch.js"; export * as SapHelper from "./sap.js"; export * as UdemyHelper from "./udemy.js"; +export * as CourseraHelper from "./coursera.js"; export * as LinkedinHelper from "./linkedin.js"; export * as VimeoHelper from "./vimeo.js"; - export declare const availableHelpers: { -@@ -49,6 +51,7 @@ export declare const availableHelpers: { + export * as YandexDiskHelper from "./yandexdisk.js"; +@@ -59,6 +61,7 @@ export declare const availableHelpers: { twitch: typeof TwitchHelper; sap: typeof SapHelper; udemy: typeof UdemyHelper; + coursera: typeof CourseraHelper; linkedin: typeof LinkedinHelper; vimeo: typeof VimeoHelper; - }; + yandexdisk: typeof YandexDiskHelper; diff --git a/node_modules/vot.js/dist/helpers/index.js b/node_modules/vot.js/dist/helpers/index.js -index e52597f..496d6bd 100644 +index 28a55a5..9c488d4 100644 --- a/node_modules/vot.js/dist/helpers/index.js +++ b/node_modules/vot.js/dist/helpers/index.js -@@ -14,6 +14,7 @@ import CoursehunterHelper from "./coursehunter.js"; +@@ -14,6 +14,7 @@ import CoursehunterLikeHelper from "./coursehunterLike.js"; import TwitchHelper from "./twitch.js"; import SapHelper from "./sap.js"; import UdemyHelper from "./udemy.js"; +import CourseraHelper from "./coursera.js"; import LinkedinHelper from "./linkedin.js"; import VimeoHelper from "./vimeo.js"; - export * as MailRuHelper from "./mailru.js"; -@@ -31,6 +32,7 @@ export * as CoursehunterHelper from "./coursehunter.js"; + import YandexDiskHelper from "./yandexdisk.js"; +@@ -36,6 +37,7 @@ export * as CoursehunterLikeHelper from "./coursehunterLike.js"; export * as TwitchHelper from "./twitch.js"; export * as SapHelper from "./sap.js"; export * as UdemyHelper from "./udemy.js"; +export * as CourseraHelper from "./coursera.js"; export * as LinkedinHelper from "./linkedin.js"; export * as VimeoHelper from "./vimeo.js"; - export const availableHelpers = { -@@ -49,6 +51,7 @@ export const availableHelpers = { + export * as YandexDiskHelper from "./yandexdisk.js"; +@@ -59,6 +61,7 @@ export const availableHelpers = { [VideoService.twitch]: TwitchHelper, [VideoService.sap]: SapHelper, [VideoService.udemy]: UdemyHelper, + [VideoService.coursera]: CourseraHelper, [VideoService.linkedin]: LinkedinHelper, [VideoService.vimeo]: VimeoHelper, - }; + [VideoService.yandexdisk]: YandexDiskHelper, diff --git a/node_modules/vot.js/dist/types/helpers/coursera.d.ts b/node_modules/vot.js/dist/types/helpers/coursera.d.ts new file mode 100644 index 0000000..2803fc9 @@ -265,26 +265,26 @@ index 0000000..693da49 +export {} \ No newline at end of file diff --git a/node_modules/vot.js/dist/types/yandex.d.ts b/node_modules/vot.js/dist/types/yandex.d.ts -index 76b3521..e9bd65d 100644 +index 555b4ac..783def9 100644 --- a/node_modules/vot.js/dist/types/yandex.d.ts +++ b/node_modules/vot.js/dist/types/yandex.d.ts @@ -60,6 +60,7 @@ export declare enum VideoService { - coursehunter = "coursehunter", + coursehunterLike = "coursehunterLike", sap = "sap", udemy = "udemy", + coursera = "coursera", watchpornto = "watchpornto", - linkedin = "linkedin" - } + linkedin = "linkedin", + ricktube = "ricktube", diff --git a/node_modules/vot.js/dist/types/yandex.js b/node_modules/vot.js/dist/types/yandex.js -index 3ca4e11..2dcd661 100644 +index 520989c..963c358 100644 --- a/node_modules/vot.js/dist/types/yandex.js +++ b/node_modules/vot.js/dist/types/yandex.js @@ -50,6 +50,7 @@ export var VideoService; - VideoService["coursehunter"] = "coursehunter"; + VideoService["coursehunterLike"] = "coursehunterLike"; VideoService["sap"] = "sap"; VideoService["udemy"] = "udemy"; + VideoService["coursera"] = "coursera"; VideoService["watchpornto"] = "watchpornto"; VideoService["linkedin"] = "linkedin"; - })(VideoService || (VideoService = {})); + VideoService["ricktube"] = "ricktube"; diff --git a/patches/vot.js+1.1.0+001+change-imports.patch b/patches/vot.js+1.3.8+001+change-imports.patch similarity index 85% rename from patches/vot.js+1.1.0+001+change-imports.patch rename to patches/vot.js+1.3.8+001+change-imports.patch index 15412337..ae973576 100644 --- a/patches/vot.js+1.1.0+001+change-imports.patch +++ b/patches/vot.js+1.3.8+001+change-imports.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/vot.js/dist/protos/yandex.d.ts b/node_modules/vot.js/dist/protos/yandex.d.ts -index 683e776..57ed99f 100644 +index faf4237..88d81fc 100644 --- a/node_modules/vot.js/dist/protos/yandex.d.ts +++ b/node_modules/vot.js/dist/protos/yandex.d.ts @@ -1,4 +1,4 @@ @@ -9,7 +9,7 @@ index 683e776..57ed99f 100644 export declare enum StreamInterval { NO_CONNECTION = 0, diff --git a/node_modules/vot.js/dist/protos/yandex.js b/node_modules/vot.js/dist/protos/yandex.js -index a05784f..3cc49f6 100644 +index ee9c885..8020466 100644 --- a/node_modules/vot.js/dist/protos/yandex.js +++ b/node_modules/vot.js/dist/protos/yandex.js @@ -1,4 +1,4 @@ @@ -19,11 +19,11 @@ index a05784f..3cc49f6 100644 export var StreamInterval; (function (StreamInterval) { diff --git a/node_modules/vot.js/dist/secure.js b/node_modules/vot.js/dist/secure.js -index 531d1ba..6f2ea63 100644 +index 46df1a1..cf8dc02 100644 --- a/node_modules/vot.js/dist/secure.js +++ b/node_modules/vot.js/dist/secure.js @@ -1,4 +1,3 @@ -import crypto from "node:crypto"; import config from "./config/config.js"; - const utf8Encoder = new TextEncoder(); - async function signHMAC(hashName, hmac, data) { + import Logger from "./utils/logger.js"; + const utf8Encoder = new TextEncoder(); \ No newline at end of file diff --git a/patches/vot.js+1.2.1+002+added-general.patch b/patches/vot.js+1.3.8+002+added-general.patch similarity index 86% rename from patches/vot.js+1.2.1+002+added-general.patch rename to patches/vot.js+1.3.8+002+added-general.patch index 18078e32..fcb09072 100644 --- a/patches/vot.js+1.2.1+002+added-general.patch +++ b/patches/vot.js+1.3.8+002+added-general.patch @@ -1,17 +1,17 @@ diff --git a/node_modules/vot.js/dist/client.js b/node_modules/vot.js/dist/client.js -index ea3a8cd..4857f88 100644 +index 36a2b47..cc9072d 100644 --- a/node_modules/vot.js/dist/client.js +++ b/node_modules/vot.js/dist/client.js -@@ -7,6 +7,8 @@ import { fetchWithTimeout, getTimestamp } from "./utils/utils.js"; - import { getVideoData } from "./utils/videoData.js"; +@@ -7,6 +7,8 @@ import { getVideoData } from "./utils/videoData.js"; import { convertVOT } from "./utils/vot.js"; import { StreamInterval } from "./protos/yandex.js"; + import Logger from "./utils/logger.js"; +import { VOTLocalizedError } from "../../../src/utils/VOTLocalizedError.js"; -+import debug from "../../../src/utils/debug.js"; - const { version } = packageInfo; ++import debug from "../../../src/utils/debug.ts"; class VOTJSError extends Error { data; -@@ -146,16 +148,17 @@ export default class VOTClient { + constructor(message, data = undefined) { +@@ -167,16 +169,17 @@ export default class VOTClient { ...headers, }); if (!res.success) { @@ -32,7 +32,7 @@ index ea3a8cd..4857f88 100644 } return { translated: true, -@@ -189,7 +192,7 @@ export default class VOTClient { +@@ -222,7 +225,7 @@ export default class VOTClient { rawVideo: url, }, headers); if (!res.success) { @@ -41,7 +41,7 @@ index ea3a8cd..4857f88 100644 } const translationData = res.data; switch (translationData.status) { -@@ -197,7 +200,7 @@ export default class VOTClient { +@@ -230,7 +233,7 @@ export default class VOTClient { throw new VOTJSError("Yandex couldn't translate video", translationData); case "success": if (!translationData.translatedUrl) { @@ -50,7 +50,7 @@ index ea3a8cd..4857f88 100644 } return { translated: true, -@@ -234,7 +237,10 @@ export default class VOTClient { +@@ -291,7 +294,10 @@ export default class VOTClient { async getSubtitles({ videoData, requestLang = this.requestLang, headers = {}, }) { const { url } = videoData; if (this.isCustomLink(url)) { @@ -62,7 +62,7 @@ index ea3a8cd..4857f88 100644 } const { secretKey, uuid } = await this.getSession("video-translation"); const body = yandexProtobuf.encodeSubtitlesRequest(url, requestLang); -@@ -268,7 +274,7 @@ export default class VOTClient { +@@ -325,7 +331,7 @@ export default class VOTClient { async translateStream({ videoData, requestLang = this.requestLang, responseLang = this.responseLang, headers = {}, }) { const { url } = videoData; if (this.isCustomLink(url)) { diff --git a/patches/vot.js+1.3.0+003+added-sites-selectors.patch b/patches/vot.js+1.3.8+003+added-sites-selectors.patch similarity index 90% rename from patches/vot.js+1.3.0+003+added-sites-selectors.patch rename to patches/vot.js+1.3.8+003+added-sites-selectors.patch index f61b586a..073bc2d4 100644 --- a/patches/vot.js+1.3.0+003+added-sites-selectors.patch +++ b/patches/vot.js+1.3.8+003+added-sites-selectors.patch @@ -1,9 +1,9 @@ diff --git a/node_modules/vot.js/dist/config/sites.js b/node_modules/vot.js/dist/config/sites.js -index 8492641..58a98ee 100644 +index f92d874..8cfbfe2 100644 --- a/node_modules/vot.js/dist/config/sites.js +++ b/node_modules/vot.js/dist/config/sites.js -@@ -2,34 +2,71 @@ import { VideoService } from "../types/yandex.js"; - import { sitesInvidious, sitesPiped, sitesProxiTok, sitesPeertube, sitesPoketube, } from "./alternativeUrls.js"; +@@ -2,39 +2,77 @@ import { VideoService } from "../types/yandex.js"; + import { sitesInvidious, sitesPiped, sitesProxiTok, sitesPeertube, sitesPoketube, sitesRicktube, sitesCoursehunterLike, } from "./alternativeUrls.js"; export default [ { + additionalData: "mobile", @@ -45,16 +45,22 @@ index 8492641..58a98ee 100644 url: "https://youtu.be/", match: sitesPoketube, + selector: ".video-player-container", -+ }, -+ { + }, + { + host: VideoService.ricktube, + url: "https://youtu.be/", + match: sitesRicktube, ++ selector: "#oframeplayer > pjsdiv:has(video)" + }, + { + additionalData: "mobile", + host: VideoService.vk, + url: "https://vk.com/video?z=", + match: /^m.vk.(com|ru)$/, + selector: "vk-video-player", + shadowRoot: true, - }, - { ++ }, ++ { + additionalData: "clips", host: VideoService.vk, url: "https://vk.com/video?z=", @@ -75,7 +81,7 @@ index 8492641..58a98ee 100644 }, { host: VideoService.twitch, -@@ -40,22 +77,26 @@ export default [ +@@ -45,22 +83,26 @@ export default [ /^clips.twitch.tv$/, /^player.twitch.tv$/, ], @@ -102,7 +108,7 @@ index 8492641..58a98ee 100644 }, { host: VideoService.vimeo, -@@ -63,190 +104,271 @@ export default [ +@@ -68,201 +110,285 @@ export default [ match: /^player.vimeo.com$/, additionalData: "embed", needExtraData: true, @@ -179,7 +185,7 @@ index 8492641..58a98ee 100644 }, { host: VideoService.bilibili, - url: "https://www.bilibili.com/video/", + url: "https://www.bilibili.com/", match: /^(www|m|player).bilibili.com$/, + selector: ".bpx-player-video-wrap", + }, @@ -187,7 +193,7 @@ index 8492641..58a98ee 100644 + { + additionalData: "old", // /blackboard/webplayer/embed-old.html + host: VideoService.bilibili, -+ url: "https://www.bilibili.com/video/", ++ url: "https://www.bilibili.com/", + match: /^(www|m).bilibili.com$/, + selector: null, }, @@ -230,12 +236,14 @@ index 8492641..58a98ee 100644 }, { host: VideoService.yandexdisk, - url: "https://yadi.sk/i/", +- url: "https://yadi.sk/i/", - match: /^disk.yandex.ru|yadi.sk$/, ++ url: "https://yadi.sk/", + match: /^disk.yandex.ru$/, + selector: ".video-player__player > div:nth-child(1)", + eventSelector: ".video-player__player", + needBypassCSP: true, ++ needExtraData: true, }, { host: VideoService.okru, @@ -349,10 +357,10 @@ index 8492641..58a98ee 100644 needExtraData: true, }, { - host: VideoService.coursehunter, - url: "https://coursehunter.net/course/", - match: /^coursehunter.net$/, -+ selector: "#oframeplayer > pjsdiv:nth-of-type(1)", + host: VideoService.coursehunterLike, + url: "stub", + match: sitesCoursehunterLike, ++ selector: "#oframeplayer > pjsdiv:has(video)", needExtraData: true, }, { @@ -379,4 +387,17 @@ index 8492641..58a98ee 100644 + needBypassCSP: true, }, { - host: VideoService.custom, + host: VideoService.incestflix, + url: "https://www.incestflix.net/watch/", + match: /^(www.)?incestflix.(net|to|com)$/, ++ selector: "#incflix-stream", + needExtraData: true, + }, + { + host: VideoService.porntn, + url: "https://porntn.com/videos/", + match: /^porntn.com$/, ++ selector: null, + needExtraData: true, + }, + { diff --git a/patches/vot.js+1.3.0+004+fix-basic-helpers.patch b/patches/vot.js+1.3.8+004+fix-basic-helpers.patch similarity index 61% rename from patches/vot.js+1.3.0+004+fix-basic-helpers.patch rename to patches/vot.js+1.3.8+004+fix-basic-helpers.patch index 08c37fe8..8d558738 100644 --- a/patches/vot.js+1.3.0+004+fix-basic-helpers.patch +++ b/patches/vot.js+1.3.8+004+fix-basic-helpers.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/vot.js/dist/helpers/appledeveloper.js b/node_modules/vot.js/dist/helpers/appledeveloper.js -index 95db232..effa2b8 100644 +index 33f8140..dff76fa 100644 --- a/node_modules/vot.js/dist/helpers/appledeveloper.js +++ b/node_modules/vot.js/dist/helpers/appledeveloper.js -@@ -3,9 +3,7 @@ export default class AppleDeveloperHelper extends BaseHelper { +@@ -4,9 +4,7 @@ export default class AppleDeveloperHelper extends BaseHelper { API_ORIGIN = "https://developer.apple.com"; async getVideoData(videoId) { try { @@ -14,7 +14,7 @@ index 95db232..effa2b8 100644 throw new VideoHelperError("Failed to find content url"); } diff --git a/node_modules/vot.js/dist/helpers/base.js b/node_modules/vot.js/dist/helpers/base.js -index 08b294b..474b98a 100644 +index 5326048..de9c575 100644 --- a/node_modules/vot.js/dist/helpers/base.js +++ b/node_modules/vot.js/dist/helpers/base.js @@ -1,4 +1,4 @@ @@ -23,15 +23,27 @@ index 08b294b..474b98a 100644 export class VideoHelperError extends Error { constructor(message) { super(message); -@@ -12,7 +12,7 @@ export class BaseHelper { +@@ -7,17 +7,17 @@ export class VideoHelperError extends Error { + } + } + export class BaseHelper { +- API_ORIGIN = "https://example.com"; ++ API_ORIGIN = window.location.origin; + fetch; extraInfo; referer; + origin; service; -- constructor({ fetchFn = fetchWithTimeout, extraInfo = true, referer = "", service, } = {}) { -+ constructor({ fetchFn = GM_fetch, extraInfo = true, referer = document.referrer ?? window.location.origin + "/", service, } = {}) { +- constructor({ fetchFn = fetchWithTimeout, extraInfo = true, referer = "", origin = "", service, } = {}) { ++ constructor({ fetchFn = GM_fetch, extraInfo = true, referer = document.referrer ?? window.location.origin + "/", origin = window.location.origin, service, } = {}) { this.fetch = fetchFn; this.extraInfo = extraInfo; this.referer = referer; +- this.origin = /^(http(s)?):\/\//.test(String(origin)) ? origin : ""; ++ this.origin = /^(http(s)?):\/\//.test(String(origin)) ? origin : window.location.origin; + this.service = service; + } + async getVideoData(videoId) { diff --git a/node_modules/vot.js/dist/helpers/coursehunter.js b/node_modules/vot.js/dist/helpers/coursehunter.js index 3e7181b..a24039b 100644 --- a/node_modules/vot.js/dist/helpers/coursehunter.js @@ -84,21 +96,46 @@ index 3e7181b..a24039b 100644 const currentLesson = lessonsData?.[lessonId - 1]; const { file: videoUrl, duration, title } = currentLesson; if (!videoUrl) { +diff --git a/node_modules/vot.js/dist/helpers/incestflix.js b/node_modules/vot.js/dist/helpers/incestflix.js +index 0a66568..f7899f0 100644 +--- a/node_modules/vot.js/dist/helpers/incestflix.js ++++ b/node_modules/vot.js/dist/helpers/incestflix.js +@@ -1,18 +1,10 @@ +-import { parseFromString } from "dom-parser"; + import { BaseHelper, VideoHelperError } from "./base.js"; + import { proxyMedia } from "../utils/utils.js"; + import Logger from "../utils/logger.js"; + export default class IncestflixHelper extends BaseHelper { + async getVideoData(videoId) { + try { +- const res = await this.fetch(this.service?.url + videoId); +- const content = await res.text(); +- const doc = parseFromString(content.replace("", "")); +- const videoEl = doc.getElementById("incflix-stream"); +- if (!videoEl) { +- throw new VideoHelperError(`Failed to find video element for videoID ${videoId}`); +- } +- const sourceEl = videoEl.getElementsByTagName("source")?.[0]; ++ const sourceEl = document.querySelector("#incflix-stream source:first-of-type"); + if (!sourceEl) { + throw new VideoHelperError("Failed to find source element"); + } diff --git a/node_modules/vot.js/dist/helpers/kodik.js b/node_modules/vot.js/dist/helpers/kodik.js -index fbdab60..91c8c4f 100644 +index 462ede7..37483e7 100644 --- a/node_modules/vot.js/dist/helpers/kodik.js +++ b/node_modules/vot.js/dist/helpers/kodik.js -@@ -1,8 +1,7 @@ +@@ -1,9 +1,8 @@ -import { parseFromString } from "dom-parser"; import { BaseHelper, VideoHelperError } from "./base.js"; import config from "../config/config.js"; + import Logger from "../utils/logger.js"; export default class KodikHelper extends BaseHelper { - API_ORIGIN = "https://kodik.biz"; + API_ORIGIN = window.location.origin; async getSecureData(videoPath) { try { const res = await this.fetch(`${this.API_ORIGIN}${videoPath}`, { -@@ -14,7 +13,8 @@ export default class KodikHelper extends BaseHelper { +@@ -15,7 +14,8 @@ export default class KodikHelper extends BaseHelper { }); const content = await res.text(); const [videoType, videoId, hash] = videoPath.split("/").filter((a) => a); @@ -109,14 +146,15 @@ index fbdab60..91c8c4f 100644 if (!secureScript.length) { throw new VideoHelperError("Failed to find secure script"); diff --git a/node_modules/vot.js/dist/helpers/linkedin.js b/node_modules/vot.js/dist/helpers/linkedin.js -index 199b6d2..8a41858 100644 +index 9f3a065..858cfcf 100644 --- a/node_modules/vot.js/dist/helpers/linkedin.js +++ b/node_modules/vot.js/dist/helpers/linkedin.js -@@ -1,14 +1,10 @@ +@@ -1,4 +1,3 @@ -import { parseFromString } from "dom-parser"; import { BaseHelper, VideoHelperError } from "./base.js"; import { proxyMedia } from "../utils/utils.js"; - export default class LinkedinHelper extends BaseHelper { + import Logger from "../utils/logger.js"; +@@ -6,10 +5,7 @@ export default class LinkedinHelper extends BaseHelper { API_ORIGIN = "https://www.linkedin.com/learning"; async getVideoData(videoId) { try { @@ -129,10 +167,10 @@ index 199b6d2..8a41858 100644 throw new VideoHelperError(`Failed to find video element for videoID ${videoId}`); } diff --git a/node_modules/vot.js/dist/helpers/nineanimetv.js b/node_modules/vot.js/dist/helpers/nineanimetv.js -index 1519156..8493047 100644 +index 430c984..d087668 100644 --- a/node_modules/vot.js/dist/helpers/nineanimetv.js +++ b/node_modules/vot.js/dist/helpers/nineanimetv.js -@@ -91,6 +91,18 @@ export default class NineAnimeTVHelper extends BaseHelper { +@@ -92,6 +92,18 @@ export default class NineAnimeTVHelper extends BaseHelper { }; } async getVideoId(url) { @@ -152,11 +190,33 @@ index 1519156..8493047 100644 + }); } } +diff --git a/node_modules/vot.js/dist/helpers/porntn.js b/node_modules/vot.js/dist/helpers/porntn.js +index 014550b..9993417 100644 +--- a/node_modules/vot.js/dist/helpers/porntn.js ++++ b/node_modules/vot.js/dist/helpers/porntn.js +@@ -1,15 +1,12 @@ +-import { parseFromString } from "dom-parser"; + import { BaseHelper, VideoHelperError } from "./base.js"; + import { proxyMedia } from "../utils/utils.js"; + import Logger from "../utils/logger.js"; + export default class PornTNHelper extends BaseHelper { + async getVideoData(videoId) { + try { +- const res = await this.fetch(this.service?.url + videoId); +- const content = await res.text(); +- const doc = parseFromString(content.replace("", "")); ++ const content = document.body.innerHTML; + const varDelimiter = /var flashvars\s=\s/; +- const dataScript = doc ++ const dataScript = document + .getElementsByTagName("script") + .find((node) => varDelimiter.exec(node.textContent)); + if (!dataScript) { diff --git a/node_modules/vot.js/dist/helpers/reddit.js b/node_modules/vot.js/dist/helpers/reddit.js -index da527bd..c0dc090 100644 +index 3a19bda..927bde3 100644 --- a/node_modules/vot.js/dist/helpers/reddit.js +++ b/node_modules/vot.js/dist/helpers/reddit.js -@@ -3,11 +3,11 @@ export default class RedditHelper extends BaseHelper { +@@ -4,11 +4,11 @@ export default class RedditHelper extends BaseHelper { API_ORIGIN = "https://www.reddit.com"; async getVideoData(videoId) { try { @@ -174,15 +234,15 @@ index da527bd..c0dc090 100644 throw new VideoHelperError("Failed to find content url"); } diff --git a/node_modules/vot.js/dist/helpers/sap.js b/node_modules/vot.js/dist/helpers/sap.js -index 323ad90..404d658 100644 +index 6bedd99..05eaf5e 100644 --- a/node_modules/vot.js/dist/helpers/sap.js +++ b/node_modules/vot.js/dist/helpers/sap.js @@ -1,4 +1,3 @@ -import { parseFromString } from "dom-parser"; import { BaseHelper, VideoHelperError } from "./base.js"; import { normalizeLang } from "../utils/utils.js"; - export default class SapHelper extends BaseHelper { -@@ -53,21 +52,17 @@ export default class SapHelper extends BaseHelper { + import Logger from "../utils/logger.js"; +@@ -54,21 +53,17 @@ export default class SapHelper extends BaseHelper { } } async getKalturaData(videoId) { @@ -209,10 +269,10 @@ index 323ad90..404d658 100644 if (!kalturaDomain || Number.isNaN(+partnerId) || !entryId) { throw new VideoHelperError(`One of the necessary parameters for getting a link to a sap video in wasn't found for ${videoId}. Params: kalturaDomain = ${kalturaDomain}, partnerId = ${partnerId}, entryId = ${entryId}`); diff --git a/node_modules/vot.js/dist/helpers/twitch.js b/node_modules/vot.js/dist/helpers/twitch.js -index 7c9ba46..ab35bc8 100644 +index 5e6bbc3..ece8494 100644 --- a/node_modules/vot.js/dist/helpers/twitch.js +++ b/node_modules/vot.js/dist/helpers/twitch.js -@@ -2,26 +2,35 @@ import { BaseHelper, VideoHelperError } from "./base.js"; +@@ -3,26 +3,35 @@ import { BaseHelper, VideoHelperError } from "./base.js"; export default class TwitchHelper extends BaseHelper { API_ORIGIN = "https://clips.twitch.tv"; async getClipLink(pathname, clipId) { @@ -244,7 +304,7 @@ index 7c9ba46..ab35bc8 100644 + return `${channelName}/clip/${clearPathname}`; } - catch (err) { -- console.error(`Failed to get twitch clip link by pathname: ${pathname} and clip ID: ${clipId}`, err.message); +- Logger.error(`Failed to get twitch clip link by pathname: ${pathname} and clip ID: ${clipId}`, err.message); + const isEmbed = clearPathname === "embed"; + const channelLink = document.querySelector( + isEmbed @@ -265,15 +325,15 @@ index 7c9ba46..ab35bc8 100644 async getVideoId(url) { const pathname = url.pathname; diff --git a/node_modules/vot.js/dist/helpers/vimeo.js b/node_modules/vot.js/dist/helpers/vimeo.js -index e8b0a2a..68ea746 100644 +index e0baf75..f66c02c 100644 --- a/node_modules/vot.js/dist/helpers/vimeo.js +++ b/node_modules/vot.js/dist/helpers/vimeo.js @@ -1,4 +1,3 @@ -import { parseFromString } from "dom-parser"; import { BaseHelper, VideoHelperError } from "./base.js"; import { normalizeLang } from "../utils/utils.js"; - export default class VimeoHelper extends BaseHelper { -@@ -85,20 +84,7 @@ export default class VimeoHelper extends BaseHelper { + import Logger from "../utils/logger.js"; +@@ -92,20 +91,7 @@ export default class VimeoHelper extends BaseHelper { } async getPrivateVideoInfo(videoId) { try { @@ -295,3 +355,116 @@ index e8b0a2a..68ea746 100644 const videoSource = await this.getPrivateVideoSource(playerConfig.request.files); if (!videoSource) { throw new VideoHelperError("Failed to get private video source"); +diff --git a/node_modules/vot.js/dist/helpers/yandexdisk.d.ts b/node_modules/vot.js/dist/helpers/yandexdisk.d.ts +index 2507c45..c5fe05f 100644 +--- a/node_modules/vot.js/dist/helpers/yandexdisk.d.ts ++++ b/node_modules/vot.js/dist/helpers/yandexdisk.d.ts +@@ -1,5 +1,8 @@ + import { BaseHelper } from "./base.js"; + export default class YandexDiskHelper extends BaseHelper { ++ API_ORIGIN: string; ++ CLIENT_PREFIX: string; ++ getVideoData(videoId: string): Promise; + getVideoId(url: URL): Promise; + } + //# sourceMappingURL=yandexdisk.d.ts.map +\ No newline at end of file +diff --git a/node_modules/vot.js/dist/helpers/yandexdisk.js b/node_modules/vot.js/dist/helpers/yandexdisk.js +index 8ecc67a..e7ea816 100644 +--- a/node_modules/vot.js/dist/helpers/yandexdisk.js ++++ b/node_modules/vot.js/dist/helpers/yandexdisk.js +@@ -1,6 +1,92 @@ +-import { BaseHelper } from "./base.js"; ++import { BaseHelper, VideoHelperError } from "./base.js"; ++import { VOTLocalizedError } from "../../../../src/utils/VOTLocalizedError.js"; + export default class YandexDiskHelper extends BaseHelper { ++ API_ORIGIN = "https://disk.yandex.ru"; ++ CLIENT_PREFIX = "/client/disk"; ++ async getVideoData(videoId) { ++ if (!videoId.startsWith(this.CLIENT_PREFIX)) { ++ return { ++ url: this.service.url + videoId, ++ }; ++ } ++ ++ const url = new URL(window.location); ++ const dialogId = url.searchParams.get("idDialog"); ++ if (!dialogId) { ++ return undefined; ++ } ++ ++ const preloadedScript = document.querySelector("#preloaded-data"); ++ if (!preloadedScript) { ++ return undefined; ++ } ++ ++ try { ++ const preloadedData = JSON.parse(preloadedScript.innerText); ++ const { idClient, sk } = preloadedData.config; ++ const res = await this.fetch(this.API_ORIGIN + "/models/?_m=resource", { ++ method: "POST", ++ body: new URLSearchParams({ ++ idClient, ++ sk, ++ "_model.0": "resource", ++ "id.0": dialogId.replaceAll(" ", "+"), ++ }) ++ .toString() ++ .replaceAll(/%2B/g, "+"), // yandex requires this ++ headers: { ++ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", ++ }, ++ }); ++ ++ const data = await res.json(); ++ if (!data.models) { ++ throw new VideoHelperError("Failed to get resource info"); ++ } ++ ++ const model = data.models[0]; ++ const modelData = model.data; ++ if (Object.hasOwn(modelData, "error")) { ++ throw new VideoHelperError(modelData.error?.message); ++ } ++ ++ const { meta, name } = modelData; ++ const { short_url, video_info } = meta; ++ if (!video_info) { ++ throw new VideoHelperError("There's no video open right now"); ++ } ++ ++ if (!short_url) { ++ throw new VideoHelperError("VOTLimitedVideoAccess"); ++ } ++ ++ const title = name.replace(/(\.[^.]+)$/, ""); ++ ++ return { ++ url: short_url, ++ title, ++ duration: video_info.duration, ++ }; ++ } catch (err) { ++ if (err.message?.startsWith("VOT")) { ++ throw new VOTLocalizedError(err.message); ++ } ++ ++ console.error( ++ `Failed to get yandex disk video data by video ID: ${videoId}`, ++ err.message, ++ ); ++ return undefined; ++ } ++ } + async getVideoId(url) { +- return /\/i\/([^/]+)/.exec(url.pathname)?.[1]; ++ const fileId = /\/i\/([^/]+)/.exec(url.pathname)?.[1]; ++ if (fileId) { ++ return fileId; ++ } ++ ++ return url.pathname.startsWith(this.CLIENT_PREFIX) ++ ? url.pathname + url.search ++ : undefined; + } + } diff --git a/patches/vot.js+1.3.0+005+fix-videodata.patch b/patches/vot.js+1.3.8+005+fix-videodata.patch similarity index 78% rename from patches/vot.js+1.3.0+005+fix-videodata.patch rename to patches/vot.js+1.3.8+005+fix-videodata.patch index 1bbcfdd9..93bd6fd0 100644 --- a/patches/vot.js+1.3.0+005+fix-videodata.patch +++ b/patches/vot.js+1.3.8+005+fix-videodata.patch @@ -14,10 +14,18 @@ index f69bc0a..158777c 100644 //# sourceMappingURL=videoData.d.ts.map \ No newline at end of file diff --git a/node_modules/vot.js/dist/utils/videoData.js b/node_modules/vot.js/dist/utils/videoData.js -index df560cd..42b0ee3 100644 +index 2787718..f789f28 100644 --- a/node_modules/vot.js/dist/utils/videoData.js +++ b/node_modules/vot.js/dist/utils/videoData.js -@@ -8,18 +8,11 @@ class VideoDataError extends Error { +@@ -1,7 +1,6 @@ + import sites from "../config/sites.js"; + import { VideoService } from "../types/yandex.js"; + import VideoHelper, { availableHelpers, } from "../helpers/index.js"; +-import Logger from "./logger.js"; + class VideoDataError extends Error { + constructor(message) { + super(message); +@@ -9,18 +8,11 @@ class VideoDataError extends Error { this.message = message; } } @@ -29,7 +37,7 @@ index df560cd..42b0ee3 100644 - enteredURL = new URL(videoUrl); - } - catch { -- console.error(`Invalid URL: ${videoUrl}. Have you forgotten https?`); +- Logger.error(`Invalid URL: ${videoUrl}. Have you forgotten https?`); - return false; - } - const hostname = enteredURL.hostname; @@ -41,7 +49,7 @@ index df560cd..42b0ee3 100644 const isMathes = (match) => { if (match instanceof RegExp) { return match.test(hostname); -@@ -32,14 +25,14 @@ export function getService(videoUrl) { +@@ -33,14 +25,14 @@ export function getService(videoUrl) { } return false; }; @@ -59,18 +67,7 @@ index df560cd..42b0ee3 100644 const serviceHost = service.host; if (Object.keys(availableHelpers).includes(serviceHost)) { const helper = new VideoHelper(opts).getHelper(serviceHost); -@@ -72,6 +65,10 @@ export async function getVideoID(service, videoURL, opts = {}) { - else if (paramOID && paramID) { - return `video-${Math.abs(parseInt(paramOID))}_${paramID}`; - } -+ const videoBox = video.parentElement?.closest(".video_box_wrap"); -+ if (videoBox) { -+ return videoBox.id.replace("video_box_wrap", "video"); -+ } - return null; - } - case VideoService.nine_gag: -@@ -110,9 +107,16 @@ export async function getVideoID(service, videoURL, opts = {}) { +@@ -100,15 +92,22 @@ export async function getVideoID(service, videoURL, opts = {}) { case VideoService.peertube: return /\/w\/([^/]+)/.exec(url.pathname)?.[0]; case VideoService.dailymotion: { @@ -88,9 +85,7 @@ index df560cd..42b0ee3 100644 + } + return /\/video\/(\w+)\.m3u8/.exec(videoUrl)?.[1]; } - case VideoService.trovo: { - const vid = url.searchParams.get("vid"); -@@ -131,7 +135,7 @@ export async function getVideoID(service, videoURL, opts = {}) { + case VideoService.okru: { return /\/video\/(\d+)/.exec(url.pathname)?.[1]; } case VideoService.googledrive: @@ -99,7 +94,7 @@ index df560cd..42b0ee3 100644 case VideoService.newgrounds: return /([^/]+)\/(view)\/([^/]+)/.exec(url.pathname)?.[0]; case VideoService.egghead: -@@ -146,17 +150,13 @@ export async function getVideoID(service, videoURL, opts = {}) { +@@ -123,16 +122,12 @@ export async function getVideoID(service, videoURL, opts = {}) { return undefined; } } @@ -115,9 +110,8 @@ index df560cd..42b0ee3 100644 - throw new VideoDataError(`Entered unsupported link: "${url}"`); + throw new VideoDataError(`Entered unsupported link: "${service.host}"`); } - if (service.host === VideoService.peertube) { -- service.url = new URL(url).origin; -+ service.url = window.location.origin; +- const origin = new URL(url).origin; ++ const origin = window.location.origin; + if ([VideoService.peertube, VideoService.coursehunterLike].includes(service.host)) { + service.url = origin; } - if (service.rawResult) { - return { diff --git a/scripts/l10n-tui/actions/updateHash.ts b/scripts/l10n-tui/actions/updateHash.ts index 22b9fc89..5ca0c163 100644 --- a/scripts/l10n-tui/actions/updateHash.ts +++ b/scripts/l10n-tui/actions/updateHash.ts @@ -8,7 +8,7 @@ import { prettyStringify } from "../utils"; async function updateHash() { const files = await getAllLocales(); - const hashes = {}; + const hashes: Record = {}; for await (const file of files) { const locale = file.replace(".json", ""); const localeText = await loadTextFromLocale(file); @@ -22,10 +22,10 @@ async function updateHash() { const localesCount = Object.keys(hashes).length.toString(); console.log( - `${styleText( - "green", - "√", - )} Successfully updated hashes for ${styleText("yellow", localesCount)} locales!`, + `${styleText("green", "√")} Successfully updated hashes for ${styleText( + "yellow", + localesCount, + )} locales!`, ); } diff --git a/scripts/l10n-tui/utils.ts b/scripts/l10n-tui/utils.ts index 58acd989..afad63cd 100644 --- a/scripts/l10n-tui/utils.ts +++ b/scripts/l10n-tui/utils.ts @@ -38,7 +38,9 @@ export async function translate(text: string, langPair: string = "en-ru") { return ((await res.json()) as { text: string[] }).text[0]; } catch (err) { console.log( - `Failed to fetch translation for ${text}. Reason: ${err.message}`, + `Failed to fetch translation for ${text}. Reason: ${ + (err as Error).message + }`, ); throw new Error("Internal server error"); } diff --git a/scripts/wiki-gen/SITES-EN.md b/scripts/wiki-gen/SITES-EN.md index 77900045..7561c463 100644 --- a/scripts/wiki-gen/SITES-EN.md +++ b/scripts/wiki-gen/SITES-EN.md @@ -111,6 +111,14 @@ Available (sub)domains: - `poke.uk2.littlekai.co.uk` - `poke.blahai.gay` +## Ricktube + +Status: [✅] Working + +Available (sub)domains: + +- `ricktube.ru` + ## Vk Status: [✅] Working @@ -220,6 +228,10 @@ Available paths: - /CHANNEL_ID/VIDEO_ID - /VIDEO_ID +Limitations: + +- To ensure that the script works, you need to [enable the "Bypass Media CSP" setting](https://github.com/ilyhalight/voice-over-translation/wiki/%5BEN%5D-FAQ) in the extension or delete the CSP in another way + ## Xvideos Status: [✅] Working @@ -673,17 +685,14 @@ Available paths: - /@USERNAME/VIDEO_NAME -## Coursehunter +## Coursehunterlike Status: [✅] Working Available (sub)domains: - `coursehunter.net` - -Available paths: - -- /course/COURSE_ID +- `coursetrain.net` ## Sap @@ -764,6 +773,20 @@ Limitations: - To ensure that the script works, you need to [enable the "Bypass Media CSP" setting](https://github.com/ilyhalight/voice-over-translation/wiki/%5BEN%5D-FAQ) in the extension or delete the CSP in another way +## Incestflix + +Status: [✅] Working + +Available (sub)domains: + +- `(www.)?incestflix.net` +- `(www.)?incestflix.to` +- `(www.)?incestflix.com` + +Available paths: + +- /watch/VIDEO_ID + ## Direct link to MP4/WEBM Status: [✅] Working diff --git a/scripts/wiki-gen/SITES-RU.md b/scripts/wiki-gen/SITES-RU.md index 8a58455c..e0dbee6d 100644 --- a/scripts/wiki-gen/SITES-RU.md +++ b/scripts/wiki-gen/SITES-RU.md @@ -111,6 +111,14 @@ - `poke.uk2.littlekai.co.uk` - `poke.blahai.gay` +## Ricktube + +Статус: [✅] Работает + +Доступные (под)домены: + +- `ricktube.ru` + ## Vk Статус: [✅] Работает @@ -220,6 +228,10 @@ - /CHANNEL_ID/VIDEO_ID - /VIDEO_ID +Ограничения: + +- Для гарантированной работы скрипта необходимо [включить настройку "Обход Media CSP"](https://github.com/ilyhalight/voice-over-translation/wiki/%5BRU%5D-FAQ) в расширение или удалить CSP другим способом + ## Xvideos Статус: [✅] Работает @@ -673,17 +685,14 @@ - /@USERNAME/VIDEO_NAME -## Coursehunter +## Coursehunterlike Статус: [✅] Работает Доступные (под)домены: - `coursehunter.net` - -Доступные пути: - -- /course/COURSE_ID +- `coursetrain.net` ## Sap @@ -764,6 +773,20 @@ - Для гарантированной работы скрипта необходимо [включить настройку "Обход Media CSP"](https://github.com/ilyhalight/voice-over-translation/wiki/%5BRU%5D-FAQ) в расширение или удалить CSP другим способом +## Incestflix + +Статус: [✅] Работает + +Доступные (под)домены: + +- `(www.)?incestflix.net` +- `(www.)?incestflix.to` +- `(www.)?incestflix.com` + +Доступные пути: + +- /watch/VIDEO_ID + ## Direct link to MP4/WEBM Статус: [✅] Работает diff --git a/scripts/wiki-gen/data.js b/scripts/wiki-gen/data.js index 972d22aa..72e3a863 100644 --- a/scripts/wiki-gen/data.js +++ b/scripts/wiki-gen/data.js @@ -104,7 +104,7 @@ const siteData = { paths: ["/i/FILE_ID"], limits: [locales.workOnlyWithPublicLinks], }, - coursehunter: { + coursehunterLike: { paths: ["/course/COURSE_ID"], }, "ok.ru": { @@ -170,6 +170,9 @@ const siteData = { linkedin: { paths: ["/learning/COURSE_NAME/LECTURE_NAME"], }, + incestflix: { + paths: ["/watch/VIDEO_ID"], + }, directlink: { paths: ["/*.mp4", "/*.webm"], limits: [locales.noLocalLinks], @@ -203,4 +206,6 @@ const extraData = { // }, }; -export { siteData, extraData }; +const sitesBlackList = ["porntn"]; + +export { siteData, extraData, sitesBlackList }; diff --git a/scripts/wiki-gen/index.js b/scripts/wiki-gen/index.js index 2836acd1..48c672d6 100644 --- a/scripts/wiki-gen/index.js +++ b/scripts/wiki-gen/index.js @@ -5,7 +5,11 @@ import * as path from "node:path"; import sites from "vot.js/sites"; import locales from "./locales"; -import { siteData, extraData } from "./data"; +import { siteData, extraData, sitesBlackList } from "./data"; + +const availableSites = sites.filter( + (site) => !sitesBlackList.includes(site.host), +); function ucFirst(str) { if (!str) return str; @@ -86,10 +90,10 @@ function removeDuplicatesKeepLast(arr, key) { return Array.from(map.values()); } -function genMarkdown(sites, lang = "ru") { - let sitesData = sites.map((site, idx) => { +function genMarkdown(supportedSites, lang = "ru") { + let sitesData = supportedSites.map((site, idx) => { let domains = getDomains(site.match); - let prev = idx > 0 ? sites[idx - 1] : null; + let prev = idx > 0 ? supportedSites[idx - 1] : null; if (prev?.host === site.host) { let previousDomains = getDomains(prev.match); domains = Array.from(new Set([...domains, ...previousDomains])); @@ -110,13 +114,17 @@ function genMarkdown(sites, lang = "ru") { let limits = ""; if (limitsData?.length) { - limits = `\n\n${locales.limitations[lang]}:\n\n- ${limitsData.map((limit) => limit[lang]).join("\n- ")}`; + limits = `\n\n${locales.limitations[lang]}:\n\n- ${limitsData + .map((limit) => limit[lang]) + .join("\n- ")}`; } const pathsData = hasData ? Array.from(siteData[site.host].paths) : []; let paths = ""; if (pathsData.length) { - paths = `\n\n${locales.availabledPaths[lang]}:\n\n- ${pathsData.join("\n- ")}`; + paths = `\n\n${locales.availabledPaths[lang]}:\n\n- ${pathsData.join( + "\n- ", + )}`; } return `## ${ucFirst(site.host)} @@ -130,7 +138,7 @@ ${locales.availabledDomains[lang]}: } async function main() { - const supportedSites = sites.map((site) => { + const supportedSites = availableSites.map((site) => { const host = site.host.toLowerCase(); const extra = Object.hasOwn(extraData, host); diff --git a/src/config/config.js b/src/config/config.js index 16456be2..088d82e1 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -22,6 +22,14 @@ const translateUrls = { deepl: "https://translate-deepl.toil.cc/translate", }; +const proxyOnlyExtensions = [ + "Violentmonkey", + "FireMonkey", + "Greasemonkey", + "AdGuard", + "OrangeMonkey", +]; + export { workerHost, m3u8ProxyHost, @@ -35,4 +43,5 @@ export { defaultDetectService, defaultAutoVolume, maxAudioVolume, + proxyOnlyExtensions, }; diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 00000000..b44fc466 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,3 @@ +const DEBUG_MODE: boolean; +const IS_BETA_VERSION: boolean; +const AVAILABLE_LOCALES: string[]; diff --git a/src/headers.json b/src/headers.json index f657951f..8e57f878 100644 --- a/src/headers.json +++ b/src/headers.json @@ -1,7 +1,7 @@ { "name": "[VOT] - Voice Over Translation", "description": "A small extension that adds a Yandex Browser video translation to other browsers", - "version": "1.7.0", + "version": "1.7.1", "author": "sodapng, mynovelhost, Toil, SashaXser, MrSoczekXD", "namespace": "vot", "icon": "https://translate.yandex.ru/icons/favicon.ico", @@ -32,8 +32,7 @@ "*://*.dailymotion.com/*", "*://*.ok.ru/*", "*://trovo.live/*", - "*://disk.yandex.ru/i/*", - "*://coursehunter.net/*", + "*://disk.yandex.ru/*", "*://youtube.googleapis.com/embed/*", "*://*.banned.video/*", "*://*.weverse.io/*", @@ -55,6 +54,9 @@ "*://learning.sap.com/*", "*://*.watchporn.to/*", "*://*.linkedin.com/*", + "*://*.ricktube.ru/*", + "*://*.incestflix.net/*", + "*://*.incestflix.to/*", "*://*/*.mp4*", "*://*/*.webm*" ], diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 00000000..23d1d082 --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1,26 @@ +export type VideoData = object; // add typings for object +export type Site = object; // add typings for object + +export class VideoHandler { + translateFromLang: string; + translateToLang: string; + + timer: ReturnType | undefined; + videoData: string | VideoData; + + firstPlay: boolean; + audioContext: AudioContext | undefined; + + dragging: boolean | undefined; + + // set in methods + video: HTMLVideoElement; + data: Record; + constructor(video: HTMLVideoElement, container: HTMLElement, site: Site); + + transformBtn(status: "none" | "success" | "error", text: string): this; + setLoadingBtn(loading: boolean = false): this; + getVideoVolume(): number; + setVideoVolume(volume: number): this; + isMuted(): boolean; +} diff --git a/src/index.js b/src/index.js index ca9be875..973ff830 100644 --- a/src/index.js +++ b/src/index.js @@ -16,18 +16,22 @@ import { maxAudioVolume, votBackendUrl, workerHost, + proxyOnlyExtensions, } from "./config/config.js"; import { availableLocales, localizationProvider, } from "./localization/localizationProvider.js"; +import { SubtitlesWidget, fetchSubtitles, getSubtitles } from "./subtitles.js"; + import ui from "./ui.js"; +import youtubeUtils from "./utils/youtubeUtils.js"; +import debug from "./utils/debug.ts"; + import { VOTLocalizedError } from "./utils/VOTLocalizedError.js"; -import debug from "./utils/debug.js"; import { GM_fetch, initHls, - initAudioContext, isPiPAvailable, lang, secsToStrTime, @@ -36,11 +40,6 @@ import { getTimestamp, } from "./utils/utils.js"; import { syncVolume } from "./utils/volume.js"; - -import { SubtitlesWidget, fetchSubtitles, getSubtitles } from "./subtitles.js"; - -import youtubeUtils from "./utils/youtubeUtils.js"; - import { VideoObserver } from "./utils/VideoObserver.js"; import { votStorage } from "./utils/storage.js"; import { @@ -48,22 +47,9 @@ import { translate, translateServices, } from "./utils/translateApis.js"; +import Chaimu, { initAudioContext } from "chaimu"; const browserInfo = Bowser.getParser(window.navigator.userAgent).getResult(); -const cfOnlyExtensions = [ - "Violentmonkey", - "FireMonkey", - "Greasemonkey", - "AdGuard", - "OrangeMonkey", -]; -const videoLipSyncEvents = [ - "playing", - "ratechange", - "play", - "waiting", - "pause", -]; function genOptionsByOBJ(obj, conditionString) { return obj.map((code) => ({ @@ -81,20 +67,48 @@ const createHotkeyText = (hotkey) => : localizationProvider.get("VOTCreateTranslationHotkey"); class VideoHandler { - // translate properties - translateFromLang = "en"; // default language of video - translateToLang = lang; // default language of audio response + /** + * default language of video + * + * @type {import("./index").VideoHandler['translateFromLang']} + */ + translateFromLang = "en"; + /** + * default language of audio response + * + * @type {import("./index").VideoHandler['translateToLang']} + */ + translateToLang = lang; + + /** + * @type {import("./index").VideoHandler['timer']} + */ timer; + /** + * @type {import("./index").VideoHandler['videoData']} + */ videoData = ""; + + /** + * @type {import("./index").VideoHandler['firstPlay']} + */ firstPlay = true; - audio = new Audio(); + + /** + * @type {import("./index").VideoHandler['audioContext']} + */ audioContext = initAudioContext(); hls = initHls(); // debug enabled only in dev mode votClient; + /** + * @type {import("chaimu").default} + */ + audioPlayer; + videoTranslations = []; videoTranslationTTL = 7200; cachedTranslation; @@ -112,7 +126,11 @@ class VideoHandler { subtitlesList = []; subtitlesListVideoId = null; - // button move + /** + * button move + * + * @type {import("./index").VideoHandler['dragging']} + */ dragging; /** @@ -298,6 +316,40 @@ class VideoHandler { } } + getPreferAudio() { + if (!this.audioContext) { + return true; + } + + if (!this.data.newAudioPlayer) { + return true; + } + + if (this.videoData.isStream) { + // streams use old player for work with hls + return true; + } + + if (this.data.newAudioPlayer && !this.data.onlyBypassMediaCSP) { + return false; + } + + return !this.site.needBypassCSP; + } + + createPlayer() { + const preferAudio = this.getPreferAudio(); + debug.log("preferAudio:", preferAudio); + this.audioPlayer = new Chaimu({ + video: this.video, + debug: DEBUG_MODE, + // debug: true, + fetchFn: GM_fetch, + preferAudio, + }); + return this; + } + /** * Initializes the VideoHandler class by setting up data promises, fetching data, initializing UI elements, and setting up event listeners. */ @@ -322,8 +374,12 @@ class VideoHandler { responseLanguage: votStorage.get("responseLanguage", lang), defaultVolume: votStorage.get("defaultVolume", 100), audioProxy: votStorage.get("audioProxy", 0), - bypassMediaCSP: votStorage.get( - "bypassMediaCSP", + onlyBypassMediaCSP: votStorage.get( + "onlyBypassMediaCSP", + Number(!!this.audioContext), + ), + newAudioPlayer: votStorage.get( + "newAudioPlayer", Number(!!this.audioContext), ), showPiPButton: votStorage.get("showPiPButton", 0), @@ -375,7 +431,7 @@ class VideoHandler { if ( !this.data.translateProxyEnabled && GM_info?.scriptHandler && - cfOnlyExtensions.includes(GM_info.scriptHandler) + proxyOnlyExtensions.includes(GM_info.scriptHandler) ) { this.data.translateProxyEnabled = 1; await votStorage.set("translateProxyEnabled", 1); @@ -422,9 +478,9 @@ class VideoHandler { this.initUI(); this.initUIEvents(); - this.initAudioBooster(); this.videoData = await this.getVideoData(); + this.createPlayer(); this.setSelectMenuValues( this.videoData.detectedLanguage, this.data.responseLanguage ?? "ru", @@ -441,8 +497,7 @@ class VideoHandler { /** * Set translation button status and text * - * @param {"none"|"success"|"error"} status - button status - * @param {string} text - visible button text + * @type {import('./index').VideoHandler['transformBtn']} */ transformBtn(status, text) { this.votButton.container.dataset.status = status; @@ -452,25 +507,17 @@ class VideoHandler { this.setLoadingBtn(isLoading); this.votButton.label.textContent = text; this.votButton.container.title = status === "error" ? text : ""; + return this; } /** * Set loading icon to translation button * - * @param {boolean} loading + * @type {import('./index').VideoHandler['setLoadingBtn']} */ setLoadingBtn(loading = false) { this.votButton.container.dataset.loading = loading; - } - - initAudioBooster() { - this.audio.crossOrigin = "anonymous"; - if (this.audioContext) { - this.gainNode = this.audioContext.createGain(); - this.gainNode.connect(this.audioContext.destination); - this.audioSource = this.audioContext.createMediaElementSource(this.audio); - this.audioSource.connect(this.gainNode); - } + return this; } initUI() { @@ -859,20 +906,40 @@ class VideoHandler { this.votAudioProxyCheckbox.container, ); - this.votBypassMediaCSPCheckbox = ui.createCheckbox( - localizationProvider.get("VOTBypassMediaCSP") + + this.votNewAudioPlayerCheckbox = ui.createCheckbox( + localizationProvider.get("VOTNewAudioPlayer"), + this.data?.newAudioPlayer ?? false, + ); + if (!this.audioContext) { + this.votNewAudioPlayerCheckbox.input.disabled = true; + this.votNewAudioPlayerCheckbox.container.title = + localizationProvider.get("VOTNeedWebAudioAPI"); + } + this.votSettingsDialog.bodyContainer.appendChild( + this.votNewAudioPlayerCheckbox.container, + ); + + this.votOnlyBypassMediaCSPCheckbox = ui.createCheckbox( + localizationProvider.get("VOTOnlyBypassMediaCSP") + (this.site.needBypassCSP ? ` (${localizationProvider.get("VOTMediaCSPEnabledOnSite")})` : ""), - this.data?.bypassMediaCSP ?? false, + this.data?.onlyBypassMediaCSP ?? false, + ); + this.votOnlyBypassMediaCSPCheckbox.container.classList.add( + "vot-checkbox-sub", ); if (!this.audioContext) { - this.votBypassMediaCSPCheckbox.input.disabled = true; - this.votBypassMediaCSPCheckbox.container.title = + this.votOnlyBypassMediaCSPCheckbox.container.title = localizationProvider.get("VOTNeedWebAudioAPI"); } + this.votOnlyBypassMediaCSPCheckbox.input.disabled = + !this.data.newAudioPlayer && this.audioContext; + if (!this.data.newAudioPlayer) { + this.votOnlyBypassMediaCSPCheckbox.container.hidden = true; + } this.votSettingsDialog.bodyContainer.appendChild( - this.votBypassMediaCSPCheckbox.container, + this.votOnlyBypassMediaCSPCheckbox.container, ); // ABOUT @@ -975,14 +1042,22 @@ class VideoHandler { } async handleTranslationBtnClick() { - if (this.audio.src || this.playSound) { - debug.log("[click translationBtn] audio.src is not empty"); + debug.log( + "[click translationBtn]", + this.audioPlayer, + this.audioPlayer.player, + ); + if (this.audioPlayer.player.src) { + debug.log( + "[click translationBtn] audio.src is not empty", + this.audioPlayer.player.src, + ); this.stopTranslate(); return; } if (this.hls.url) { - debug.log("[click translationBtn] hls is not empty"); + debug.log("[click translationBtn] hls is not empty", this.hls.url); this.stopTranslate(); return; } @@ -1129,9 +1204,7 @@ class VideoHandler { this.votSettingsDialog.container.hidden = !this.votSettingsDialog.container.hidden; if (document.fullscreenElement || document.webkitFullscreenElement) { - // eslint-disable-next-line sonarjs/no-unused-expressions document.webkitExitFullscreen && document.webkitExitFullscreen(); - // eslint-disable-next-line sonarjs/no-unused-expressions document.exitFullscreen && document.exitFullscreen(); } }); @@ -1155,7 +1228,7 @@ class VideoHandler { this.votVideoTranslationVolumeSlider.label.querySelector( "strong", ).textContent = `${this.data.defaultVolume}%`; - this.setAudioVolume(this.data.defaultVolume / 100); + this.audioPlayer.player.volume = this.data.defaultVolume / 100; if (!this.data.syncVolume) { return; } @@ -1523,15 +1596,39 @@ class VideoHandler { })(); }); - this.votBypassMediaCSPCheckbox.input.addEventListener("change", (e) => { + this.votOnlyBypassMediaCSPCheckbox.input.addEventListener( + "change", + (e) => { + (async () => { + this.data.onlyBypassMediaCSP = Number(e.target.checked); + await votStorage.set( + "onlyBypassMediaCSP", + this.data.onlyBypassMediaCSP, + ); + debug.log( + "onlyBypassMediaCSP value changed. New value: ", + this.data.onlyBypassMediaCSP, + ); + this.stopTranslate(); + this.createPlayer(); + })(); + }, + ); + + this.votNewAudioPlayerCheckbox.input.addEventListener("change", (e) => { (async () => { - this.data.bypassMediaCSP = Number(e.target.checked); - await votStorage.set("bypassMediaCSP", this.data.bypassMediaCSP); + const checked = e.target.checked; + this.data.newAudioPlayer = Number(checked); + await votStorage.set("newAudioPlayer", this.data.newAudioPlayer); debug.log( - "bypassMediaCSP value changed. New value: ", - this.data.bypassMediaCSP, + "newAudioPlayer value changed. New value: ", + this.data.newAudioPlayer, ); this.stopTranslate(); + this.createPlayer(); + + this.votOnlyBypassMediaCSPCheckbox.input.disabled = + this.votOnlyBypassMediaCSPCheckbox.container.hidden = !checked; })(); }); @@ -1625,7 +1722,7 @@ class VideoHandler { this.site.additionalData !== "mobile" ) { this.syncVolumeObserver = new MutationObserver((mutations) => { - if (!this.audio.src || !this.data.syncVolume) { + if (!this.audioPlayer.player.src || !this.data.syncVolume) { return; } @@ -1649,7 +1746,7 @@ class VideoHandler { const finalVolume = Math.round(videoVolume); this.data.defaultVolume = finalVolume; - this.setAudioVolume(this.data.defaultVolume / 100); + this.audioPlayer.player.volume = this.data.defaultVolume / 100; this.syncVolumeWrapper("video", finalVolume); } } @@ -1916,7 +2013,11 @@ class VideoHandler { await this.updateSubtitlesLangSelect(); } - // Get video volume in 0.00-1.00 format + /** + * Get video volume in 0.00-1.00 format + * + * @type {import('./index').VideoHandler['getVideoVolume']} + */ getVideoVolume() { let videoVolume = this.video?.volume; if (["youtube", "googledrive"].includes(this.site.host)) { @@ -1926,30 +2027,26 @@ class VideoHandler { return videoVolume; } - // Set video volume in 0.00-1.00 format + /** + * Set video volume in 0.00-1.00 format + * + * @type {import('./index').VideoHandler['setVideoVolume']} + */ setVideoVolume(volume) { if (["youtube", "googledrive"].includes(this.site.host)) { const videoVolume = youtubeUtils.setVideoVolume(volume); if (videoVolume) { - return; + return this; } } this.video.volume = volume; + return this; } - getAudioVolume() { - return this.gainNode ? this.gainNode.gain.value : this.audio.volume; - } - - setAudioVolume(volume) { - if (this.gainNode) { - return (this.gainNode.gain.value = volume); - } - - return (this.audio.volume = volume); - } - + /** + * @type {import('./index').VideoHandler['isMuted']} + */ isMuted() { return ["youtube", "googledrive"].includes(this.site.host) ? youtubeUtils.isMuted() @@ -2000,7 +2097,7 @@ class VideoHandler { const currentSliderValue = Number(slider.input.value); const finalValue = syncVolume( - fromType === "translation" ? this.video : this.audio, + fromType === "translation" ? this.video : this.audioPlayer.player, newVolume, currentSliderValue, fromType === "translation" ? this.tempVolume : this.tempOriginalVolume, @@ -2074,7 +2171,7 @@ class VideoHandler { "dailymotion", "trovo", "yandexdisk", - "coursehunter", + "coursehunterLike", "archive", "nineanimetv", "directlink", @@ -2103,146 +2200,13 @@ class VideoHandler { return true; } - /** - * Synchronizes the lip sync of the video and audio context. - * - * @param {boolean|string} [mode=false] - The lip sync mode. - * @return {void} - */ - lipsyncAudioContext(mode = false) { - if (this.playSound) { - this.playSound.playbackRate.value = this.video.playbackRate; - } - - if (!mode) { - debug.log("lipsync mode is not set"); - return; - } - - if (mode == "play") { - debug.log("lipsync mode is play"); - try { - this.playSound.start(0, this.audio.currentTime); - } catch { - /* empty */ - } - return; - } - - // video is inactive - if (["pause", "stop", "waiting"].includes(mode)) { - debug.log(`lipsync mode is ${mode}`); - try { - this.playSound.stop(); - } catch { - /* empty */ - } - - this.playSound = this.audioContext.createBufferSource(); - this.playSound.buffer = this.audioBuffer; - this.playSound.connect(this.gainNode); - return; - } - - if (mode == "playing") { - debug.log("lipsync mode is playing"); - try { - this.playSound.start(0, this.audio.currentTime); - } catch { - /* empty */ - } - } - } - - /** - * Synchronizes the lip sync of the video and audio element. - * - * @param {boolean|string} [mode=false] - The lip sync mode. - * @return {void} - */ - lipsyncAudio(mode = false) { - if (!mode) { - debug.log("lipsync mode is not set"); - return; - } - - if (mode == "play") { - debug.log("lipsync mode is play"); - const audioPromise = this.audio.play(); - if (audioPromise !== undefined) { - audioPromise.catch(async (e) => { - console.error("[VOT]", e); - if (e.name === "NotAllowedError") { - this.transformBtn( - "error", - localizationProvider.get("grantPermissionToAutoPlay"), - ); - throw new VOTLocalizedError("grantPermissionToAutoPlay"); - } else if (e.name === "NotSupportedError") { - this.data.audioProxy = 1; - await votStorage.set("audioProxy", 1); - } - }); - } - return; - } - - // video is inactive - if (["pause", "stop", "waiting"].includes(mode)) { - debug.log(`lipsync mode is ${mode}`); - this.audio.pause(); - return; - } - - if (mode == "playing") { - debug.log("lipsync mode is playing"); - this.audio.play(); - } - } - - /** - * Synchronizes the lip sync of the video and audio elements. - * - * @param {boolean|string} [mode=false] - The lip sync mode. - * @return {void} - */ - lipSync(mode = false) { - debug.log("lipsync video", this.video); - if (!this.video) { - return; - } - this.audio.currentTime = this.video.currentTime; - this.audio.playbackRate = this.video.playbackRate; - - return this.needBypassCSP() - ? this.lipsyncAudioContext(mode) - : this.lipsyncAudio(mode); - } - - // Define a function to handle common events - handleVideoEvent = (event) => { - debug.log(`video ${event.type}`); - this.lipSync(event.type); - }; - - needBypassCSP = () => this.data.bypassMediaCSP && this.site.needBypassCSP; - // Default actions on stop translate stopTranslate() { - for (const e of videoLipSyncEvents) { - this.video.removeEventListener(e, this.handleVideoEvent); - } - if (this.playSound) { - try { - this.playSound.stop(); - this.playSound = null; - } catch { - /* empty */ - } - } - this.audio.pause(); - this.audio.src = ""; - this.audio.removeAttribute("src"); + this.audioPlayer.player.removeVideoEvents(); + this.audioPlayer.player.clear(); + this.audioPlayer.player.src = undefined; + debug.log("audioPlayer after stopTranslate", this.audioPlayer); + this.votVideoVolumeSlider.container.hidden = true; this.votVideoTranslationVolumeSlider.container.hidden = true; this.votDownloadButton.hidden = true; @@ -2252,7 +2216,6 @@ class VideoHandler { if (this.volumeOnStart) { this.setVideoVolume(this.volumeOnStart); } - this.volumeOnStart = ""; clearInterval(this.streamPing); clearTimeout(this.autoRetry); this.hls?.destroy(); @@ -2332,23 +2295,24 @@ class VideoHandler { timeout: 5000, }); debug.log("Test audio response", response); - if (response.status === 404) { - debug.log("Yandex returned not valid audio, trying to fix..."); - let translateRes = await this.translateVideoImpl( - this.videoData, - (this.videoData.detectedLanguage = "auto"), - this.videoData.responseLanguage, - this.videoData.translationHelp, - ); - this.setSelectMenuValues( - this.videoData.detectedLanguage, - this.videoData.responseLanguage, - ); - audioUrl = translateRes.url; - debug.log("Fixed audio audioUrl", audioUrl); - } else { + if (response.status !== 404) { debug.log("Valid audioUrl", audioUrl); + return audioUrl; } + + debug.log("Yandex returned not valid audio, trying to fix..."); + let translateRes = await this.translateVideoImpl( + this.videoData, + (this.videoData.detectedLanguage = "auto"), + this.videoData.responseLanguage, + this.videoData.translationHelp, + ); + this.setSelectMenuValues( + this.videoData.detectedLanguage, + this.videoData.responseLanguage, + ); + audioUrl = translateRes.url; + debug.log("Fixed audio audioUrl", audioUrl); } catch (err) { if (err.message === "Timeout") { debug.log("Request timed out. Handling timeout error..."); @@ -2362,42 +2326,10 @@ class VideoHandler { return audioUrl; } - /** - * Download audio file and connect it to audio context - * - * @param {string} audioUrl - * @return {Promise} - * @memberof VideoHandler - */ - async configurePlaySound(audioUrl) { - try { - debug.log("[VOT] Trying bypass audio CSP..."); - const res = await GM_fetch(audioUrl); - const data = await res.arrayBuffer(); - - this.audioBuffer = await this.audioContext.decodeAudioData(data); - this.playSound = this.audioContext.createBufferSource(); - this.playSound.buffer = this.audioBuffer; - this.playSound.connect(this.gainNode); - // this.playSound.start(); - } catch (err) { - console.error("[VOT] Failed to bypass CSP", err); - if (err.message === "Timeout") { - debug.log("Request timed out. Handling timeout error..."); - this.data.audioProxy = 1; - await votStorage.set("audioProxy", 1); - } - } - } - // update translation audio src async updateTranslation(audioUrl) { // ! Don't use this function for streams - //debug.log("cachedTranslation", this.cachedTranslation?.url, this.audio.currentSrc); - if (this.cachedTranslation?.url === this.audio.currentSrc) { - debug.log("[translateFunc] Audio src is the same"); - this.audio.src = audioUrl; - } else { + if (this.cachedTranslation?.url !== this.audioPlayer.player.currentSrc) { audioUrl = await this.validateAudioUrl(audioUrl); } @@ -2413,31 +2345,28 @@ class VideoHandler { console.log(`[VOT] Audio proxied via ${audioUrl}`); } - // eslint-disable-next-line sonarjs/no-unused-expressions - this.needBypassCSP() - ? await this.configurePlaySound(audioUrl) - : (this.audio.src = audioUrl); + if (this.audioPlayer.player.src !== audioUrl) { + this.audioPlayer.player.src = audioUrl; + } - if (!this.volumeOnStart) { - this.volumeOnStart = this.getVideoVolume(); + try { + this.audioPlayer.init(); + } catch (err) { + if (err.message.includes("Failed to fetch audio file")) { + this.videoHandler.data.audioProxy = 1; + await votStorage.set("audioProxy", 1); + } else { + this.videoHandler.transformBtn("error", err.message); + } } this.setupAudioSettings(); - switch (this.site.host) { - case "twitter": - document - .querySelector('button[data-testid="app-bar-back"][role="button"]') - .addEventListener("click", this.stopTranslation); - break; - case "invidious": - case "piped": - break; + if (this.site.host === "twitter") { + document + .querySelector('button[data-testid="app-bar-back"][role="button"]') + .addEventListener("click", this.stopTranslation); } - if (this.video && !this.video.paused) this.lipSync("play"); - for (const e of videoLipSyncEvents) { - this.video.addEventListener(e, this.handleVideoEvent); - } this.transformBtn("success", localizationProvider.get("disableTranslate")); this.afterUpdateTranslation(audioUrl); } @@ -2455,6 +2384,7 @@ class VideoHandler { debug.log("Run videoValidator"); this.videoValidator(); this.setLoadingBtn(true); + this.volumeOnStart = this.getVideoVolume(); if (isStream) { let translateRes = await this.translateStreamImpl( @@ -2482,11 +2412,6 @@ class VideoHandler { return this.stopTranslation(); } - if (this.video && !this.video.paused) this.lipSync("play"); - for (const e of videoLipSyncEvents) { - this.video.addEventListener(e, this.handleVideoEvent); - } - return this.afterUpdateTranslation(streamURL); } @@ -2551,7 +2476,8 @@ class VideoHandler { ); }); this.hls.loadSource(streamURL); - this.hls.attachMedia(this.audio); + // doesn't work + this.hls.attachMedia(this.audioPlayer.player.audio); this.hls.on(Hls.Events.ERROR, function (data) { if (data.fatal) { switch (data.type) { @@ -2586,9 +2512,11 @@ class VideoHandler { )}&url=${encodeURIComponent(url)}`; if (this.hls) { this.setupHLS(streamURL); - } else if (this.audio.canPlayType("application/vnd.apple.mpegurl")) { + } else if ( + this.audioPlayer.player.audio.canPlayType("application/vnd.apple.mpegurl") + ) { // safari - this.audio.src = streamURL; + this.audioPlayer.player.src = streamURL; // TODO: make class for HLS audio player } else { // browser doesn't support m3u8 (hls unsupported and it isn't a safari) throw new VOTLocalizedError("audioFormatNotSupported"); @@ -2599,7 +2527,7 @@ class VideoHandler { setupAudioSettings() { if (typeof this.data.defaultVolume === "number") { - this.setAudioVolume(this.data.defaultVolume / 100); + this.audioPlayer.player.volume = this.data.defaultVolume / 100; } if ( @@ -2636,11 +2564,9 @@ class VideoHandler { this.container.append(this.votButton.container, this.votMenu.container); } - await Promise.all([ - (this.videoData = await this.getVideoData()), - this.updateSubtitles(), - (this.translateToLang = this.data.responseLanguage ?? "ru"), - ]); + this.videoData = await this.getVideoData(); + await this.updateSubtitles(); + this.translateToLang = this.data.responseLanguage ?? "ru"; this.setSelectMenuValues( this.videoData.detectedLanguage, this.videoData.responseLanguage, diff --git a/src/localization/hashes.json b/src/localization/hashes.json index 0eca5efc..724ca4b0 100644 --- a/src/localization/hashes.json +++ b/src/localization/hashes.json @@ -1,64 +1,64 @@ { - "af": "3d65d4907aa63e12628ec8f35c2ee265", - "am": "c136cf8d8f359ad96fe8e5f903c8b5f2", - "ar": "9fce7b067fa38e0a80723ebfdc0e286b", - "az": "867c3d52485cbae3e246e3e4da74b1da", - "bg": "d9859674d8921782f8460ff2f938fa91", - "bn": "9a22f9a9341eb8cfa967b88c441bea24", - "bs": "2cb80ed4773d6855fa6238df51e6a534", - "ca": "5629706871d7f2f1e303edffad9bd801", - "cs": "24e845ebc223e178afc759d4ea60563b", - "cy": "b7a1f94e75d8b2e4e02af1b0d986481f", - "da": "09249ed5f0b8c653094beb7629a4113a", - "de": "3b299168e7700e8f0b4738403c61560b", - "el": "84b339813625032495f7c29e30f696e0", - "en": "f034726565e8c8b965e5d9fb27223362", - "es": "87e4d7864d3b84dec71437cdd51de1bc", - "et": "337c29ce8306f9d13b1224f6ad9b6b4c", - "eu": "98edb5fb8e226c7dc1e77b3fc8f0bbdb", - "fa": "33445d70e64f3002b2e804d75522c63b", - "fi": "35feda069e4f8a682f9ba531f92052ff", - "fr": "c13f8ad44a49a470da072f2b329c9e7c", - "gl": "65ba856bebb2e8d1360b6a5ef6534d4f", - "hi": "ed06efff21760efb3ff5e66ffd3c6b22", - "hr": "2b6b814910639cdc00ce70749110bffb", - "hu": "0bbc946b500f6930bf7d174093eb843a", - "hy": "34862f834a7ec2361fa0fc55b47c8f6f", - "id": "169ee141c3eb4a2cef630b709b99dfa4", - "it": "0d53b245daa5ef91f96ceae3b4b71c3c", - "ja": "48dbe38d635a56ca96d9cda7b9ac8ee3", - "jv": "5e7cc746749db744eb86bfe8c03e821b", - "kk": "ac85429e21605348d32507d28a1a6d4e", - "km": "210b27dd6891252c6c6cbd96b8318d7a", - "kn": "62c9b96e398b5915d5afcbd3bcea8c4a", - "ko": "35fec4f2db7b77ae938dd863027663b3", - "lo": "b07a6d402edc3508148dc0e427c99878", - "mk": "5129e980a39f9249cda60a59c86d8cf2", - "ml": "d04108a9236fd50d2999653e8907fbdd", - "mn": "ec9c6bffc320f51346062703e333295d", - "ms": "fd0e1f2da45801c57cb09bc645bcfa41", - "mt": "715e276d4fa8998f4e1cfd734272d697", - "my": "2ed0ab943728d9b7a49ebdd017632682", - "ne": "3adda42289975c85642442321cc945e9", - "nl": "6693d8cc4c4199cd3a52c561999f18b7", - "pa": "4d15b606233360fa0938658d53b66ea6", - "pl": "6f2e7cd02d8de802c1f8b1896ec02ae3", - "pt": "f531d0d9fc61c02522b4046937bce9b4", - "ro": "3c2a8e90bed4f90b4d0678706e8c4491", - "ru": "b8f74808e5046e7ef18ef3c99c715eb5", - "si": "1f50c8068c7f8a218afc633dbc092c57", - "sk": "501c9af1e09baf8169bf0a2c60ea8731", - "sl": "aa1d3e16b35420aa848f5219cb949060", - "sq": "fd04cc18dd4fecee0ec7a22a47aa0858", - "sr": "952bc393a6107b98a368c94e05873781", - "su": "276f10578488ceed5ec5c6f6f101ca8d", - "sv": "940f7ac86344933059852099731a8f23", - "sw": "ce29a80d3698694294d1cd7ff7daf425", - "tr": "54cdfe88da3a98bc77fd96883ad8ca4e", - "uk": "c9183acd5c9c3866c3b37d54df6d95a4", - "ur": "7d9535e1aa58759719f4d520dc030356", - "uz": "76941ddc67e91924f890697e9d9818d6", - "vi": "dd9c560357f8c2b0350bb0cceb863b39", - "zh": "47d353d2024201b6c00686cb2814f36d", - "zu": "582430fafb6727a229642e51effb758f" + "af": "f68b5b8ec36f965a3c197cfc09c3a13e", + "am": "eb88f856ee2491f75a693588c9692149", + "ar": "208f24997d2d5fbfd3c60c8e339da119", + "az": "2e94b7c69d6afc35b5a27c65a3d1b99c", + "bg": "a3faf5b064d0210af56feae57a9e78c8", + "bn": "5c08f3177145632d0d6f9d1ac186fd68", + "bs": "369877867e0f353a440710e1ea357947", + "ca": "8143c3289562e81d382feed1faa36958", + "cs": "77baaa4ad7c7eb1110667d942fd82824", + "cy": "7eab9ff7991f4d9c59957f4415d134df", + "da": "e1a11e3dc644c7398467ce12783db3aa", + "de": "fc36180e2724f551a6965a58733b1431", + "el": "fa00dadb12dd90c5fe997c253e11ad8e", + "en": "cb8faddc6e9caa588be88f0ac723a30f", + "es": "9f777e3f09f1f109749164f482f94ca9", + "et": "58a419847b94c5c7455507dab4b0bb45", + "eu": "b6d195853dfa82c950bd529ad7584109", + "fa": "cd4e1e22d2e29f0e0db35f730dc36c3a", + "fi": "ead261e9f83485f994155ac59e4a4643", + "fr": "be3cd9e0b1b1ed4e1462481cda6544a2", + "gl": "b8cfc3e9625ad09943465b35e11553a0", + "hi": "7ec63cb98bf45d1764c49bc31172cfa1", + "hr": "0fe81cdec287f0f8648b2edc0f286b47", + "hu": "e1354ba5a4517737828378969b17e74f", + "hy": "1695bd2ef449c08e6cd4876df258082d", + "id": "c238d74f6379ff0c1066c71db746dad9", + "it": "a104c012ecdf6ffec1c0ce628ce436b2", + "ja": "e356855d332cf5742b14a9ac5bc57ae3", + "jv": "df40695c20313e0763fb7fb204f17cca", + "kk": "c9e3e2b298b8e137b1deec789b13255d", + "km": "f06db5cfe04fb018adf16ec41764e63b", + "kn": "de95f27b205ec84c54065b06de52d0a5", + "ko": "8f9d1fa64bb12e10868702be2baff9cf", + "lo": "a7c32deff8ae06e6459ecad6dabf13df", + "mk": "a3e55dbd72c84a8e9f3a052673289613", + "ml": "03ab16b4dc431d4de84e62f7ef550522", + "mn": "deeb7ee450cca18993b49893bb762f29", + "ms": "f64290d0c75915cc11550e0921c964d6", + "mt": "8d8d1961b9a542001dfe9fd1c7f74c6d", + "my": "6c7031334ff269dd0ad54a7ad41a27f1", + "ne": "d89fe27ad6c9767160809078020cae62", + "nl": "0479ab00d4faf53c570f5a3ccadd781f", + "pa": "e3fceb0947044e422ccc1f92678efef9", + "pl": "a988ac7aed4a217fdb024dcb81c873f5", + "pt": "0b523c1c470371ff16e041bd866003fd", + "ro": "8529221a47f338e0b8b8574084ecc75d", + "ru": "367850d9c7512dba1c4162e873407644", + "si": "5d805bdb82bf96e2752352297953af0b", + "sk": "c5217324fd7f6b87c359ee212f14591d", + "sl": "3fa935809e0b08198f47b1bda7ae1fba", + "sq": "46272c2b87cd6503687bf6ec92f01e22", + "sr": "9a5da418351b9afa29f9532b6f28f265", + "su": "f0f5092ebc0c59b614f735b4c17eb02a", + "sv": "b9b54963b905b4fa626a81ba0debce4b", + "sw": "dd7390feac22bce31d29a4e4c705dc92", + "tr": "3065730d7b543a221233eba3752a7c26", + "uk": "bbd67113245959459d3e7622aab0f9fa", + "ur": "d1d832f228e9df54d17927be0dedcf84", + "uz": "87820f65ad870c833d79aa8471b675d5", + "vi": "69238396c6fc68d89c17a464e2b8692d", + "zh": "94aa400e570e5e57605877fca2d29d2f", + "zu": "f0b1b3cf72deda6069063bb5ffe7d21e" } diff --git a/src/localization/locales/af.json b/src/localization/locales/af.json index 2b7fba0d..2f9fd043 100644 --- a/src/localization/locales/af.json +++ b/src/localization/locales/af.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Plaaslike hash", "VOTUpdatedAt": "Opgedateer om", "VOTNeedWebAudioAPI": "Om dit te aktiveer, moet jy'n Web Audio API", - "VOTBypassMediaCSP": "Omseil Media CSP", - "VOTMediaCSPEnabledOnSite": "MEDIA CSP is geaktiveer op hierdie webwerf" + "VOTMediaCSPEnabledOnSite": "MEDIA CSP is geaktiveer op hierdie webwerf", + "VOTOnlyBypassMediaCSP": "Gebruik dit slegs vir omseil Media CSP", + "VOTNewAudioPlayer": "Gebruik die nuwe oudiospeler" } diff --git a/src/localization/locales/am.json b/src/localization/locales/am.json index 928e5658..463f8229 100644 --- a/src/localization/locales/am.json +++ b/src/localization/locales/am.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "አካባቢያዊ ሃሽ", "VOTUpdatedAt": "ላይ የተዘመነ", "VOTNeedWebAudioAPI": "ይህንን ለማስቻል, አንድ የድር ኦዲዮ ኤፒአይ ሊኖርዎት ይገባል", - "VOTBypassMediaCSP": "Media CSP ማለፍ", - "VOTMediaCSPEnabledOnSite": "በዚህ ድረ ገጽ ላይ የፒ" + "VOTMediaCSPEnabledOnSite": "በዚህ ድረ ገጽ ላይ የፒ", + "VOTOnlyBypassMediaCSP": "የሚዲያ ሲ ኤስ ፒ ለማለፍ ብቻ ይጠቀሙ", + "VOTNewAudioPlayer": "አዲሱን የድምፅ ማጫወቻ ይጠቀሙ" } diff --git a/src/localization/locales/ar.json b/src/localization/locales/ar.json index 470a5758..be37e4a5 100644 --- a/src/localization/locales/ar.json +++ b/src/localization/locales/ar.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "تجزئة اللغة", "VOTUpdatedAt": "تحديث في", "VOTNeedWebAudioAPI": "لتمكين هذا ، يجب أن يكون لديك واجهة برمجة تطبيقات صوت الويب", - "VOTBypassMediaCSP": "تجاوز ميدياسب", - "VOTMediaCSPEnabledOnSite": "يتم تمكين الطاقة الشمسية المركزة وسائل الإعلام على هذا الموقع" + "VOTMediaCSPEnabledOnSite": "يتم تمكين الطاقة الشمسية المركزة وسائل الإعلام على هذا الموقع", + "VOTOnlyBypassMediaCSP": "استخدامه فقط لتجاوز وسائل الإعلام سب", + "VOTNewAudioPlayer": "استخدم مشغل الصوت الجديد" } diff --git a/src/localization/locales/az.json b/src/localization/locales/az.json index 3bda9a3c..bec86a10 100644 --- a/src/localization/locales/az.json +++ b/src/localization/locales/az.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash yerli", "VOTUpdatedAt": "Saat yeniləndi", "VOTNeedWebAudioAPI": "Bunu aktivləşdirmək üçün veb Audio API olmalıdır", - "VOTBypassMediaCSP": "Media CSP Bypass", - "VOTMediaCSPEnabledOnSite": "Media CSP bu saytda aktivdir" + "VOTMediaCSPEnabledOnSite": "Media CSP bu saytda aktivdir", + "VOTOnlyBypassMediaCSP": "Yalnız Media CSP-ni keçmək üçün istifadə edin", + "VOTNewAudioPlayer": "Yeni audio pleyerdən istifadə edin" } diff --git a/src/localization/locales/bg.json b/src/localization/locales/bg.json index ecd02a7a..fefdc5ae 100644 --- a/src/localization/locales/bg.json +++ b/src/localization/locales/bg.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Локален хеш", "VOTUpdatedAt": "Актуализирано в", "VOTNeedWebAudioAPI": "За да разрешите това, трябва да имате уеб аудио интерфейс", - "VOTBypassMediaCSP": "Заобикаляне На Медиаксп", - "VOTMediaCSPEnabledOnSite": "Медиа ДУСП е активирана на този сайт" + "VOTMediaCSPEnabledOnSite": "Медиа ДУСП е активирана на този сайт", + "VOTOnlyBypassMediaCSP": "Използвайте го само за заобикаляне на медийния ДУУ", + "VOTNewAudioPlayer": "Използвайте новия аудио плейър" } diff --git a/src/localization/locales/bn.json b/src/localization/locales/bn.json index f1556755..b5be8ca4 100644 --- a/src/localization/locales/bn.json +++ b/src/localization/locales/bn.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "লোকেল হ্যাশ", "VOTUpdatedAt": "এ আপডেট হয়েছে", "VOTNeedWebAudioAPI": "এটি সক্ষম করতে আপনার অবশ্যই একটি ওয়েব অডিও এপিআই থাকতে হবে", - "VOTBypassMediaCSP": "মিডিয়াসপি বাইপাস করা", - "VOTMediaCSPEnabledOnSite": "এই সাইটে মিডিয়া সিএসপি সক্ষম করা হয়েছে" + "VOTMediaCSPEnabledOnSite": "এই সাইটে মিডিয়া সিএসপি সক্ষম করা হয়েছে", + "VOTOnlyBypassMediaCSP": "মিডিয়া সিএসপি বাইপাস করার জন্য এটি ব্যবহার করুন", + "VOTNewAudioPlayer": "নতুন অডিও প্লেয়ার ব্যবহার করুন" } diff --git a/src/localization/locales/bs.json b/src/localization/locales/bs.json index 8872a7ef..a932bc1c 100644 --- a/src/localization/locales/bs.json +++ b/src/localization/locales/bs.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Ažurirano u", "VOTNeedWebAudioAPI": "Da biste to omogućili, morate imati Web Audio API", - "VOTBypassMediaCSP": "Zaobilazeći Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP je omogućen na ovom sajtu" + "VOTMediaCSPEnabledOnSite": "Media CSP je omogućen na ovom sajtu", + "VOTOnlyBypassMediaCSP": "Koristi ga samo za zaobilaženje medija CSP", + "VOTNewAudioPlayer": "Koristi novi audio player" } diff --git a/src/localization/locales/ca.json b/src/localization/locales/ca.json index 66e3d770..832914fa 100644 --- a/src/localization/locales/ca.json +++ b/src/localization/locales/ca.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash de localització", "VOTUpdatedAt": "Actualització a les", "VOTNeedWebAudioAPI": "Per activar-ho, heu de tenir UNA API D'Àudio", - "VOTBypassMediaCSP": "Ignorant Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP està habilitat en aquest lloc" + "VOTMediaCSPEnabledOnSite": "Media CSP està habilitat en aquest lloc", + "VOTOnlyBypassMediaCSP": "Utilitzeu lo només per evitar Els Mitjans Csp", + "VOTNewAudioPlayer": "Utilitzeu el nou reproductor d'àudio" } diff --git a/src/localization/locales/cs.json b/src/localization/locales/cs.json index f02c5d69..e45a2827 100644 --- a/src/localization/locales/cs.json +++ b/src/localization/locales/cs.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Národní hash", "VOTUpdatedAt": "Aktualizováno v", "VOTNeedWebAudioAPI": "Chcete-li to povolit, musíte mít webové Audio API", - "VOTBypassMediaCSP": "Obcházení Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP je povoleno na tomto webu" + "VOTMediaCSPEnabledOnSite": "Media CSP je povoleno na tomto webu", + "VOTOnlyBypassMediaCSP": "Použijte jej pouze pro obcházení médií CSP", + "VOTNewAudioPlayer": "Použijte nový audio přehrávač" } diff --git a/src/localization/locales/cy.json b/src/localization/locales/cy.json index af52274d..bd5d703d 100644 --- a/src/localization/locales/cy.json +++ b/src/localization/locales/cy.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash Locale", "VOTUpdatedAt": "Diweddarwyd am", "VOTNeedWebAudioAPI": "I alluogi HYN, rhaid bod GENNYCH API Sain Gwe", - "VOTBypassMediaCSP": "Osgoi Media CSP", - "VOTMediaCSPEnabledOnSite": "Mae csp cyfryngau wedi'i alluogi ar y wefan hon" + "VOTMediaCSPEnabledOnSite": "Mae csp cyfryngau wedi'i alluogi ar y wefan hon", + "VOTOnlyBypassMediaCSP": "Defnyddiwch ef yn unig ar gyfer osgoi Cyfryngau CSP", + "VOTNewAudioPlayer": "Defnyddio'r chwaraewr sain newydd" } diff --git a/src/localization/locales/da.json b/src/localization/locales/da.json index 5e6a46ae..b3e368b6 100644 --- a/src/localization/locales/da.json +++ b/src/localization/locales/da.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Opdateret kl.", "VOTNeedWebAudioAPI": "For at aktivere dette skal du have en Internet Audio API", - "VOTBypassMediaCSP": "Omgå Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP er aktiveret på dette site" + "VOTMediaCSPEnabledOnSite": "Media CSP er aktiveret på dette site", + "VOTOnlyBypassMediaCSP": "Brug den kun til at omgå Media CSP", + "VOTNewAudioPlayer": "Brug den nye lydafspiller" } diff --git a/src/localization/locales/de.json b/src/localization/locales/de.json index f285f4de..0a0541bb 100644 --- a/src/localization/locales/de.json +++ b/src/localization/locales/de.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Gebietsschema-Hash", "VOTUpdatedAt": "Aktualisiert um", "VOTNeedWebAudioAPI": "Um dies zu aktivieren, benötigen Sie eine Web-Audio-API", - "VOTBypassMediaCSP": "Umgehen von Media CSP", - "VOTMediaCSPEnabledOnSite": "Medien-CSP ist auf dieser Site aktiviert" + "VOTMediaCSPEnabledOnSite": "Medien-CSP ist auf dieser Site aktiviert", + "VOTOnlyBypassMediaCSP": "Verwenden Sie es nur zum Umgehen von Medien-CSP", + "VOTNewAudioPlayer": "Verwenden Sie den neuen Audioplayer" } diff --git a/src/localization/locales/el.json b/src/localization/locales/el.json index a4b3bad1..55b7af58 100644 --- a/src/localization/locales/el.json +++ b/src/localization/locales/el.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Τοπικό χασίς", "VOTUpdatedAt": "Ενημερώθηκε στις", "VOTNeedWebAudioAPI": "Για να το ενεργοποιήσετε, πρέπει να έχετε ένα API Web Audio", - "VOTBypassMediaCSP": "Παράκαμψη Media CSP", - "VOTMediaCSPEnabledOnSite": "Το Media CSP είναι ενεργοποιημένο σε αυτόν τον ιστότοπο" + "VOTMediaCSPEnabledOnSite": "Το Media CSP είναι ενεργοποιημένο σε αυτόν τον ιστότοπο", + "VOTOnlyBypassMediaCSP": "Χρησιμοποιήστε το μόνο για παράκαμψη CSP πολυμέσων", + "VOTNewAudioPlayer": "Χρησιμοποιήστε τη νέα συσκευή αναπαραγωγής ήχου" } diff --git a/src/localization/locales/en.json b/src/localization/locales/en.json index 9acb31a2..1901285e 100644 --- a/src/localization/locales/en.json +++ b/src/localization/locales/en.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Updated at", "VOTNeedWebAudioAPI": "To enable this, you must have a Web Audio API", - "VOTBypassMediaCSP": "Bypassing Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP is enabled on this site" + "VOTMediaCSPEnabledOnSite": "Media CSP is enabled on this site", + "VOTOnlyBypassMediaCSP": "Use it only for bypassing Media CSP", + "VOTNewAudioPlayer": "Use the new audio player" } diff --git a/src/localization/locales/es.json b/src/localization/locales/es.json index 0350db6c..5250bd89 100644 --- a/src/localization/locales/es.json +++ b/src/localization/locales/es.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash de configuración regional", "VOTUpdatedAt": "Actualizado a las", "VOTNeedWebAudioAPI": "Para habilitar esto, debe tener una API de audio web", - "VOTBypassMediaCSP": "Omitiendo Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP está habilitado en este sitio" + "VOTMediaCSPEnabledOnSite": "Media CSP está habilitado en este sitio", + "VOTOnlyBypassMediaCSP": "Úselo solo para omitir CSP de medios", + "VOTNewAudioPlayer": "Usa el nuevo reproductor de audio" } diff --git a/src/localization/locales/et.json b/src/localization/locales/et.json index d59e5efc..ac41d731 100644 --- a/src/localization/locales/et.json +++ b/src/localization/locales/et.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Uuendatud kell", "VOTNeedWebAudioAPI": "Selle lubamiseks peab teil olema Veebiheli API", - "VOTBypassMediaCSP": "Media CSP-St Mööda Minnes", - "VOTMediaCSPEnabledOnSite": "Meedia CSP on lubatud sellel saidil" + "VOTMediaCSPEnabledOnSite": "Meedia CSP on lubatud sellel saidil", + "VOTOnlyBypassMediaCSP": "Kasutage seda ainult mööda meedia CSP", + "VOTNewAudioPlayer": "Kasutage uut helipleierit" } diff --git a/src/localization/locales/eu.json b/src/localization/locales/eu.json index ae75318d..de5e6377 100644 --- a/src/localization/locales/eu.json +++ b/src/localization/locales/eu.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Lokaleko hash-a", "VOTUpdatedAt": "etan eguneratua", "VOTNeedWebAudioAPI": "Hau gaitzeko, Audio API Bat Eduki Behar duzu", - "VOTBypassMediaCSP": "Media CSP Saihestea", - "VOTMediaCSPEnabledOnSite": "Multimedia KSP gune honetan gaituta dago" + "VOTMediaCSPEnabledOnSite": "Multimedia KSP gune honetan gaituta dago", + "VOTOnlyBypassMediaCSP": "Erabili Media ksp saihesteko bakarrik", + "VOTNewAudioPlayer": "Erabili audio-erreproduzitzaile berria" } diff --git a/src/localization/locales/fa.json b/src/localization/locales/fa.json index 62def284..4f84320f 100644 --- a/src/localization/locales/fa.json +++ b/src/localization/locales/fa.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "هش محلی", "VOTUpdatedAt": "به روز رسانی شده در", "VOTNeedWebAudioAPI": "برای فعال کردن این ، شما باید یک API صوتی وب داشته باشید", - "VOTBypassMediaCSP": "دور زدن Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP در این سایت فعال شده است" + "VOTMediaCSPEnabledOnSite": "Media CSP در این سایت فعال شده است", + "VOTOnlyBypassMediaCSP": "از آن فقط برای دور زدن Csp رسانه استفاده کنید", + "VOTNewAudioPlayer": "از پخش کننده صوتی جدید استفاده کنید" } diff --git a/src/localization/locales/fi.json b/src/localization/locales/fi.json index 7b09c134..2e272af3 100644 --- a/src/localization/locales/fi.json +++ b/src/localization/locales/fi.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Paikallinen hash", "VOTUpdatedAt": "Päivitetty klo", "VOTNeedWebAudioAPI": "Jotta voit ottaa tämän käyttöön, sinulla on oltava Web Audio API", - "VOTBypassMediaCSP": "Media CSP: N Ohittaminen", - "VOTMediaCSPEnabledOnSite": "Media CSP on käytössä tällä sivustolla" + "VOTMediaCSPEnabledOnSite": "Media CSP on käytössä tällä sivustolla", + "VOTOnlyBypassMediaCSP": "Käytä sitä vain Media CSP: n ohittamiseen", + "VOTNewAudioPlayer": "Käytä uutta soittinta" } diff --git a/src/localization/locales/fr.json b/src/localization/locales/fr.json index e5ae1022..713fb465 100644 --- a/src/localization/locales/fr.json +++ b/src/localization/locales/fr.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hachage des paramètres régionaux", "VOTUpdatedAt": "Mis à jour à 16h40", "VOTNeedWebAudioAPI": "Pour activer cela, vous devez disposer d'une API audio Web", - "VOTBypassMediaCSP": "Contourner Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP est activé sur ce site" + "VOTMediaCSPEnabledOnSite": "Media CSP est activé sur ce site", + "VOTOnlyBypassMediaCSP": "Utilisez - le uniquement pour contourner le CSP multimédia", + "VOTNewAudioPlayer": "Utilisez le nouveau lecteur audio" } diff --git a/src/localization/locales/gl.json b/src/localization/locales/gl.json index d6ee5317..5a2930fc 100644 --- a/src/localization/locales/gl.json +++ b/src/localization/locales/gl.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash local", "VOTUpdatedAt": "Actualizado ás", "VOTNeedWebAudioAPI": "Para activar isto, debes ter UNHA API De Audio Web", - "VOTBypassMediaCSP": "Evitar Media CSP", - "VOTMediaCSPEnabledOnSite": "Os medios de COMUNICACIÓN csp están habilitados neste sitio" + "VOTMediaCSPEnabledOnSite": "Os medios de COMUNICACIÓN csp están habilitados neste sitio", + "VOTOnlyBypassMediaCSP": "Usalo só para evitar A MEDIA CSP", + "VOTNewAudioPlayer": "Use o novo reproductor de audio" } diff --git a/src/localization/locales/hi.json b/src/localization/locales/hi.json index eaece7f5..7dfb6bfb 100644 --- a/src/localization/locales/hi.json +++ b/src/localization/locales/hi.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "लोकेल हैश", "VOTUpdatedAt": "पर अपडेट किया गया", "VOTNeedWebAudioAPI": "इसे सक्षम करने के लिए, आपके पास एक वेब ऑडियो एपीआई होना चाहिए", - "VOTBypassMediaCSP": "मीडियासीएसपी को दरकिनार", - "VOTMediaCSPEnabledOnSite": "मीडिया सीएसपी इस साइट पर सक्षम है" + "VOTMediaCSPEnabledOnSite": "मीडिया सीएसपी इस साइट पर सक्षम है", + "VOTOnlyBypassMediaCSP": "इसका उपयोग केवल मीडिया सीएसपी को दरकिनार करने के लिए करें", + "VOTNewAudioPlayer": "नए ऑडियो प्लेयर का उपयोग करें" } diff --git a/src/localization/locales/hr.json b/src/localization/locales/hr.json index e3f336fc..189d4b28 100644 --- a/src/localization/locales/hr.json +++ b/src/localization/locales/hr.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Lokalni hash", "VOTUpdatedAt": "Ažurirano u", "VOTNeedWebAudioAPI": "Da biste to omogućili, morate imati", - "VOTBypassMediaCSP": "Zaobilaženje", - "VOTMediaCSPEnabledOnSite": "Na ovoj je stranici omogućen" + "VOTMediaCSPEnabledOnSite": "Na ovoj je stranici omogućen", + "VOTOnlyBypassMediaCSP": "Koristite ga samo za zaobilaženje", + "VOTNewAudioPlayer": "Koristite novi audio uređaj" } diff --git a/src/localization/locales/hu.json b/src/localization/locales/hu.json index e4d9cb5a..aa339961 100644 --- a/src/localization/locales/hu.json +++ b/src/localization/locales/hu.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Frissítve", "VOTNeedWebAudioAPI": "Ennek engedélyezéséhez rendelkeznie kell egy Web Audio API-val", - "VOTBypassMediaCSP": "A Mediacp Megkerülése", - "VOTMediaCSPEnabledOnSite": "A Media CSP engedélyezve van ezen a webhelyen" + "VOTMediaCSPEnabledOnSite": "A Media CSP engedélyezve van ezen a webhelyen", + "VOTOnlyBypassMediaCSP": "Csak a Media CSP megkerülésére használja", + "VOTNewAudioPlayer": "Az új audiolejátszó használata" } diff --git a/src/localization/locales/hy.json b/src/localization/locales/hy.json index eeaa55ed..271157ee 100644 --- a/src/localization/locales/hy.json +++ b/src/localization/locales/hy.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Հաշ locales", "VOTUpdatedAt": "Թարմացվել է", "VOTNeedWebAudioAPI": "Սա միացնելու համար դուք պետք է ունենաք վեբ աուդիո API", - "VOTBypassMediaCSP": "Շրջանցելով Media CSP-Ը", - "VOTMediaCSPEnabledOnSite": "Media CSP-ն միացված է այս կայքում" + "VOTMediaCSPEnabledOnSite": "Media CSP-ն միացված է այս կայքում", + "VOTOnlyBypassMediaCSP": "Օգտագործեք այն միայն Media CSP-ն շրջանցելու համար", + "VOTNewAudioPlayer": "Օգտագործեք նոր աուդիո նվագարկիչ" } diff --git a/src/localization/locales/id.json b/src/localization/locales/id.json index ab6439ac..3ad1a9b5 100644 --- a/src/localization/locales/id.json +++ b/src/localization/locales/id.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash lokal", "VOTUpdatedAt": "Diperbarui pukul", "VOTNeedWebAudioAPI": "Untuk mengaktifkan ini, Anda harus memiliki Web Audio API", - "VOTBypassMediaCSP": "Melewati Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP diaktifkan di situs ini" + "VOTMediaCSPEnabledOnSite": "Media CSP diaktifkan di situs ini", + "VOTOnlyBypassMediaCSP": "Gunakan hanya untuk melewati Media CSP", + "VOTNewAudioPlayer": "Gunakan pemutar audio baru" } diff --git a/src/localization/locales/it.json b/src/localization/locales/it.json index 471f2efe..416b512f 100644 --- a/src/localization/locales/it.json +++ b/src/localization/locales/it.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Aggiornato alle", "VOTNeedWebAudioAPI": "Per abilitare questo, è necessario disporre di un'API audio Web", - "VOTBypassMediaCSP": "Bypassando Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP è abilitato su questo sito" + "VOTMediaCSPEnabledOnSite": "Media CSP è abilitato su questo sito", + "VOTOnlyBypassMediaCSP": "Usalo solo per bypassare i media CSP", + "VOTNewAudioPlayer": "Utilizzare il nuovo lettore audio" } diff --git a/src/localization/locales/ja.json b/src/localization/locales/ja.json index 62b94e3c..553910d6 100644 --- a/src/localization/locales/ja.json +++ b/src/localization/locales/ja.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "ロケールハッシュ", "VOTUpdatedAt": "更新", "VOTNeedWebAudioAPI": "これを有効にするには、Web Audio APIが必要です", - "VOTBypassMediaCSP": "Media CSPのバイパス", - "VOTMediaCSPEnabledOnSite": "メディアCSPはこのサイトで有効になっています" + "VOTMediaCSPEnabledOnSite": "メディアCSPはこのサイトで有効になっています", + "VOTOnlyBypassMediaCSP": "メディアCSPをバイパスするためにのみ使用します", + "VOTNewAudioPlayer": "新しいオーディオプレーヤーを使用する" } diff --git a/src/localization/locales/jv.json b/src/localization/locales/jv.json index e189ebef..ed719dff 100644 --- a/src/localization/locales/jv.json +++ b/src/localization/locales/jv.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash lokal", "VOTUpdatedAt": "Dianyari jam", "VOTNeedWebAudioAPI": "Kanggo ngaktifake IKI, SAMPEYAN kudu DUWE API Audio Web", - "VOTBypassMediaCSP": "Ngliwati Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP diaktifake ing situs iki" + "VOTMediaCSPEnabledOnSite": "Media CSP diaktifake ing situs iki", + "VOTOnlyBypassMediaCSP": "Gunakna Mung Kanggo Ngliwati MEDIA CSP", + "VOTNewAudioPlayer": "Gunakake pamuter audio anyar" } diff --git a/src/localization/locales/kk.json b/src/localization/locales/kk.json index bec67be5..dc85cc92 100644 --- a/src/localization/locales/kk.json +++ b/src/localization/locales/kk.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Жергілікті хэш", "VOTUpdatedAt": "жаңартылды", "VOTNeedWebAudioAPI": "Мұны қосу Үшін Сізде Web Audio API БОЛУЫ КЕРЕК", - "VOTBypassMediaCSP": "Media CSP Айналып Өту", - "VOTMediaCSPEnabledOnSite": "Бұл сайтта медиа CSP қосылған" + "VOTMediaCSPEnabledOnSite": "Бұл сайтта медиа CSP қосылған", + "VOTOnlyBypassMediaCSP": "Оны Тек Csp Медиасын айналып өту үшін пайдаланыңыз", + "VOTNewAudioPlayer": "Жаңа аудио ойнатқышты пайдаланыңыз" } diff --git a/src/localization/locales/km.json b/src/localization/locales/km.json index 43bddccb..2636a800 100644 --- a/src/localization/locales/km.json +++ b/src/localization/locales/km.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "សញ្ញាមូលដ្ឋាន", "VOTUpdatedAt": "ធ្វើឱ្យទាន់សម័យនៅ", "VOTNeedWebAudioAPI": "ដើម្បីអនុញ្ញាតនេះ,អ្នកត្រូវតែមានបណ្តាញ Api របស់អូឌីយ៉ូ", - "VOTBypassMediaCSP": "ឆ្លងកាត់ Media CSP", - "VOTMediaCSPEnabledOnSite": "ប្រព័ន្ធផ្សព្វផ្សាយ CSP ត្រូវបានបើកនៅលើតំបន់បណ្ដាញនេះ" + "VOTMediaCSPEnabledOnSite": "ប្រព័ន្ធផ្សព្វផ្សាយ CSP ត្រូវបានបើកនៅលើតំបន់បណ្ដាញនេះ", + "VOTOnlyBypassMediaCSP": "ប្រើវាសម្រាប់តែឆ្លងកាត់ប្រព័ន្ធផ្សព្វផ្សាយ CSP", + "VOTNewAudioPlayer": "ប្រើកម្មវិធីចាក់អូឌីយ៉ូថ្មី" } diff --git a/src/localization/locales/kn.json b/src/localization/locales/kn.json index e80cd8b9..2e73f8a2 100644 --- a/src/localization/locales/kn.json +++ b/src/localization/locales/kn.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "ಲೊಕೇಲ್ ಹ್ಯಾಶ್", "VOTUpdatedAt": "ಕ್ಕೆ ನವೀಕರಿಸಲಾಗಿದೆ", "VOTNeedWebAudioAPI": "ಇದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು, ನೀವು ವೆಬ್ ಆಡಿಯೊ API ಅನ್ನು ಹೊಂದಿರಬೇಕು", - "VOTBypassMediaCSP": "Media CSP ಅನ್ನು ಬೈಪಾಸ್ ಮಾಡುವುದು", - "VOTMediaCSPEnabledOnSite": "ಈ ಸೈಟ್ನಲ್ಲಿ ಮೀಡಿಯಾ CSP ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + "VOTMediaCSPEnabledOnSite": "ಈ ಸೈಟ್ನಲ್ಲಿ ಮೀಡಿಯಾ CSP ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "VOTOnlyBypassMediaCSP": "ಮಾಧ್ಯಮ ಸಿಎಸ್ಪಿ ಬೈಪಾಸ್ ಮಾಡಲು ಮಾತ್ರ ಇದನ್ನು ಬಳಸಿ", + "VOTNewAudioPlayer": "ಹೊಸ ಆಡಿಯೋ ಪ್ಲೇಯರ್ ಬಳಸಿ" } diff --git a/src/localization/locales/ko.json b/src/localization/locales/ko.json index cbdd22c5..699caf5e 100644 --- a/src/localization/locales/ko.json +++ b/src/localization/locales/ko.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "로캘 해시", "VOTUpdatedAt": "에 업데이트 됨", "VOTNeedWebAudioAPI": "이 기능을 사용하려면 웹 오디오가 있어야 합니다.", - "VOTBypassMediaCSP": "미디어스피 우회", - "VOTMediaCSPEnabledOnSite": "이 사이트에서 사용할 수 있습니다" + "VOTMediaCSPEnabledOnSite": "이 사이트에서 사용할 수 있습니다", + "VOTOnlyBypassMediaCSP": "미디어 우회 용으로만 사용", + "VOTNewAudioPlayer": "새 오디오 플레이어 사용" } diff --git a/src/localization/locales/lo.json b/src/localization/locales/lo.json index 2e29e066..22c6e266 100644 --- a/src/localization/locales/lo.json +++ b/src/localization/locales/lo.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash ທ້ອງຖິ່ນ", "VOTUpdatedAt": "ອັບເດດເວລາ", "VOTNeedWebAudioAPI": "ເພື່ອເປີດໃຊ້ສິ່ງນີ້,ທ່ານຕ້ອງມີ Web Audio API", - "VOTBypassMediaCSP": "ຂ້າມຜ່ານ Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP ຖືກເປີດໃຊ້ໃນເວັບໄຊທ໌ນີ້" + "VOTMediaCSPEnabledOnSite": "Media CSP ຖືກເປີດໃຊ້ໃນເວັບໄຊທ໌ນີ້", + "VOTOnlyBypassMediaCSP": "ໃຊ້ມັນພຽງແຕ່ສໍາລັບການ bypassing ສື່ CSP", + "VOTNewAudioPlayer": "ໃຊ້ເຄື່ອງຫຼີ້ນສຽງໃໝ່" } diff --git a/src/localization/locales/mk.json b/src/localization/locales/mk.json index 03d7233a..2c0689bb 100644 --- a/src/localization/locales/mk.json +++ b/src/localization/locales/mk.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Локал хаш", "VOTUpdatedAt": "Ажурирано во", "VOTNeedWebAudioAPI": "За да го овозможите ОВА, мора да имате ВЕБ АУДИО АПИ", - "VOTBypassMediaCSP": "Заобиколувајќи Медиацсп", - "VOTMediaCSPEnabledOnSite": "Медиумите CSP се овозможени на оваа страница" + "VOTMediaCSPEnabledOnSite": "Медиумите CSP се овозможени на оваа страница", + "VOTOnlyBypassMediaCSP": "Користете го само За Заобиколување На МЕДИУМИТЕ ЦСП", + "VOTNewAudioPlayer": "Користете го новиот аудио плеер" } diff --git a/src/localization/locales/ml.json b/src/localization/locales/ml.json index 7a52846d..cb43617e 100644 --- a/src/localization/locales/ml.json +++ b/src/localization/locales/ml.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "പ്രാദേശിക ഹാഷ്", "VOTUpdatedAt": "അപ്ഡേറ്റ്", "VOTNeedWebAudioAPI": "ഇത് ചെയ്യുന്നതിന്, നിങ്ങൾക്ക് ഒരു വെബ് ഓഡിയോ എപിഐ ഉണ്ടായിരിക്കണം.", - "VOTBypassMediaCSP": "മീഡിയ എസ്പിയെ മറികടന്ന്", - "VOTMediaCSPEnabledOnSite": "മീഡിയ സിഎസ്പി ഈ സൈറ്റിൽ പ്രാപ്തമാക്കിയിരിക്കുന്നു" + "VOTMediaCSPEnabledOnSite": "മീഡിയ സിഎസ്പി ഈ സൈറ്റിൽ പ്രാപ്തമാക്കിയിരിക്കുന്നു", + "VOTOnlyBypassMediaCSP": "മീഡിയ സി. എസ്. പിയെ മറികടക്കാന് മാത്രം ഉപയോഗിക്കുക", + "VOTNewAudioPlayer": "പുതിയ ഓഡിയോ പ്ലെയർ ഉപയോഗിക്കുക" } diff --git a/src/localization/locales/mn.json b/src/localization/locales/mn.json index bebc7bec..024eb78e 100644 --- a/src/localization/locales/mn.json +++ b/src/localization/locales/mn.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Локал хэш", "VOTUpdatedAt": "цагт шинэчлэгдсэн", "VOTNeedWebAudioAPI": "Үүнийг идэвхжүүлэхийн тулд та вэб аудио API-тэй байх естой", - "VOTBypassMediaCSP": "Media CSP-Ийг Тойрч Гарах", - "VOTMediaCSPEnabledOnSite": "Хэвлэл мэдээллийн CSP энэ сайт дээр идэвхжүүлсэн байна" + "VOTMediaCSPEnabledOnSite": "Хэвлэл мэдээллийн CSP энэ сайт дээр идэвхжүүлсэн байна", + "VOTOnlyBypassMediaCSP": "Зөвхөн хэвлэл мэдээллийн ОНХХ алгасан үүнийг ашиглах", + "VOTNewAudioPlayer": "Шинэ аудио тоглуулагч ашиглах" } diff --git a/src/localization/locales/ms.json b/src/localization/locales/ms.json index 599377fd..976b378b 100644 --- a/src/localization/locales/ms.json +++ b/src/localization/locales/ms.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash tempatan", "VOTUpdatedAt": "Dikemaskini pada", "VOTNeedWebAudioAPI": "Untuk membolehkan ini, anda mesti mempunyai API Audio web", - "VOTBypassMediaCSP": "Memintas Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP diaktifkan di laman web ini" + "VOTMediaCSPEnabledOnSite": "Media CSP diaktifkan di laman web ini", + "VOTOnlyBypassMediaCSP": "Gunakan ia hanya untuk memintas media CSP", + "VOTNewAudioPlayer": "Gunakan pemain audio baru" } diff --git a/src/localization/locales/mt.json b/src/localization/locales/mt.json index 437f8d11..b25a0708 100644 --- a/src/localization/locales/mt.json +++ b/src/localization/locales/mt.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash lokali", "VOTUpdatedAt": "Aġġornat fis-", "VOTNeedWebAudioAPI": "Biex tippermetti dan, irid ikollok Api Awdjo Tal - Web", - "VOTBypassMediaCSP": "Jinjora Media CSP", - "VOTMediaCSPEnabledOnSite": "Il-PSK tal-midja huwa attivat fuq dan is-sit" + "VOTMediaCSPEnabledOnSite": "Il-PSK tal-midja huwa attivat fuq dan is-sit", + "VOTOnlyBypassMediaCSP": "Użaha biss Biex tevita L-PSK Tal-Midja", + "VOTNewAudioPlayer": "Uża l-plejer tal-awdjo l-ġdid" } diff --git a/src/localization/locales/my.json b/src/localization/locales/my.json index 73dd0c32..331b97a5 100644 --- a/src/localization/locales/my.json +++ b/src/localization/locales/my.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "ဒေသတွင်းဟက်ရှ်", "VOTUpdatedAt": "၁၆:၄၀ တွင်အတည်ပြု", "VOTNeedWebAudioAPI": "ဒါကိုဖွင့်ဖို့ Web Audio API တစ်ခုရှိရပါမယ်။", - "VOTBypassMediaCSP": "Media CSP ကိုရှောင်လွှဲခြင်း", - "VOTMediaCSPEnabledOnSite": "ဤဆိုက်တွင်မီဒီယာ CSP ကိုခွင့်ပြုထားသည်။" + "VOTMediaCSPEnabledOnSite": "ဤဆိုက်တွင်မီဒီယာ CSP ကိုခွင့်ပြုထားသည်။", + "VOTOnlyBypassMediaCSP": "မီဒီယာ CSP ကိုရှောင်လွှဲဖို့ပဲသုံးပါ။", + "VOTNewAudioPlayer": "အသံဖွင့်စက်အသစ်ကိုအသုံးပြုပါ" } diff --git a/src/localization/locales/ne.json b/src/localization/locales/ne.json index b556dbc0..11b4d402 100644 --- a/src/localization/locales/ne.json +++ b/src/localization/locales/ne.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "स्थानीय ह्यास", "VOTUpdatedAt": "मा अपडेट गरिएको", "VOTNeedWebAudioAPI": "यो सक्षम गर्न, तपाईं एक वेब अडियो एपीआई हुनुपर्छ", - "VOTBypassMediaCSP": "मिडियासीएसपीलाई बाइपास गर्दै", - "VOTMediaCSPEnabledOnSite": "यस साइटमा मिडिया सीएसपी सक्षम छ" + "VOTMediaCSPEnabledOnSite": "यस साइटमा मिडिया सीएसपी सक्षम छ", + "VOTOnlyBypassMediaCSP": "यसलाई केवल मिडिया सीएसपीलाई बाइपास गर्नका लागि प्रयोग गर्नुहोस्", + "VOTNewAudioPlayer": "नयाँ अडियो प्लेयर प्रयोग गर्नुहोस्" } diff --git a/src/localization/locales/nl.json b/src/localization/locales/nl.json index a38b9c47..89cf2103 100644 --- a/src/localization/locales/nl.json +++ b/src/localization/locales/nl.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Lokale hash", "VOTUpdatedAt": "Bijgewerkt op", "VOTNeedWebAudioAPI": "Om dit in te schakelen, moet u een Web Audio API hebben", - "VOTBypassMediaCSP": "Omzeilen Van Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP is ingeschakeld op deze site" + "VOTMediaCSPEnabledOnSite": "Media CSP is ingeschakeld op deze site", + "VOTOnlyBypassMediaCSP": "Gebruik het alleen voor het omzeilen van Media CSP", + "VOTNewAudioPlayer": "De nieuwe audiospeler gebruiken" } diff --git a/src/localization/locales/pa.json b/src/localization/locales/pa.json index cc79c589..a73ddd4f 100644 --- a/src/localization/locales/pa.json +++ b/src/localization/locales/pa.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "ਲੋਕੇਲ ਹੈਸ਼", "VOTUpdatedAt": "ਵਜੇ ਅਪਡੇਟ ਕੀਤਾ ਗਿਆ", "VOTNeedWebAudioAPI": "ਇਸ ਨੂੰ ਯੋਗ ਕਰਨ ਲਈ, ਤੁਹਾਡੇ ਕੋਲ ਇੱਕ ਵੈਬ ਆਡੀਓ ਏਪੀਆਈ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ", - "VOTBypassMediaCSP": "ਮੀਡੀਆਸੀਐਸਪੀ ਨੂੰ ਬਾਈਪਾਸ ਕਰਨਾ", - "VOTMediaCSPEnabledOnSite": "ਮੀਡੀਆ ਸੀਐਸਪੀ ਇਸ ਸਾਈਟ ਤੇ ਸਮਰੱਥ ਹੈ" + "VOTMediaCSPEnabledOnSite": "ਮੀਡੀਆ ਸੀਐਸਪੀ ਇਸ ਸਾਈਟ ਤੇ ਸਮਰੱਥ ਹੈ", + "VOTOnlyBypassMediaCSP": "ਇਸ ਨੂੰ ਸਿਰਫ ਮੀਡੀਆ ਸੀਐਸਪੀ ਨੂੰ ਬਾਈਪਾਸ ਕਰਨ ਲਈ ਵਰਤੋ", + "VOTNewAudioPlayer": "ਨਵਾਂ ਆਡੀਓ ਪਲੇਅਰ ਵਰਤੋਂ" } diff --git a/src/localization/locales/pl.json b/src/localization/locales/pl.json index 6cba4fd5..5a4a8da1 100644 --- a/src/localization/locales/pl.json +++ b/src/localization/locales/pl.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Aktualizacja:", "VOTNeedWebAudioAPI": "Aby to włączyć, musisz mieć Web Audio API", - "VOTBypassMediaCSP": "Omijanie Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP jest włączony na tej stronie" + "VOTMediaCSPEnabledOnSite": "Media CSP jest włączony na tej stronie", + "VOTOnlyBypassMediaCSP": "Używaj go tylko do omijania mediów CSP", + "VOTNewAudioPlayer": "Użyj nowego odtwarzacza audio" } diff --git a/src/localization/locales/pt.json b/src/localization/locales/pt.json index 62e4c403..844f2e0e 100644 --- a/src/localization/locales/pt.json +++ b/src/localization/locales/pt.json @@ -200,6 +200,7 @@ "VOTLocaleHash": "Hash de localidade", "VOTUpdatedAt": "Actualizado às", "VOTNeedWebAudioAPI": "Para habilitar isso, você deve ter uma API de áudio da Web", - "VOTBypassMediaCSP": "Ignorando Media CSP", - "VOTMediaCSPEnabledOnSite": "O Media CSP está ativado neste site" + "VOTMediaCSPEnabledOnSite": "O Media CSP está ativado neste site", + "VOTOnlyBypassMediaCSP": "Use-o apenas para ignorar o CSP de mídia", + "VOTNewAudioPlayer": "Utilizar o novo leitor de áudio" } diff --git a/src/localization/locales/ro.json b/src/localization/locales/ro.json index 37179a14..ff61652c 100644 --- a/src/localization/locales/ro.json +++ b/src/localization/locales/ro.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash Locale", "VOTUpdatedAt": "Actualizat la", "VOTNeedWebAudioAPI": "Pentru a activa acest lucru, trebuie să aveți un API Audio Web", - "VOTBypassMediaCSP": "Ocolind Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP este activat pe acest site" + "VOTMediaCSPEnabledOnSite": "Media CSP este activat pe acest site", + "VOTOnlyBypassMediaCSP": "Utilizați-l numai pentru ocolirea CSP Media", + "VOTNewAudioPlayer": "Utilizați noul player audio" } diff --git a/src/localization/locales/ru.json b/src/localization/locales/ru.json index c58cf570..c67c0747 100644 --- a/src/localization/locales/ru.json +++ b/src/localization/locales/ru.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Хеш перевода", "VOTUpdatedAt": "Обновлено в", "VOTNeedWebAudioAPI": "Чтобы включить это, у вас должен быть Web Audio API", - "VOTBypassMediaCSP": "Обход Media CSP", - "VOTMediaCSPEnabledOnSite": "На этом сайте включен Media CSP" + "VOTMediaCSPEnabledOnSite": "На этом сайте включен Media CSP", + "VOTOnlyBypassMediaCSP": "Использовать только для обхода Media CSP", + "VOTNewAudioPlayer": "Использовать новый аудиоплеер" } diff --git a/src/localization/locales/si.json b/src/localization/locales/si.json index 3c5082b0..4a9b4585 100644 --- a/src/localization/locales/si.json +++ b/src/localization/locales/si.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "දේශීය හැෂ්", "VOTUpdatedAt": "ට යාවත්කාලීන කරන ලදි", "VOTNeedWebAudioAPI": "මෙය සක් රීය කිරීම සඳහා, ඔබට වෙබ් ශ් රව් ය API එකක් තිබිය යුතුය", - "VOTBypassMediaCSP": "Media CSP මග හැරීම", - "VOTMediaCSPEnabledOnSite": "මෙම වෙබ් අඩවියේ csp මාධ් ය සක් රීය කර ඇත" + "VOTMediaCSPEnabledOnSite": "මෙම වෙබ් අඩවියේ csp මාධ් ය සක් රීය කර ඇත", + "VOTOnlyBypassMediaCSP": "මාධ්ය CSP මඟ හැරීම සඳහා පමණක් එය භාවිතා කරන්න", + "VOTNewAudioPlayer": "නව ශ්රව්ය වාදකය භාවිතා කරන්න" } diff --git a/src/localization/locales/sk.json b/src/localization/locales/sk.json index 88145328..362be860 100644 --- a/src/localization/locales/sk.json +++ b/src/localization/locales/sk.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Locale hash", "VOTUpdatedAt": "Aktualizované o", "VOTNeedWebAudioAPI": "Ak to chcete povoliť, musíte mať rozhranie Web Audio API", - "VOTBypassMediaCSP": "Obchádzanie Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP je povolené na tejto stránke" + "VOTMediaCSPEnabledOnSite": "Media CSP je povolené na tejto stránke", + "VOTOnlyBypassMediaCSP": "Používajte ho iba na obídenie médií CSP", + "VOTNewAudioPlayer": "Použite nový audio prehrávač" } diff --git a/src/localization/locales/sl.json b/src/localization/locales/sl.json index f90c20dd..52785ff1 100644 --- a/src/localization/locales/sl.json +++ b/src/localization/locales/sl.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Lokalni hash", "VOTUpdatedAt": "Posodobljeno ob", "VOTNeedWebAudioAPI": "Če želite to omogočiti, morate imeti spletni avdio API", - "VOTBypassMediaCSP": "Obhod Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP je omogočen na tej spletni strani" + "VOTMediaCSPEnabledOnSite": "Media CSP je omogočen na tej spletni strani", + "VOTOnlyBypassMediaCSP": "Uporabite ga samo za obhod medijev CSP", + "VOTNewAudioPlayer": "Uporabite nov predvajalnik zvoka" } diff --git a/src/localization/locales/sq.json b/src/localization/locales/sq.json index 29664fda..8648d8b1 100644 --- a/src/localization/locales/sq.json +++ b/src/localization/locales/sq.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Hash Locale", "VOTUpdatedAt": "Përditësuar në", "VOTNeedWebAudioAPI": "Për ta mundësuar këtë, duhet të keni NJË API Audio Në Internet", - "VOTBypassMediaCSP": "Duke Anashkaluar Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP është aktivizuar në këtë faqe" + "VOTMediaCSPEnabledOnSite": "Media CSP është aktivizuar në këtë faqe", + "VOTOnlyBypassMediaCSP": "Përdoreni atë vetëm për anashkalimin E CSP-Së Mediatike", + "VOTNewAudioPlayer": "Përdorni luajtësin e ri audio" } diff --git a/src/localization/locales/sr.json b/src/localization/locales/sr.json index 7f81930c..69eab398 100644 --- a/src/localization/locales/sr.json +++ b/src/localization/locales/sr.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Хеш локали", "VOTUpdatedAt": "Ажурирано у", "VOTNeedWebAudioAPI": "Да бисте то омогућили, морате имати Веб Аудио АПИ", - "VOTBypassMediaCSP": "Заобилажење Медиацсп-А", - "VOTMediaCSPEnabledOnSite": "На овој веб локацији је омогућен Медиа ЦСП" + "VOTMediaCSPEnabledOnSite": "На овој веб локацији је омогућен Медиа ЦСП", + "VOTOnlyBypassMediaCSP": "Користите га само за заобилажење Медиа ЦСП-а", + "VOTNewAudioPlayer": "Користите нови аудио плејер" } diff --git a/src/localization/locales/su.json b/src/localization/locales/su.json index 63a6a783..1eef1913 100644 --- a/src/localization/locales/su.json +++ b/src/localization/locales/su.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Lokal hash", "VOTUpdatedAt": "Diperbarui jam", "VOTNeedWebAudioAPI": "Pikeun ngaktipkeun ieu, anjeun kudu boga API Audio Web", - "VOTBypassMediaCSP": "Ngalangkungan Media CSP", - "VOTMediaCSPEnabledOnSite": "Media csp diaktipkeun dina situs ieu" + "VOTMediaCSPEnabledOnSite": "Media csp diaktipkeun dina situs ieu", + "VOTOnlyBypassMediaCSP": "Ngagunakeun eta ngan Pikeun Bypassing Media Csp", + "VOTNewAudioPlayer": "Paké pamuter audio anyar" } diff --git a/src/localization/locales/sv.json b/src/localization/locales/sv.json index ca330ad3..6f72debf 100644 --- a/src/localization/locales/sv.json +++ b/src/localization/locales/sv.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Lokal hash", "VOTUpdatedAt": "Uppdaterat klockan", "VOTNeedWebAudioAPI": "För att aktivera detta måste du ha ETT Web Audio API", - "VOTBypassMediaCSP": "Kringgå Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP är aktiverat på den här webbplatsen" + "VOTMediaCSPEnabledOnSite": "Media CSP är aktiverat på den här webbplatsen", + "VOTOnlyBypassMediaCSP": "Använd den bara för att kringgå Media CSP", + "VOTNewAudioPlayer": "Använd den nya ljudspelaren" } diff --git a/src/localization/locales/sw.json b/src/localization/locales/sw.json index b22946e0..596efb01 100644 --- a/src/localization/locales/sw.json +++ b/src/localization/locales/sw.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Eneo hash", "VOTUpdatedAt": "Imesasishwa saa", "VOTNeedWebAudioAPI": "Ili kuwezesha hii, lazima uwe NA API Ya Sauti Ya Wavuti", - "VOTBypassMediaCSP": "Kupitia Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP imewezeshwa kwenye tovuti hii" + "VOTMediaCSPEnabledOnSite": "Media CSP imewezeshwa kwenye tovuti hii", + "VOTOnlyBypassMediaCSP": "Tumia Tu kwa kupitisha Vyombo VYA Habari CSP", + "VOTNewAudioPlayer": "Tumia kicheza sauti kipya" } diff --git a/src/localization/locales/tr.json b/src/localization/locales/tr.json index 668003b5..5d639710 100644 --- a/src/localization/locales/tr.json +++ b/src/localization/locales/tr.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Yerel ayar karması", "VOTUpdatedAt": "güncellendi", "VOTNeedWebAudioAPI": "Bunu etkinleştirmek için bir Web Ses API'sine sahip olmanız gerekir", - "VOTBypassMediaCSP": "Media CSP'yi atlamak", - "VOTMediaCSPEnabledOnSite": "Media CSP bu sitede etkindir" + "VOTMediaCSPEnabledOnSite": "Media CSP bu sitede etkindir", + "VOTOnlyBypassMediaCSP": "Yalnızca Medya csp'sini atlamak için kullanın", + "VOTNewAudioPlayer": "Yeni ses çaları kullanma" } diff --git a/src/localization/locales/uk.json b/src/localization/locales/uk.json index b9494f5e..e08b35eb 100644 --- a/src/localization/locales/uk.json +++ b/src/localization/locales/uk.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Хеш локалі", "VOTUpdatedAt": "Оновлено о", "VOTNeedWebAudioAPI": "Щоб увімкнути це, ви повинні мати Web Audio API", - "VOTBypassMediaCSP": "Обхід Media CSP", - "VOTMediaCSPEnabledOnSite": "На цьому сайті включено Media CSP" + "VOTMediaCSPEnabledOnSite": "На цьому сайті включено Media CSP", + "VOTOnlyBypassMediaCSP": "Використовуйте його лише для обходу Media CSP", + "VOTNewAudioPlayer": "Використовуйте новий аудіоплеєр" } diff --git a/src/localization/locales/ur.json b/src/localization/locales/ur.json index e33028fb..34b8ce1d 100644 --- a/src/localization/locales/ur.json +++ b/src/localization/locales/ur.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "مقامی ہیش", "VOTUpdatedAt": "پر اپ ڈیٹ", "VOTNeedWebAudioAPI": "اس کو فعال کرنے کے ل you ، آپ کے پاس ویب آڈیو API ہونا ضروری ہے", - "VOTBypassMediaCSP": "میڈیا ایس پی کو نظرانداز کرنا", - "VOTMediaCSPEnabledOnSite": "اس سائٹ پر میڈیا سی ایس پی فعال ہے" + "VOTMediaCSPEnabledOnSite": "اس سائٹ پر میڈیا سی ایس پی فعال ہے", + "VOTOnlyBypassMediaCSP": "اسے صرف میڈیا CSP کو نظرانداز کرنے کے لیے استعمال کریں ۔ ", + "VOTNewAudioPlayer": "نیا آڈیو پلیئر استعمال کریں" } diff --git a/src/localization/locales/uz.json b/src/localization/locales/uz.json index 617fb7b5..42758d82 100644 --- a/src/localization/locales/uz.json +++ b/src/localization/locales/uz.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Mahalliy Xash", "VOTUpdatedAt": "da yangilangan", "VOTNeedWebAudioAPI": "Buni yoqish uchun sizda veb-Audio API bo'lishi kerak", - "VOTBypassMediaCSP": "Mediacspni Chetlab O'tish", - "VOTMediaCSPEnabledOnSite": "Media CSP ushbu saytda yoqilgan" + "VOTMediaCSPEnabledOnSite": "Media CSP ushbu saytda yoqilgan", + "VOTOnlyBypassMediaCSP": "Uni faqat Media CSP-ni chetlab o'tish uchun foydalaning", + "VOTNewAudioPlayer": "Yangi audio pleerdan foydalaning" } diff --git a/src/localization/locales/vi.json b/src/localization/locales/vi.json index db282ef8..328a6b45 100644 --- a/src/localization/locales/vi.json +++ b/src/localization/locales/vi.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "Ngôn ngữ băm", "VOTUpdatedAt": "Cập nhật lúc", "VOTNeedWebAudioAPI": "Để kích hoạt ĐIỀU này, bạn phải có Api Âm Thanh Web", - "VOTBypassMediaCSP": "Bỏ Qua Media CSP", - "VOTMediaCSPEnabledOnSite": "Media CSP được kích hoạt trên trang web này" + "VOTMediaCSPEnabledOnSite": "Media CSP được kích hoạt trên trang web này", + "VOTOnlyBypassMediaCSP": "Chỉ sử dụng Nó để bỏ QUA Media Csp", + "VOTNewAudioPlayer": "Sử dụng trình phát âm thanh mới" } diff --git a/src/localization/locales/zh.json b/src/localization/locales/zh.json index aedda434..8efd0b6f 100644 --- a/src/localization/locales/zh.json +++ b/src/localization/locales/zh.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "区域设置哈希", "VOTUpdatedAt": "更新于", "VOTNeedWebAudioAPI": "要启用此功能,您必须具有Web音频API", - "VOTBypassMediaCSP": "绕过Media CSP", - "VOTMediaCSPEnabledOnSite": "媒体CSP在此站点上启用" + "VOTMediaCSPEnabledOnSite": "媒体CSP在此站点上启用", + "VOTOnlyBypassMediaCSP": "仅将其用于绕过媒体CSP", + "VOTNewAudioPlayer": "使用新的音频播放器" } diff --git a/src/localization/locales/zu.json b/src/localization/locales/zu.json index fd2fecbd..b717398b 100644 --- a/src/localization/locales/zu.json +++ b/src/localization/locales/zu.json @@ -201,6 +201,7 @@ "VOTLocaleHash": "I-hash yendawo", "VOTUpdatedAt": "Kubuyekezwe", "VOTNeedWebAudioAPI": "Ukuze ukwazi lokhu, kufanele UBE NE-WEB AUDIO API", - "VOTBypassMediaCSP": "Ukugwema I-Media CSP", - "VOTMediaCSPEnabledOnSite": "I-Media csp inikwe amandla kule sayithi" + "VOTMediaCSPEnabledOnSite": "I-Media csp inikwe amandla kule sayithi", + "VOTOnlyBypassMediaCSP": "Sebenzisa kuphela Bypassing Media Csp", + "VOTNewAudioPlayer": "Sebenzisa umdlali omusha audio" } diff --git a/src/localization/localizationProvider.js b/src/localization/localizationProvider.js index 066fd545..f8dd23bb 100644 --- a/src/localization/localizationProvider.js +++ b/src/localization/localizationProvider.js @@ -1,6 +1,6 @@ import defaultLocale from "./locales/en.json"; -import debug from "../utils/debug.js"; +import debug from "../utils/debug.ts"; import { contentUrl } from "../config/config.js"; import { votStorage } from "../utils/storage.js"; import { getTimestamp, GM_fetch } from "../utils/utils.js"; @@ -19,20 +19,19 @@ export const localizationProvider = new (class { gmValues = [ "locale-phrases", "locale-lang", - "locale-version", + "locale-hash", + "locale-updated-at", "locale-lang-override", ]; constructor() { const langOverride = votStorage.syncGet("locale-lang-override", "auto"); - if (langOverride && langOverride !== "auto") { - this.lang = langOverride; - } else { - this.lang = - (navigator.language || navigator.userLanguage) - ?.substr(0, 2) - ?.toLowerCase() ?? "en"; - } + this.lang = + langOverride && langOverride !== "auto" + ? langOverride + : (navigator.language || navigator.userLanguage) + ?.substr(0, 2) + ?.toLowerCase() ?? "en"; this.setLocaleFromJsonString(votStorage.syncGet("locale-phrases", "")); } diff --git a/src/styles/components/checkbox.scss b/src/styles/components/checkbox.scss index 061573be..97677be8 100644 --- a/src/styles/components/checkbox.scss +++ b/src/styles/components/checkbox.scss @@ -23,6 +23,10 @@ line-height: 1.5; text-align: start; + &-sub { + padding-left: 16px; + } + &[hidden] { display: none !important; } @@ -38,6 +42,7 @@ -moz-box-sizing: border-box; box-sizing: border-box; margin: 3px 1px; + padding: 0; border: solid 2px; background: transparent; /* Safari */ @@ -52,6 +57,7 @@ background-color 0.2s; & + span { + position: relative; display: inline-block; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; diff --git a/src/styles/components/slider.scss b/src/styles/components/slider.scss index 8af51f37..53164c10 100644 --- a/src/styles/components/slider.scss +++ b/src/styles/components/slider.scss @@ -35,12 +35,14 @@ } & > input { + border: none !important; appearance: none !important; -webkit-appearance: none !important; position: relative !important; top: 24px !important; display: block !important; margin: 0 0 -36px !important; + padding: 0 !important; width: 100% !important; height: 36px !important; background-color: transparent !important; diff --git a/src/styles/main.scss b/src/styles/main.scss index 6f7e97fc..f5f08a5a 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -1,24 +1,21 @@ -// @import url("https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200"); -// @import url("https://fonts.googleapis.com/css2?family=Fira+Sans:wght@100;200;300;400;500;600;700;800;900&display=swap"); +@use "components/buttons/contained.scss"; +@use "components/buttons/outlined.scss"; +@use "components/buttons/text.scss"; +@use "components/buttons/icon.scss"; -@import "./components/buttons/contained.scss"; -@import "./components/buttons/outlined.scss"; -@import "./components/buttons/text.scss"; -@import "./components/buttons/icon.scss"; +@use "components/textfield.scss"; +@use "components/checkbox.scss"; +@use "components/slider.scss"; +@use "components/select.scss"; +@use "components/header.scss"; +@use "components/info.scss"; +@use "components/details.scss"; -@import "./components/textfield.scss"; -@import "./components/checkbox.scss"; -@import "./components/slider.scss"; -@import "./components/select.scss"; -@import "./components/header.scss"; -@import "./components/info.scss"; -@import "./components/details.scss"; - -@import "./components/lang-select.scss"; -@import "./components/segmented-button.scss"; -@import "./components/menu.scss"; -@import "./components/dialog.scss"; -@import "./subtitles.scss"; +@use "components/lang-select.scss"; +@use "components/segmented-button.scss"; +@use "components/menu.scss"; +@use "components/dialog.scss"; +@use "subtitles.scss"; :root { --vot-font-family: "Roboto", "Segoe UI", BlinkMacSystemFont, system-ui, diff --git a/src/utils/VideoObserver.js b/src/utils/VideoObserver.js index b073050e..7042bac5 100644 --- a/src/utils/VideoObserver.js +++ b/src/utils/VideoObserver.js @@ -1,6 +1,6 @@ import "requestidlecallback-polyfill"; import { EventImpl } from "./EventImpl.js"; -import debug from "./debug.js"; +import debug from "./debug.ts"; const adKeywords = new Set([ "advertise", diff --git a/src/utils/debug.js b/src/utils/debug.js deleted file mode 100644 index de032ca5..00000000 --- a/src/utils/debug.js +++ /dev/null @@ -1,13 +0,0 @@ -const debug = {}; -debug.log = (...text) => { - if (!DEBUG_MODE) { - return; - } - return console.log( - "%c[VOT DEBUG]", - "background: #F2452D; color: #fff; padding: 5px;", - ...text, - ); -}; - -export default debug; diff --git a/src/utils/debug.ts b/src/utils/debug.ts new file mode 100644 index 00000000..5055b202 --- /dev/null +++ b/src/utils/debug.ts @@ -0,0 +1,12 @@ +export default { + log: (...text: unknown[]) => { + if (!DEBUG_MODE) { + return; + } + return console.log( + "%c[VOT DEBUG]", + "background: #F2452D; color: #fff; padding: 5px;", + ...text, + ); + }, +}; diff --git a/src/utils/storage.js b/src/utils/storage.js index 1166efc7..cb57e4e8 100644 --- a/src/utils/storage.js +++ b/src/utils/storage.js @@ -1,4 +1,4 @@ -import debug from "./debug.js"; +import debug from "./debug.ts"; export const votStorage = new (class { constructor() { diff --git a/src/utils/utils.js b/src/utils/utils.js index 0e17e012..9b15f46b 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -1,12 +1,21 @@ import { localizationProvider } from "../localization/localizationProvider.js"; -import debug from "./debug.js"; +import debug from "./debug.ts"; const userlang = navigator.language || navigator.userLanguage; +const MAX_SECS_FRACTION = 0.66; export const lang = userlang?.substr(0, 2)?.toLowerCase() ?? "en"; function secsToStrTime(secs) { - const minutes = Math.floor(secs / 60); - const seconds = Math.floor(secs % 60); + let minutes = Math.floor(secs / 60); + let seconds = Math.floor(secs % 60); + const fraction = seconds / 60; + if (fraction >= MAX_SECS_FRACTION) { + // rounding to the next minute if it has already been more than N% + // e.g. 100 -> 2 minutes + minutes += 1; + seconds = 0; + } + if (minutes >= 60) { return localizationProvider.get("translationTakeMoreThanHour"); } else if (minutes === 1 || (minutes === 0 && seconds > 0)) { @@ -29,11 +38,6 @@ function secsToStrTime(secs) { .replace("{0}", minutes); } -function langTo6391(lang) { - // convert lang to ISO 639-1 - return lang.toLowerCase().split(/[_;-]/)[0].trim(); -} - function isPiPAvailable() { return ( "pictureInPictureEnabled" in document && document.pictureInPictureEnabled @@ -50,11 +54,6 @@ function initHls() { : undefined; } -function initAudioContext() { - const audioContext = window.AudioContext || window.webkitAudioContext; - return audioContext ? new audioContext() : undefined; -} - const deletefilter = [ /(?:https?|ftp):\/\/\S+/g, /https?:\/\/\S+|www\.\S+/gm, @@ -174,10 +173,8 @@ function getTimestamp() { export { secsToStrTime, - langTo6391, isPiPAvailable, initHls, - initAudioContext, cleanText, downloadBlob, clearFileName, diff --git a/src/utils/vkUtils.js b/src/utils/vkUtils.js index a34be5c9..9da0038a 100644 --- a/src/utils/vkUtils.js +++ b/src/utils/vkUtils.js @@ -1,5 +1,6 @@ -import { langTo6391, cleanText } from "./utils.js"; -import debug from "./debug.js"; +import { normalizeLang } from "vot.js/utils/utils"; +import { cleanText } from "./utils.js"; +import debug from "./debug.ts"; // TODO?: move to vot.js patches function getPlayer() { @@ -26,7 +27,7 @@ function getSubtitles() { } const language = captionTrack.lang - ? langTo6391(captionTrack.lang) + ? normalizeLang(captionTrack.lang) : undefined; const url = captionTrack?.url; if (!language || !url) { diff --git a/src/utils/volume.js b/src/utils/volume.js index 05dacb85..90699b46 100644 --- a/src/utils/volume.js +++ b/src/utils/volume.js @@ -26,4 +26,8 @@ function syncVolume(element, sliderVolume, otherSliderVolume, tempVolume) { return finalValue; } -export { syncVolume }; +// 0.00 - 1.00 +const percentToDecibels = (percent) => 20 * Math.log10(percent / 1); +const decibelsToPercent = (dB) => Math.pow(10, dB / 20); + +export { syncVolume, percentToDecibels, decibelsToPercent }; diff --git a/src/utils/youtubeUtils.js b/src/utils/youtubeUtils.js index 29770991..170ba818 100644 --- a/src/utils/youtubeUtils.js +++ b/src/utils/youtubeUtils.js @@ -1,8 +1,9 @@ import { availableLangs } from "vot.js/consts"; +import { normalizeLang } from "vot.js/utils/utils"; -import debug from "./debug.js"; +import debug from "./debug.ts"; import { localizationProvider } from "../localization/localizationProvider.js"; -import { langTo6391, cleanText } from "./utils.js"; +import { cleanText } from "./utils.js"; import { detect } from "./translateApis.js"; // Get the language code from the response or the text @@ -15,7 +16,7 @@ async function getLanguage(player, response, title, description) { const audioTracks = player.getAudioTrack(); const trackInfo = audioTracks?.getLanguageInfo(); // get selected track info (id === "und" if tracks are not available) if (trackInfo?.id !== "und") { - return langTo6391(trackInfo.id.split(".")[0]); + return normalizeLang(trackInfo.id.split(".")[0]); } } @@ -26,7 +27,7 @@ async function getLanguage(player, response, title, description) { if (captionTracks?.length) { const autoCaption = captionTracks.find((caption) => caption.kind === "asr"); if (autoCaption && autoCaption.languageCode) { - return langTo6391(autoCaption.languageCode); + return normalizeLang(autoCaption.languageCode); } } @@ -206,7 +207,7 @@ function getSubtitles() { } const language = captionTrack.languageCode - ? langTo6391(captionTrack.languageCode) + ? normalizeLang(captionTrack.languageCode) : undefined; const url = captionTrack?.url || captionTrack?.baseUrl; if (!language || !url) { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..335a5d00 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "allowJs": true, + + // Bundler mode + "moduleResolution": "Bundler", + // "allowImportingTsExtensions": true, + "allowSyntheticDefaultImports": true, + // "verbatimModuleSyntax": true, + // "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/yarn.lock b/yarn.lock index 4a445022..75a8001f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,1039 +7,22 @@ resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.24.2", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== - dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.1", "@babel/compat-data@^7.25.2": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz" - integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== - -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@7.24.3": - version "7.24.3" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz" - integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.1" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.1" - "@babel/parser" "^7.24.1" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/eslint-parser@7.24.1": - version "7.24.1" - resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz" - integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - -"@babel/generator@^7.24.1", "@babel/generator@^7.25.4": - version "7.25.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz" - integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w== - dependencies: - "@babel/types" "^7.25.4" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz" - integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz" - integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": - version "7.25.2" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz" - integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== - dependencies: - "@babel/compat-data" "^7.25.2" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz" - integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/traverse" "^7.25.4" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.2": - version "7.25.2" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz" - integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - regexpu-core "^5.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.2": - version "0.6.2" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz" - integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-member-expression-to-functions@^7.24.8": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz" - integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== - dependencies: - "@babel/traverse" "^7.24.8" - "@babel/types" "^7.24.8" - -"@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0": - version "7.25.2" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz" - integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.2" - -"@babel/helper-optimise-call-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz" - integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz" - integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== - -"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz" - integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-wrap-function" "^7.25.0" - "@babel/traverse" "^7.25.0" - -"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz" - integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/traverse" "^7.25.0" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz" - integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.23.5", "@babel/helper-validator-option@^7.24.8": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz" - integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== - -"@babel/helper-wrap-function@^7.25.0": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz" - integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== - dependencies: - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/helpers@^7.24.1": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz" - integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== - dependencies: - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.24.1", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz" - integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA== - dependencies: - "@babel/types" "^7.25.4" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz" - integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz" - integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz" - integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.0" - -"@babel/plugin-proposal-decorators@7.24.1": - version "7.24.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz" - integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-decorators" "^7.24.1" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz" - integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz" - integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz" - integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz" - integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz" - integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz" - integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-remap-async-to-generator" "^7.25.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/traverse" "^7.25.4" - -"@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz" - integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" - -"@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz" - integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-block-scoping@^7.24.1": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz" - integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz" - integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.4" - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-transform-class-static-block@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz" - integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.24.1": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz" - integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/traverse" "^7.25.4" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz" - integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/template" "^7.24.7" - -"@babel/plugin-transform-destructuring@^7.24.1": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz" - integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz" - integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz" - integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz" - integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz" - integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz" - integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.24.1": - version "7.25.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz" - integrity sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/plugin-syntax-flow" "^7.24.7" - -"@babel/plugin-transform-for-of@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz" - integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - -"@babel/plugin-transform-function-name@^7.24.1": - version "7.25.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz" - integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== - dependencies: - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.1" - -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz" - integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.24.1": - version "7.25.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz" - integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz" - integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz" - integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz" - integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== - dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz" - integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== - dependencies: - "@babel/helper-module-transforms" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-simple-access" "^7.24.7" - -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz" - integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== - dependencies: - "@babel/helper-module-transforms" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.0" - -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz" - integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== - dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz" - integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz" - integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz" - integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz" - integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz" - integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== - dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.7" - -"@babel/plugin-transform-object-super@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz" - integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz" - integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.7": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz" - integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.24.1", "@babel/plugin-transform-parameters@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz" - integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-private-methods@^7.24.1": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz" - integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.4" - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-transform-private-property-in-object@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz" - integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz" - integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz" - integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz" - integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.24.7" - -"@babel/plugin-transform-react-jsx@^7.23.4", "@babel/plugin-transform-react-jsx@^7.24.7": - version "7.25.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz" - integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/types" "^7.25.2" - -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz" - integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz" - integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - regenerator-transform "^0.15.2" - -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz" - integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz" - integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-spread@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz" - integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - -"@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz" - integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz" - integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-typeof-symbol@^7.24.1": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz" - integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz" - integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz" - integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz" - integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz" - integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/preset-env@7.24.3": - version "7.24.3" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz" - integrity sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA== - dependencies: - "@babel/compat-data" "^7.24.1" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.1" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.1" - "@babel/plugin-transform-classes" "^7.24.1" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.1" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.1" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - "@babel/plugin-transform-parameters" "^7.24.1" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.1" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.1" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" - semver "^6.3.1" - -"@babel/preset-flow@7.24.1": - version "7.24.1" - resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.1.tgz" - integrity sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-flow-strip-types" "^7.24.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@7.24.1": - version "7.24.1" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.8.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz" - integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.24.0", "@babel/template@^7.24.7", "@babel/template@^7.25.0": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/traverse@^7.24.1", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz" - integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.4" - "@babel/parser" "^7.25.4" - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.4" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.24.0", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.4.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz" - integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ== - dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": +"@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@4.10.0": - version "4.10.0" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.8.0": - version "4.11.0" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.18.0": version "0.18.0" @@ -1050,10 +33,10 @@ debug "^4.3.1" minimatch "^3.1.2" -"@eslint/core@^0.6.0": - version "0.6.0" - resolved "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz" - integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== +"@eslint/core@^0.7.0": + version "0.7.0" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz" + integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== "@eslint/eslintrc@^3.1.0": version "3.1.0" @@ -1070,10 +53,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.11.1": - version "9.11.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz" - integrity sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA== +"@eslint/js@9.14.0": + version "9.14.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz" + integrity sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg== "@eslint/object-schema@^2.1.4": version "2.1.4" @@ -1087,15 +70,33 @@ dependencies: levn "^0.4.1" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz" - integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + version "0.3.1" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.0": + version "0.4.0" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz" + integrity sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g== "@jest/schemas@^29.6.3": version "29.6.3" @@ -1116,7 +117,7 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.0": version "0.3.5" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== @@ -1148,7 +149,7 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.9": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -1193,38 +194,92 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.2.0" -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" +"@oxlint/win32-x64@0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-0.11.0.tgz" + integrity sha512-5CHtAp82xbv0jnh/HGi3QE0ANBr3+R338MA0wgZXc7477Vuri0aSK0T9oRU+K/pVloPVJaWKSDCCZoiZIYckzg== -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== +"@parcel/watcher-win32-x64@2.5.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz" + integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== + +"@parcel/watcher@^2.4.1": + version "2.5.0" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz" + integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.0" + "@parcel/watcher-darwin-arm64" "2.5.0" + "@parcel/watcher-darwin-x64" "2.5.0" + "@parcel/watcher-freebsd-x64" "2.5.0" + "@parcel/watcher-linux-arm-glibc" "2.5.0" + "@parcel/watcher-linux-arm-musl" "2.5.0" + "@parcel/watcher-linux-arm64-glibc" "2.5.0" + "@parcel/watcher-linux-arm64-musl" "2.5.0" + "@parcel/watcher-linux-x64-glibc" "2.5.0" + "@parcel/watcher-linux-x64-musl" "2.5.0" + "@parcel/watcher-win32-arm64" "2.5.0" + "@parcel/watcher-win32-ia32" "2.5.0" + "@parcel/watcher-win32-x64" "2.5.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== -"@oxlint/win32-x64@0.9.8": - version "0.9.8" - resolved "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-0.9.8.tgz" - integrity sha512-wPa3vQb73Pl0z6nkEVmY6G4sO+2xf6QXPqAxDtd7kzxrGrSkTXvTNS/gKIxmvuUy+KjKDcSC2pfJL/074yE6aQ== +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -1246,6 +301,13 @@ dependencies: "@types/node" "*" +"@types/bun@^1.1.13": + version "1.1.13" + resolved "https://registry.npmjs.org/@types/bun/-/bun-1.1.13.tgz" + integrity sha512-KmQxSBgVWCl6RSuerlLGZlIWfdxkKqat0nxN61+qu4y1KDn0Ll3j7v1Pl8GnaL3a/U6GGWVTJh75ap62kR1E8Q== + dependencies: + bun-types "1.1.34" + "@types/connect-history-api-fallback@^1.5.4": version "1.5.4" resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz" @@ -1261,7 +323,15 @@ dependencies: "@types/node" "*" -"@types/eslint@^8.56.10": +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^8.56.10": version "8.56.10" resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz" integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== @@ -1269,7 +339,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.5", "@types/estree@^1.0.6": +"@types/estree@*", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== @@ -1330,11 +400,6 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - "@types/mime@*", "@types/mime@^1": version "1.3.4" resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz" @@ -1347,7 +412,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@~20.12.8": +"@types/node@*", "@types/node@>=13.7.0", "@types/node@~20.12.8": version "20.12.14" resolved "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz" integrity sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg== @@ -1424,132 +489,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.16.1": - version "7.16.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz" - integrity sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/type-utils" "7.16.1" - "@typescript-eslint/utils" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@^7.0.0": - version "7.18.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz" - integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== - dependencies: - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@7.16.1": - version "7.16.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz" - integrity sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw== - dependencies: - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" - -"@typescript-eslint/scope-manager@7.18.0": - version "7.18.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz" - integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - -"@typescript-eslint/type-utils@7.16.1": - version "7.16.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz" - integrity sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA== - dependencies: - "@typescript-eslint/typescript-estree" "7.16.1" - "@typescript-eslint/utils" "7.16.1" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@7.16.1": - version "7.16.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz" - integrity sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ== - -"@typescript-eslint/types@7.18.0": - version "7.18.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz" - integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== - -"@typescript-eslint/typescript-estree@7.16.1": - version "7.16.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz" - integrity sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ== - dependencies: - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/typescript-estree@7.18.0": - version "7.18.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@^7.16.1": - version "7.18.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz" - integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - -"@typescript-eslint/utils@7.16.1": - version "7.16.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz" - integrity sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/typescript-estree" "7.16.1" - -"@typescript-eslint/visitor-keys@7.16.1": - version "7.16.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz" - integrity sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg== - dependencies: - "@typescript-eslint/types" "7.16.1" - eslint-visitor-keys "^3.4.3" - -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== - dependencies: - "@typescript-eslint/types" "7.18.0" - eslint-visitor-keys "^3.4.3" - "@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": version "1.12.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" @@ -1709,20 +648,15 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.12.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.8.2: + version "8.14.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== ajv-formats@^2.1.1: version "2.1.1" @@ -1800,13 +734,6 @@ ansi-regex@^6.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" @@ -1837,165 +764,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@~5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlast@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz" - integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@^4.9.1: - version "4.10.0" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz" - integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== - -axobject-query@~3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" - -babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.11" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz" - integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.2" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.6" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz" - integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" - core-js-compat "^3.38.0" - -babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz" - integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -2076,30 +854,25 @@ browser-id3-writer@^6.1.0: resolved "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-6.1.0.tgz" integrity sha512-99mQN3GAZlqWnbA0cispSAab9uJJzzv86ffoA/w6ohfqAi/5qOGbEhh0fRAQMrnhsOBsy89mqMc+JdnaWtJObw== -browserslist@^4.21.10, browserslist@^4.23.1, browserslist@^4.23.3, browserslist@^4.24.0, "browserslist@>= 4.21.0": - version "4.24.0" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz" - integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== +browserslist@^4.24.0, browserslist@^4.24.2, "browserslist@>= 4.21.0": + version "4.24.2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001663" - electron-to-chromium "^1.5.28" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" node-releases "^2.0.18" - update-browserslist-db "^1.1.0" + update-browserslist-db "^1.1.1" buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -builtin-modules@3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -bun-types@^1.1.29: - version "1.1.29" - resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.1.29.tgz" - integrity sha512-En3/TzSPMPyl5UlUB1MHzHpcrZDakTm7mS203eLoX1fBoEa3PW+aSS8GAqVJ7Is/m34Z5ogL+ECniLY0uDaCPw== +bun-types@1.1.34: + version "1.1.34" + resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.1.34.tgz" + integrity sha512-br5QygTEL/TwB4uQOb96Ky22j4Gq2WxWH/8Oqv20fk5HagwKXo/akB+LiYgSfzexCt6kkcUaVm+bKiPl71xPvw== dependencies: "@types/node" "~20.12.8" "@types/ws" "~8.5.10" @@ -2121,7 +894,7 @@ bytes@3.1.2: resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: +call-bind@^1.0.5, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -2137,21 +910,19 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -caniuse-lite@^1.0.30001663: - version "1.0.30001663" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz" - integrity sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA== +caniuse-lite@^1.0.30001669: + version "1.0.30001677" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz" + integrity sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog== -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chaimu@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/chaimu/-/chaimu-1.0.2.tgz" + integrity sha512-4JtFq1oVUtycdFqPa3b2EqisZj4CVdU4bi7qUJz83SuG7vOMjNctddalbkV+ttSJyBxAWoXU4jXyEUmuASS7FA== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + soundtouchjs "^0.1.30" -chalk@^4.0.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2220,13 +991,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" @@ -2239,11 +1003,6 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - colorette@^2.0.0, colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.20: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -2306,11 +1065,6 @@ content-type@~1.0.4, content-type@~1.0.5: resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" @@ -2321,13 +1075,6 @@ cookie@0.6.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -core-js-compat@^3.31.0, core-js-compat@^3.38.0: - version "3.38.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz" - integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== - dependencies: - browserslist "^4.23.3" - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -2342,46 +1089,7 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2402,30 +1110,6 @@ debug@2.6.9: dependencies: ms "2.0.0" -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -2444,7 +1128,7 @@ default-browser@^5.2.1: bundle-name "^4.1.0" default-browser-id "^5.0.0" -define-data-property@^1.0.1, define-data-property@^1.1.4: +define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -2458,15 +1142,6 @@ define-lazy-prop@^3.0.0: resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" @@ -2492,13 +1167,6 @@ detect-node@^2.0.4: resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - dns-packet@^5.2.2: version "5.6.1" resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" @@ -2506,13 +1174,6 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - dom-parser@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/dom-parser/-/dom-parser-1.1.5.tgz" @@ -2523,27 +1184,22 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.28: - version "1.5.28" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz" - integrity sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw== +electron-to-chromium@^1.5.41: + version "1.5.50" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz" + integrity sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw== emoji-regex@^10.3.0: version "10.3.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz" integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^5.17.1: +enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.1: version "5.17.1" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -2569,58 +1225,6 @@ environment@^1.0.0: resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== -es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: - version "1.23.3" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" @@ -2628,241 +1232,42 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - -es-iterator-helpers@^1.0.19: - version "1.0.19" - resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - es-module-lexer@^1.2.1: version "1.3.1" resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@^6.8.0: - version "6.9.0" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz" - integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== - dependencies: - aria-query "~5.1.3" - array-includes "^3.1.8" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "^4.9.1" - axobject-query "~3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.19" - hasown "^2.0.2" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - safe-regex-test "^1.0.3" - string.prototype.includes "^2.0.0" - -eslint-plugin-oxlint@^0.9.8: - version "0.9.8" - resolved "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-0.9.8.tgz" - integrity sha512-SR6tUbnjXkx6BS5COhqcq9cAW4i1HnHhzZpwpQT0EOI+01O0Yc5FnqrN11xXxu/FKprDIOYT7TEpg57LRNwXUA== - dependencies: - scule "^1.3.0" - -eslint-plugin-react-hooks@4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.35.0: - version "7.35.0" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz" - integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.2" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.19" - estraverse "^5.3.0" - hasown "^2.0.2" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.8" - object.fromentries "^2.0.8" - object.values "^1.2.0" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.11" - string.prototype.repeat "^1.0.0" - -eslint-plugin-sonarjs@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-2.0.2.tgz" - integrity sha512-0JUYTlUDk/up3mS0rFP9vHCRvhIYNTy06m99IPFeyMDUWL8u0ebz+nFPYn6OWDBTIEfbvQ/Xe0PdjWO8w0WD0Q== - dependencies: - "@babel/core" "7.24.3" - "@babel/eslint-parser" "7.24.1" - "@babel/plugin-proposal-decorators" "7.24.1" - "@babel/preset-env" "7.24.3" - "@babel/preset-flow" "7.24.1" - "@babel/preset-react" "7.24.1" - "@eslint-community/regexpp" "4.10.0" - "@typescript-eslint/eslint-plugin" "7.16.1" - "@typescript-eslint/utils" "^7.16.1" - builtin-modules "3.3.0" - bytes "3.1.2" - eslint-plugin-import "^2.29.1" - eslint-plugin-jsx-a11y "^6.8.0" - eslint-plugin-react "^7.35.0" - eslint-plugin-react-hooks "4.6.0" - eslint-scope "8.0.1" - functional-red-black-tree "1.0.1" - jsx-ast-utils "^3.3.5" - minimatch "^9.0.3" - scslre "0.3.0" - semver "7.6.0" - typescript "*" - vue-eslint-parser "9.4.3" - -eslint-scope@^7.1.1: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-plugin-oxlint@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-0.11.0.tgz" + integrity sha512-9CHYh1eLt2Z83ShLbvj79G6lqC2qLJBfsd7baGWOwDmLM2GXu2COi1r4tMMS2OI8gfB4s2uOgS8ZiYzHhN8uzQ== dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" + jsonc-parser "^3.3.1" -eslint-scope@^8.0.2: - version "8.0.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz" - integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -2875,28 +1280,15 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz" - integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.3.0: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz" - integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== eslint-webpack-plugin@^4.2.0: version "4.2.0" @@ -2909,21 +1301,21 @@ eslint-webpack-plugin@^4.2.0: normalize-path "^3.0.0" schema-utils "^4.2.0" -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.5.0 || ^8.0.0", "eslint@^8.0.0 || ^9.0.0", eslint@^8.56.0, eslint@^9.11.1, eslint@>=6.0.0: - version "9.11.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz" - integrity sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg== +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.0.0 || ^9.0.0", eslint@^9.14.0: + version "9.14.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz" + integrity sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.11.0" + "@eslint-community/regexpp" "^4.12.1" "@eslint/config-array" "^0.18.0" - "@eslint/core" "^0.6.0" + "@eslint/core" "^0.7.0" "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.11.1" + "@eslint/js" "9.14.0" "@eslint/plugin-kit" "^0.2.0" + "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.0" - "@nodelib/fs.walk" "^1.2.8" + "@humanwhocodes/retry" "^0.4.0" "@types/estree" "^1.0.6" "@types/json-schema" "^7.0.15" ajv "^6.12.4" @@ -2931,9 +1323,9 @@ eslint-webpack-plugin@^4.2.0: cross-spawn "^7.0.2" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.0.2" - eslint-visitor-keys "^4.0.0" - espree "^10.1.0" + eslint-scope "^8.2.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" @@ -2943,34 +1335,23 @@ eslint-webpack-plugin@^4.2.0: ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" 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" - strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^10.0.1, espree@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz" - integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== - dependencies: - acorn "^8.12.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.0.0" - -espree@^9.3.1: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: - acorn "^8.9.0" + acorn "^8.14.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.2.0" -esquery@^1.4.0, esquery@^1.5.0: +esquery@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== @@ -2989,7 +1370,7 @@ estraverse@^4.1.1: resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -3081,17 +1462,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" @@ -3107,13 +1477,6 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" @@ -3194,13 +1557,6 @@ follow-redirects@^1.0.0: resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" @@ -3231,37 +1587,12 @@ function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functional-red-black-tree@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - get-east-asian-width@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz" integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -3277,22 +1608,6 @@ get-stream@^8.0.1: resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" @@ -3324,40 +1639,15 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^14.0.0: version "14.0.0" resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^15.9.0: - version "15.9.0" - resolved "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz" - integrity sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA== - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" +globals@^15.12.0: + version "15.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz" + integrity sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ== gopd@^1.0.1: version "1.0.1" @@ -3371,56 +1661,34 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: +has-proto@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -3515,7 +1783,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ignore@^5.2.0, ignore@^5.3.1: +ignore@^5.2.0: version "5.3.2" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== @@ -3564,15 +1832,6 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -internal-slot@^1.0.4, internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - interpret@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" @@ -3588,36 +1847,6 @@ ipaddr.js@1.9.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -3625,39 +1854,12 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" + hasown "^2.0.2" is-docker@^2.0.0: version "2.2.1" @@ -3674,13 +1876,6 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - is-fullwidth-code-point@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" @@ -3693,13 +1888,6 @@ is-fullwidth-code-point@^5.0.0: dependencies: get-east-asian-width "^1.0.0" -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" @@ -3714,38 +1902,16 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" -is-map@^2.0.2, is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - is-network-error@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz" integrity sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" @@ -3756,73 +1922,12 @@ is-plain-object@^2.0.4: resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: - isobject "^3.0.1" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.2, is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" + isobject "^3.0.1" -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-wsl@^2.1.1: version "2.2.0" @@ -3853,22 +1958,16 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - jest-util@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" @@ -3900,11 +1999,6 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" @@ -3912,16 +2006,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" @@ -3932,10 +2016,10 @@ json-parse-even-better-errors@^2.3.1: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-parse-even-better-errors@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz" - integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== +json-parse-even-better-errors@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz" + integrity sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA== json-schema-traverse@^0.4.1: version "0.4.1" @@ -3962,17 +2046,10 @@ json-stable-stringify@^1.0.2: jsonify "^0.0.1" object-keys "^1.1.1" -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== jsonfile@^6.0.1: version "6.1.0" @@ -3988,16 +2065,6 @@ jsonify@^0.0.1: resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz" integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - keyv@^4.5.4: version "4.5.4" resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" @@ -4017,18 +2084,6 @@ klaw-sync@^6.0.0: dependencies: graceful-fs "^4.1.11" -language-subtag-registry@^0.3.20: - version "0.3.23" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - launch-editor@^2.6.1: version "2.6.1" resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz" @@ -4045,28 +2100,28 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lightningcss-win32-x64-msvc@1.27.0: - version "1.27.0" - resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz" - integrity sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw== +lightningcss-win32-x64-msvc@1.28.1: + version "1.28.1" + resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.1.tgz" + integrity sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA== -lightningcss@^1.27.0: - version "1.27.0" - resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz" - integrity sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ== +lightningcss@^1.28.1: + version "1.28.1" + resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.1.tgz" + integrity sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ== dependencies: detect-libc "^1.0.3" optionalDependencies: - lightningcss-darwin-arm64 "1.27.0" - lightningcss-darwin-x64 "1.27.0" - lightningcss-freebsd-x64 "1.27.0" - lightningcss-linux-arm-gnueabihf "1.27.0" - lightningcss-linux-arm64-gnu "1.27.0" - lightningcss-linux-arm64-musl "1.27.0" - lightningcss-linux-x64-gnu "1.27.0" - lightningcss-linux-x64-musl "1.27.0" - lightningcss-win32-arm64-msvc "1.27.0" - lightningcss-win32-x64-msvc "1.27.0" + lightningcss-darwin-arm64 "1.28.1" + lightningcss-darwin-x64 "1.28.1" + lightningcss-freebsd-x64 "1.28.1" + lightningcss-linux-arm-gnueabihf "1.28.1" + lightningcss-linux-arm64-gnu "1.28.1" + lightningcss-linux-arm64-musl "1.28.1" + lightningcss-linux-x64-gnu "1.28.1" + lightningcss-linux-x64-musl "1.28.1" + lightningcss-win32-arm64-msvc "1.28.1" + lightningcss-win32-x64-msvc "1.28.1" lilconfig@~3.1.2: version "3.1.2" @@ -4117,10 +2172,10 @@ lit-html@^3.2.0: dependencies: "@types/trusted-types" "^2.0.2" -lit@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/lit/-/lit-3.2.0.tgz" - integrity sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw== +lit@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz" + integrity sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w== dependencies: "@lit/reactive-element" "^2.0.4" lit-element "^4.1.0" @@ -4145,11 +2200,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" @@ -4171,26 +2221,10 @@ log-update@^6.1.0: strip-ansi "^7.1.0" wrap-ansi "^9.0.0" -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" +long@^5.0.0: + version "5.2.3" + resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== media-typer@0.3.0: version "0.3.0" @@ -4222,17 +2256,12 @@ merge-stream@^2.0.0: resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - methods@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@~4.0.8: +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.5, micromatch@~4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -4286,14 +2315,7 @@ minimatch@^9.0.0: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.3, minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -4303,16 +2325,16 @@ mitt@^3.0.1: resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== -ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -4341,6 +2363,11 @@ neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-forge@^1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" @@ -4356,23 +2383,24 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-normalize-package-bin@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz" - integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== +npm-normalize-package-bin@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz" + integrity sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== -npm-run-all2@^6.2.3: - version "6.2.3" - resolved "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.3.tgz" - integrity sha512-5RsxC7jEc/RjxOYBVdEfrJf5FsJ0pHA7jr2/OxrThXknajETCTYjigOCG3iaGjdYIKEQlDuCG0ir0T1HTva8pg== +npm-run-all2@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-7.0.1.tgz" + integrity sha512-Adbv+bJQ8UTAM03rRODqrO5cx0YU5KCG2CvHtSURiadvdTjjgGJXdbc1oQ9CXBh9dnGfHSoSB1Web/0Dzp6kOQ== dependencies: ansi-styles "^6.2.1" cross-spawn "^7.0.3" memorystream "^0.3.1" minimatch "^9.0.0" pidtree "^0.6.0" - read-package-json-fast "^3.0.2" + read-package-json-fast "^4.0.0" shell-quote "^1.7.3" + which "^5.0.0" npm-run-path@^5.1.0: version "5.1.0" @@ -4381,76 +2409,16 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.8: - version "1.1.8" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.7, object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" @@ -4524,19 +2492,19 @@ os-tmpdir@~1.0.2: resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -oxlint@^0.9.8: - version "0.9.8" - resolved "https://registry.npmjs.org/oxlint/-/oxlint-0.9.8.tgz" - integrity sha512-FnRcPEerznjvFuAD6fvg04ZwXuihzWZa/ciN2g7o2/rV0uRJGGl4hazrFpetf8uv2pnUr3n5TJ6u4d5rSvaapQ== +oxlint@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/oxlint/-/oxlint-0.11.0.tgz" + integrity sha512-uY6/R4k5bECwJBR+y8CqGRcUb5hxNReziBjt5+pk6DKxj46DqMd6HwEk090KnaH1czVf23r8mcEsJYGowMWeIA== optionalDependencies: - "@oxlint/darwin-arm64" "0.9.8" - "@oxlint/darwin-x64" "0.9.8" - "@oxlint/linux-arm64-gnu" "0.9.8" - "@oxlint/linux-arm64-musl" "0.9.8" - "@oxlint/linux-x64-gnu" "0.9.8" - "@oxlint/linux-x64-musl" "0.9.8" - "@oxlint/win32-arm64" "0.9.8" - "@oxlint/win32-x64" "0.9.8" + "@oxlint/darwin-arm64" "0.11.0" + "@oxlint/darwin-x64" "0.11.0" + "@oxlint/linux-arm64-gnu" "0.11.0" + "@oxlint/linux-arm64-musl" "0.11.0" + "@oxlint/linux-x64-gnu" "0.11.0" + "@oxlint/linux-x64-musl" "0.11.0" + "@oxlint/win32-arm64" "0.11.0" + "@oxlint/win32-x64" "0.11.0" p-limit@^2.2.0: version "2.3.0" @@ -4643,15 +2611,10 @@ path-to-regexp@0.1.7: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -4670,16 +2633,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postinstall-postinstall@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz" - integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -4690,14 +2643,23 @@ process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" +protobufjs@^7.4.0: + version "7.4.0" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" proxy-addr@~2.0.7: version "2.0.7" @@ -4719,11 +2681,6 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" @@ -4746,18 +2703,13 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -read-package-json-fast@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz" - integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== +read-package-json-fast@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz" + integrity sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg== dependencies: - json-parse-even-better-errors "^3.0.0" - npm-normalize-package-bin "^3.0.0" + json-parse-even-better-errors "^4.0.0" + npm-normalize-package-bin "^4.0.0" readable-stream@^2.0.1: version "2.3.8" @@ -4800,87 +2752,6 @@ rechoir@^0.8.0: dependencies: resolve "^1.20.0" -refa@^0.12.0, refa@^0.12.1: - version "0.12.1" - resolved "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz" - integrity sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g== - dependencies: - "@eslint-community/regexpp" "^4.8.0" - -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexp-ast-analysis@^0.7.0: - version "0.7.1" - resolved "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz" - integrity sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A== - dependencies: - "@eslint-community/regexpp" "^4.8.0" - refa "^0.12.1" - -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - requestidlecallback-polyfill@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/requestidlecallback-polyfill/-/requestidlecallback-polyfill-1.0.2.tgz" @@ -4913,7 +2784,7 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: +resolve@^1.20.0: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -4922,15 +2793,6 @@ resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - restore-cursor@^5.0.0: version "5.1.0" resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" @@ -4944,11 +2806,6 @@ retry@^0.13.1: resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - rfdc@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" @@ -4966,23 +2823,6 @@ run-applescript@^7.0.0: resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz" integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" @@ -4998,28 +2838,21 @@ safe-buffer@5.1.2: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.79.3: - version "1.79.3" - resolved "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz" - integrity sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA== +sass@^1.80.6: + version "1.80.6" + resolved "https://registry.npmjs.org/sass/-/sass-1.80.6.tgz" + integrity sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg== dependencies: chokidar "^4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" schema-utils@^3.1.1: version "3.3.0" @@ -5049,20 +2882,6 @@ schema-utils@^4.0.0, schema-utils@^4.2.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -scslre@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz" - integrity sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ== - dependencies: - "@eslint-community/regexpp" "^4.8.0" - refa "^0.12.0" - regexp-ast-analysis "^0.7.0" - -scule@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz" - integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g== - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" @@ -5076,23 +2895,11 @@ selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.6, semver@^7.5.3, semver@^7.6.0: +semver@^7.3.4, semver@^7.5.3: version "7.6.3" resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@7.6.0: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -5154,16 +2961,6 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" @@ -5198,7 +2995,7 @@ shell-quote@^1.7.3, shell-quote@^1.8.1: resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -side-channel@^1.0.4, side-channel@^1.0.6: +side-channel@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== @@ -5218,11 +3015,6 @@ slash@^2.0.0: resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" @@ -5248,6 +3040,11 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +soundtouchjs@^0.1.30: + version "0.1.30" + resolved "https://registry.npmjs.org/soundtouchjs/-/soundtouchjs-0.1.30.tgz" + integrity sha512-qc1kMCPQ+SH8tmoPwVSpVInGAE4XFyQ5uZLm1rLyGjwD+MT2ZdBWHWureyq2akDBYBE81GI0I0FdLCNBf86zDQ== + "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" @@ -5266,6 +3063,11 @@ source-map@^0.6.0: resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" @@ -5299,13 +3101,6 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" @@ -5334,68 +3129,6 @@ string-width@^7.0.0: get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" -string.prototype.includes@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz" - integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.matchall@^4.0.11: - version "4.0.11" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.repeat@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz" - integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -5410,11 +3143,6 @@ strip-ansi@^7.1.0: dependencies: ansi-regex "^6.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - strip-final-newline@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" @@ -5425,13 +3153,6 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -5499,11 +3220,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -5521,25 +3237,21 @@ tree-dump@^1.0.1: resolved "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz" integrity sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ== -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== +ts-loader@^9.5.1: + version "9.5.1" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz" + integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + source-map "^0.7.4" tslib@^2, tslib@^2.0.0, tslib@2: - version "2.6.3" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + version "2.7.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -5556,93 +3268,16 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@*, typescript@^5.0.0, typescript@^5.6.2, typescript@>=4.2.0: - version "5.6.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz" - integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" +typescript@*, typescript@^5.0.0, typescript@^5.6.3: + version "5.6.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== undici-types@~5.26.4: version "5.26.5" resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - universalify@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" @@ -5653,13 +3288,13 @@ unpipe@~1.0.0, unpipe@1.0.0: resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" @@ -5688,25 +3323,13 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vot.js@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/vot.js/-/vot.js-1.3.1.tgz" - integrity sha512-haeNu1XyLEnrReWAkOpZVDYLKMzz8jwzpWyrufffsO+KBLX8rIZlMDcWk/u2A6fST2rLRzylK9SGsdhAYCAMUg== +vot.js@^1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/vot.js/-/vot.js-1.3.8.tgz" + integrity sha512-CKCKB+VpYyrtULWvbPTIaoWKLRQ0mmTUeNmjsBMO2Dgk88hjW/1H4Wz+qCViju0nulAbuE0dtFMAWM2rnaG5fA== dependencies: dom-parser "^1.1.5" - -vue-eslint-parser@9.4.3: - version "9.4.3" - resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz" - integrity sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg== - dependencies: - debug "^4.3.4" - eslint-scope "^7.1.1" - eslint-visitor-keys "^3.3.0" - espree "^9.3.1" - esquery "^1.4.0" - lodash "^4.17.21" - semver "^7.3.6" + protobufjs "^7.4.0" watchpack@^2.4.1: version "2.4.1" @@ -5812,18 +3435,18 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.0.0, webpack@^5.1.0, webpack@^5.95.0, webpack@5.x.x: - version "5.95.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz" - integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== +webpack@^5.0.0, webpack@^5.1.0, webpack@^5.96.1, webpack@5.x.x: + version "5.96.1" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz" + integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== dependencies: - "@types/estree" "^1.0.5" + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" "@webassemblyjs/ast" "^1.12.1" "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" @@ -5855,56 +3478,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.4" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz" - integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== - dependencies: - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.2" - which-typed-array "^1.1.15" - -which-collection@^1.0.1, which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -5912,6 +3485,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/which/-/which-5.0.0.tgz" + integrity sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ== + dependencies: + isexe "^3.1.1" + wildcard@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" @@ -5936,16 +3516,6 @@ ws@^8.18.0: resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^2.2.2, yaml@~2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz"