diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..fd48c81 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,37 @@ +import config from '@iobroker/eslint-config'; + +export default [ + ...config, + { + languageOptions: { + parserOptions: { + projectService: { + allowDefaultProject: ['*.mjs'], + }, + tsconfigRootDir: import.meta.dirname, + project: './tsconfig.json', + }, + }, + }, + { + ignores: [ + 'src-admin/**/*', + 'admin/**/*', + 'node_modules/**/*', + 'test/**/*', + 'build/**/*', + 'tasks.js', + 'tmp/**/*', + '.**/*', + ], + }, + { + // disable temporary the rule 'jsdoc/require-param' and enable 'jsdoc/require-jsdoc' + rules: { + 'jsdoc/require-jsdoc': 'off', + 'jsdoc/require-param': 'off', + + '@typescript-eslint/no-require-imports': 'off', + }, + }, +]; diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 47bfb14..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Copyright 2018-2023 bluefox - * - * MIT License - * - **/ -'use strict'; - -const gulp = require('gulp'); -const fs = require('fs'); -const replace = require('gulp-replace'); -const rename = require('gulp-rename'); -const cp = require('child_process'); -const adapterName = require('./package.json').name.replace('iobroker.', ''); -const gulpHelper = require('@iobroker/vis-2-widgets-react-dev/gulpHelper'); - -gulpHelper.gulpTasks(gulp, adapterName, __dirname, `${__dirname}/src-widgets/`); - -gulp.task('default', gulp.series('widget-build')); -function deleteFoldersRecursive(path, exceptions) { - if (fs.existsSync(path)) { - const files = fs.readdirSync(path); - for (const file of files) { - const curPath = `${path}/${file}`; - if (exceptions && exceptions.find(e => curPath.endsWith(e))) { - continue; - } - - const stat = fs.statSync(curPath); - if (stat.isDirectory()) { - deleteFoldersRecursive(curPath); - fs.rmdirSync(curPath); - } else { - fs.unlinkSync(curPath); - } - } - } -} -gulp.task('clean', done => { - deleteFoldersRecursive(`${__dirname}/admin`); - deleteFoldersRecursive(`${__dirname}/src/build`); - done(); -}); - -function npmInstall() { - return new Promise((resolve, reject) => { - // Install node modules - const cwd = `${__dirname.replace(/\\/g, '/')}/src/`; - - const cmd = `npm install -f`; - console.log(`"${cmd} in ${cwd}`); - - // System call used for update of js-controller itself, - // because during installation npm packet will be deleted too, but some files must be loaded even during the install process. - const child = cp.exec(cmd, {cwd}); - - // @ts-ignore - child.stderr.pipe(process.stderr); - // @ts-ignore - child.stdout.pipe(process.stdout); - - child.on('exit', (code /* , signal */) => { - // code 1 is strange error that cannot be explained. Everything is installed but error :( - if (code && code !== 1) { - reject(`Cannot install: ${code}`); - } else { - console.log(`"${cmd} in ${cwd} finished.`); - // command succeeded - resolve(null); - } - }); - }); -} - -gulp.task('2-npm', () => { - if (fs.existsSync(`${__dirname}/src/node_modules`)) { - return Promise.resolve(); - } else { - return npmInstall(); - } -}); - -gulp.task('2-npm-dep', gulp.series('clean', '2-npm')); - -function build() { - return new Promise((resolve, reject) => { - const options = { - stdio: 'pipe', - cwd: `${__dirname}/src/`, - env: { - DANGEROUSLY_DISABLE_HOST_CHECK: 'true', - }, - }; - - const version = JSON.parse(fs.readFileSync(`${__dirname}/package.json`).toString('utf8')).version; - const data = JSON.parse(fs.readFileSync(`${__dirname}/src/package.json`).toString('utf8')); - data.version = version; - fs.writeFileSync(`${__dirname}/src/package.json`, JSON.stringify(data, null, 4)); - - console.log(options.cwd); - - let script = `${__dirname}/src/node_modules/react-scripts/scripts/build.js`; - if (!fs.existsSync(script)) { - script = `${__dirname}/node_modules/react-scripts/scripts/build.js`; - } - if (!fs.existsSync(script)) { - console.error(`Cannot find execution file: ${script}`); - reject(`Cannot find execution file: ${script}`); - } else { - // @ts-ignore - const child = cp.fork(script, [], options); - // @ts-ignore - child.stdout.on('data', data => console.log(data.toString())); - // @ts-ignore - child.stderr.on('data', data => console.log(data.toString())); - child.on('close', code => { - console.log(`child process exited with code ${code}`); - code ? reject(`Exit code: ${code}`) : resolve(null); - }); - } - }); -} - -gulp.task('3-build', () => build()); - -gulp.task('3-build-dep', gulp.series('2-npm', '3-build')); - -function copyFiles() { - deleteFoldersRecursive(`${__dirname}/admin`); - return Promise.all([ - gulp.src([ - 'src/build/**/*', - '!src/build/index.html', - '!src/build/static/js/main.*.chunk.js', - '!src/build/i18n/**/*', - '!src/build/i18n', - 'admin-config/*' - ]) - .pipe(gulp.dest('admin/')), - - gulp.src([ - 'src/build/index.html', - ]) - .pipe(replace('href="/', 'href="')) - .pipe(replace('src="/', 'src="')) - .pipe(replace('', '')) - .pipe(rename('index_m.html')) - .pipe(gulp.dest('admin/')), - - gulp.src([ - 'src/build/static/js/main.*.chunk.js', - ]) - .pipe(replace('s.p+"static/media/copy-content', '"./static/media/copy-content')) - .pipe(gulp.dest('admin/static/js/')), - ]); -} - -gulp.task('5-copy', () => copyFiles()); - -gulp.task('5-copy-dep', gulp.series('3-build-dep', '5-copy')); - -gulp.task('6-patch', () => new Promise(resolve => { - if (fs.existsSync(`${__dirname}/admin/index_m.html`)) { - let code = fs.readFileSync(`${__dirname}/admin/index_m.html`).toString('utf8'); - code = code.replace(/`); - - fs.writeFileSync(`${__dirname}/admin/index_m.html`, code); - } - if (fs.existsSync(`${__dirname}/src/build/index.html`)) { - let code = fs.readFileSync(`${__dirname}/src/build/index.html`).toString('utf8'); - code = code.replace(/`); - - fs.writeFileSync(`${__dirname}/src/build/index.html`, code); - } - resolve(null); -})); - -gulp.task('6-patch-dep', gulp.series('5-copy-dep', '6-patch')); - -gulp.task('default', gulp.series('6-patch-dep', 'widget-build')); diff --git a/io-package.json b/io-package.json index 394aed5..6e5f83c 100644 --- a/io-package.json +++ b/io-package.json @@ -1,221 +1,208 @@ { - "common": { - "name": "cameras", - "version": "2.1.2", - "news": { - "2.1.2": { - "en": "Updated packages", - "de": "Aktualisierte Pakete", - "ru": "Обновленные пакеты", - "pt": "Pacotes atualizados", - "nl": "Bijgewerkte pakketten", - "fr": "Paquets mis à jour", - "it": "Pacchetti aggiornati", - "es": "Paquetes actualizados", - "pl": "Aktualizacja pakietów", - "uk": "Оновлені пакети", - "zh-cn": "更新软件包" - }, - "2.1.1": { - "en": "Removed withStyles package", - "de": "MitStyles-Paket entfernt", - "ru": "Удаленный пакет со Стайлз", - "pt": "Removido com pacote Estilos", - "nl": "Verwijderd metStyles pakket", - "fr": "Enlever avec le paquetStyles", - "it": "Rimosso con pacchettoStyles", - "es": "Retire el paquete de estilos", - "pl": "Usunięty z pakietem Styles", - "uk": "Видаліть пакет \"Стиль\"", - "zh-cn": "用 Styles 软件包删除" - }, - "2.0.8": { - "en": "Packages updated\nAllowed selecting another source (with bigger resolution) for URL cameras", - "de": "Pakete aktualisiert\nErlaubte Auswahl einer anderen Quelle (mit größerer Auflösung) für URL-Kameras", - "ru": "Обновленные пакеты\nПозволяет выбрать другой источник (с большим разрешением) для камер URL", - "pt": "Pacotes atualizados\nPermite selecionar outra fonte (com maior resolução) para câmeras URL", - "nl": "Pakketten bijgewerkt\nToegestaan om een andere bron (met grotere resolutie) voor URL-camera's te selecteren", - "fr": "Mise à jour des paquets\nPermet de sélectionner une autre source (avec une plus grande résolution) pour les caméras URL", - "it": "Pacchetti aggiornati\nConsente di selezionare un'altra fonte (con risoluzione più grande) per le telecamere URL", - "es": "Paquetes actualizados\nPermitido seleccionar otra fuente (con mayor resolución) para las cámaras URL", - "pl": "Aktualizacja pakietów\nDozwolone wybranie innego źródła (o większej rozdzielczości) dla kamer URL", - "uk": "Пакети оновлені\nДозволяє вибрати інший джерело (з великою роздільною здатністю) для фотокамер URL", - "zh-cn": "更新软件包\n允许为 URL 相机选择另一个源( 分辨率更大)" - }, - "2.0.5": { - "en": "Minimal supported NodeJS version is 18\nCorrected widgets", - "de": "Minimal unterstützt NodeJS-Version ist 18\nKorrigierte Widgets", - "ru": "Минимальная поддержка Версия NodeJS 18\nИсправленные виджеты", - "pt": "Minimal suportado NodeJS versão é 18\nWidgets corrigidos", - "nl": "Minimale ondersteuning NodeJS versie 18\nVertaling:", - "fr": "Support minimal NodeJS version is 18\nWidgets corrigés", - "it": "Minimal supportato NodeJS versione è 18\nWidget corretti", - "es": "Soporte mínimo NodeJS versión es 18\nWidgets corregidos", - "pl": "Minimalny Wersja NodeJS wynosi 18\nPoprawiony widget", - "uk": "Мінімалістична підтримка Версія NodeJS - 18\nВиправлені віджети", - "zh-cn": "明米支助 未提交法院的版本 18\n伤势" - }, - "1.4.0": { - "en": "Changed widget set name\nAdded the caching of images with time, size and rotation\nAdded timeout for RTSP cameras", - "de": "Geänderter Widget-Setname\nHinzufügen des Caches von Bildern mit Zeit, Größe und Rotation\nTimeout für RTSP-Kameras hinzugefügt", - "ru": "Изменено имя виджета\nДобавлен кэширование изображений со временем, размером и поворотом\nДобавлена таймаут для RTSP камер", - "pt": "Nome do conjunto de widget alterado\nAdicionado o cache de imagens com tempo, tamanho e rotação\nAdicionado timeout para câmeras RTSP", - "nl": "Veranderde Widgets naam\nVoeg de beelden toe met tijd, grootte en rotatie\nVertaling:", - "fr": "Nom du jeu de widget modifié\nAjout du cache des images avec le temps, la taille et la rotation\nAjout du timeout pour les caméras RTSP", - "it": "Modificato nome del set widget\nAggiunto il caching di immagini con tempo, dimensione e rotazione\nTimeout aggiunto per telecamere RTSP", - "es": "Nombre del widget cambiado\nAñadido el caché de imágenes con tiempo, tamaño y rotación\nTiempo de salida adicional para las cámaras RTSP", - "pl": "Zmiana widget\nDodać do nich obrazy z czasem, rozmiarami i rotacją\nDodany czas na kamery RTSP", - "uk": "Змінено назву набір віджетів\nДодано кешування зображень з часом, розміром і обертанням\nДодано розклад для RTSP камери", - "zh-cn": "B. 改变目标的名称\n增加图像时、规模和轮换\n增聘了RTSP摄像时间" - }, - "1.3.0": { - "en": "Utilized the new js-controller feature: sendToUI. RTSP Streaming works only with js-controller 5.0.13 or higher\nImplemented a second widget for simple cameras", - "de": "Verwenden Sie die neue js-Controller-Funktion: sendToUI. FTE Streaming funktioniert nur mit js-controller 5.0.13 oder höher\nImplementiert ein zweites Widget für einfache Kameras", - "ru": "Использование новой функции JS-контроллера: sendToUI. РТСП Потоковые работы только с js-controller 5.0.13 или выше\nРеализован второй виджет для простых камер", - "pt": "Utilizado o novo recurso js-controller: sendToUI. RT RT RT RT RT RT RT RT RT RT RT Streaming funciona apenas com js-controller 5.0.13 ou superior\nImplementado um segundo widget para câmeras simples", - "nl": "Gebruikte het nieuwe JS-controller kenmerk: stuur ToUI. RTP Streaming werkt alleen met Js-controller 5.013 of hoger\nEen tweede widget voor eenvoudige camera's", - "fr": "Utilisé la nouvelle fonction js-controller: sendToUI. RTSP Le streaming fonctionne uniquement avec js-controller 5.0.13 ou supérieur\nMise en œuvre d'un deuxième widget pour les caméras simples", - "it": "Utilizzato la nuova funzione js-controller: sendToUI. NT1 Streaming funziona solo con js-controller 5.0.13 o superiore\nImplementato un secondo widget per semplici telecamere", - "es": "Utilizó la nueva función js-controller: sendToUI. RTSP Streaming funciona sólo con js-controller 5.0.13 o superior\nImplementado un segundo widget para cámaras simples", - "pl": "Utilizował nowy system sterowania js: wysyła ToUI. RTSP Streaming działa tylko z kontrolerem 5.0.13 lub wyższym\nPoprawiono drugi widget dla zwykłych kamer", - "uk": "Утилізовано нову функцію js-controller: sendToUI. РТСП Потокові роботи тільки з js-controller 5.0.13 або вище\nРеалізовано другий віджет для простих камер", - "zh-cn": "利用新的控制容忍特点:派遣ToUI。 RTSP 精简工作只与控制力行5.13或更高。\n对简单的摄像器实施第二发目标" - }, - "1.2.3": { - "en": "Added WiWiCam MW1 and HiKam cameras", - "de": "WiWiCam MW1 und HiKam Kameras hinzugefügt", - "ru": "Добавлены WiWiCam MW1 и HiKam камеры", - "pt": "Adicionado WiWiCam MW1 e HiKam câmeras", - "nl": "Vertaling:", - "fr": "Ajout de caméras WiWiCam MW1 et HiKam", - "it": "Aggiunte WiWiCam MW1 e HiKam telecamere", - "es": "Cámaras WiWiCam MW1 y HiKam", - "pl": "Added WiWiCam MW1 i HiKam camera", - "uk": "Додано відеокамери WiWiCam MW1 і HiKam", - "zh-cn": "添加WiCam MW1和HKam摄像机" - } + "common": { + "name": "cameras", + "version": "2.1.2", + "news": { + "2.1.2": { + "en": "Updated packages", + "de": "Aktualisierte Pakete", + "ru": "Обновленные пакеты", + "pt": "Pacotes atualizados", + "nl": "Bijgewerkte pakketten", + "fr": "Paquets mis à jour", + "it": "Pacchetti aggiornati", + "es": "Paquetes actualizados", + "pl": "Aktualizacja pakietów", + "uk": "Оновлені пакети", + "zh-cn": "更新软件包" + }, + "2.1.1": { + "en": "Removed withStyles package", + "de": "MitStyles-Paket entfernt", + "ru": "Удаленный пакет со Стайлз", + "pt": "Removido com pacote Estilos", + "nl": "Verwijderd metStyles pakket", + "fr": "Enlever avec le paquetStyles", + "it": "Rimosso con pacchettoStyles", + "es": "Retire el paquete de estilos", + "pl": "Usunięty z pakietem Styles", + "uk": "Видаліть пакет \"Стиль\"", + "zh-cn": "用 Styles 软件包删除" + }, + "2.0.8": { + "en": "Packages updated\nAllowed selecting another source (with bigger resolution) for URL cameras", + "de": "Pakete aktualisiert\nErlaubte Auswahl einer anderen Quelle (mit größerer Auflösung) für URL-Kameras", + "ru": "Обновленные пакеты\nПозволяет выбрать другой источник (с большим разрешением) для камер URL", + "pt": "Pacotes atualizados\nPermite selecionar outra fonte (com maior resolução) para câmeras URL", + "nl": "Pakketten bijgewerkt\nToegestaan om een andere bron (met grotere resolutie) voor URL-camera's te selecteren", + "fr": "Mise à jour des paquets\nPermet de sélectionner une autre source (avec une plus grande résolution) pour les caméras URL", + "it": "Pacchetti aggiornati\nConsente di selezionare un'altra fonte (con risoluzione più grande) per le telecamere URL", + "es": "Paquetes actualizados\nPermitido seleccionar otra fuente (con mayor resolución) para las cámaras URL", + "pl": "Aktualizacja pakietów\nDozwolone wybranie innego źródła (o większej rozdzielczości) dla kamer URL", + "uk": "Пакети оновлені\nДозволяє вибрати інший джерело (з великою роздільною здатністю) для фотокамер URL", + "zh-cn": "更新软件包\n允许为 URL 相机选择另一个源( 分辨率更大)" + }, + "2.0.5": { + "en": "Minimal supported NodeJS version is 18\nCorrected widgets", + "de": "Minimal unterstützt NodeJS-Version ist 18\nKorrigierte Widgets", + "ru": "Минимальная поддержка Версия NodeJS 18\nИсправленные виджеты", + "pt": "Minimal suportado NodeJS versão é 18\nWidgets corrigidos", + "nl": "Minimale ondersteuning NodeJS versie 18\nVertaling:", + "fr": "Support minimal NodeJS version is 18\nWidgets corrigés", + "it": "Minimal supportato NodeJS versione è 18\nWidget corretti", + "es": "Soporte mínimo NodeJS versión es 18\nWidgets corregidos", + "pl": "Minimalny Wersja NodeJS wynosi 18\nPoprawiony widget", + "uk": "Мінімалістична підтримка Версія NodeJS - 18\nВиправлені віджети", + "zh-cn": "明米支助 未提交法院的版本 18\n伤势" + }, + "1.4.0": { + "en": "Changed widget set name\nAdded the caching of images with time, size and rotation\nAdded timeout for RTSP cameras", + "de": "Geänderter Widget-Setname\nHinzufügen des Caches von Bildern mit Zeit, Größe und Rotation\nTimeout für RTSP-Kameras hinzugefügt", + "ru": "Изменено имя виджета\nДобавлен кэширование изображений со временем, размером и поворотом\nДобавлена таймаут для RTSP камер", + "pt": "Nome do conjunto de widget alterado\nAdicionado o cache de imagens com tempo, tamanho e rotação\nAdicionado timeout para câmeras RTSP", + "nl": "Veranderde Widgets naam\nVoeg de beelden toe met tijd, grootte en rotatie\nVertaling:", + "fr": "Nom du jeu de widget modifié\nAjout du cache des images avec le temps, la taille et la rotation\nAjout du timeout pour les caméras RTSP", + "it": "Modificato nome del set widget\nAggiunto il caching di immagini con tempo, dimensione e rotazione\nTimeout aggiunto per telecamere RTSP", + "es": "Nombre del widget cambiado\nAñadido el caché de imágenes con tiempo, tamaño y rotación\nTiempo de salida adicional para las cámaras RTSP", + "pl": "Zmiana widget\nDodać do nich obrazy z czasem, rozmiarami i rotacją\nDodany czas na kamery RTSP", + "uk": "Змінено назву набір віджетів\nДодано кешування зображень з часом, розміром і обертанням\nДодано розклад для RTSP камери", + "zh-cn": "B. 改变目标的名称\n增加图像时、规模和轮换\n增聘了RTSP摄像时间" + }, + "1.3.0": { + "en": "Utilized the new js-controller feature: sendToUI. RTSP Streaming works only with js-controller 5.0.13 or higher\nImplemented a second widget for simple cameras", + "de": "Verwenden Sie die neue js-Controller-Funktion: sendToUI. FTE Streaming funktioniert nur mit js-controller 5.0.13 oder höher\nImplementiert ein zweites Widget für einfache Kameras", + "ru": "Использование новой функции JS-контроллера: sendToUI. РТСП Потоковые работы только с js-controller 5.0.13 или выше\nРеализован второй виджет для простых камер", + "pt": "Utilizado o novo recurso js-controller: sendToUI. RT RT RT RT RT RT RT RT RT RT RT Streaming funciona apenas com js-controller 5.0.13 ou superior\nImplementado um segundo widget para câmeras simples", + "nl": "Gebruikte het nieuwe JS-controller kenmerk: stuur ToUI. RTP Streaming werkt alleen met Js-controller 5.013 of hoger\nEen tweede widget voor eenvoudige camera's", + "fr": "Utilisé la nouvelle fonction js-controller: sendToUI. RTSP Le streaming fonctionne uniquement avec js-controller 5.0.13 ou supérieur\nMise en œuvre d'un deuxième widget pour les caméras simples", + "it": "Utilizzato la nuova funzione js-controller: sendToUI. NT1 Streaming funziona solo con js-controller 5.0.13 o superiore\nImplementato un secondo widget per semplici telecamere", + "es": "Utilizó la nueva función js-controller: sendToUI. RTSP Streaming funciona sólo con js-controller 5.0.13 o superior\nImplementado un segundo widget para cámaras simples", + "pl": "Utilizował nowy system sterowania js: wysyła ToUI. RTSP Streaming działa tylko z kontrolerem 5.0.13 lub wyższym\nPoprawiono drugi widget dla zwykłych kamer", + "uk": "Утилізовано нову функцію js-controller: sendToUI. РТСП Потокові роботи тільки з js-controller 5.0.13 або вище\nРеалізовано другий віджет для простих камер", + "zh-cn": "利用新的控制容忍特点:派遣ToUI。 RTSP 精简工作只与控制力行5.13或更高。\n对简单的摄像器实施第二发目标" + }, + "1.2.3": { + "en": "Added WiWiCam MW1 and HiKam cameras", + "de": "WiWiCam MW1 und HiKam Kameras hinzugefügt", + "ru": "Добавлены WiWiCam MW1 и HiKam камеры", + "pt": "Adicionado WiWiCam MW1 e HiKam câmeras", + "nl": "Vertaling:", + "fr": "Ajout de caméras WiWiCam MW1 et HiKam", + "it": "Aggiunte WiWiCam MW1 e HiKam telecamere", + "es": "Cámaras WiWiCam MW1 y HiKam", + "pl": "Added WiWiCam MW1 i HiKam camera", + "uk": "Додано відеокамери WiWiCam MW1 і HiKam", + "zh-cn": "添加WiCam MW1和HKam摄像机" + } + }, + "title": "IP-Cameras", + "titleLang": { + "en": "IP-Cameras", + "de": "IP-Kameras", + "ru": "IP-камера", + "pt": "Câmeras IP", + "nl": "IP-camera's", + "fr": "Caméras IP", + "it": "Telecamere IP", + "es": "Cámaras IP", + "pl": "Kamery IP", + "zh-cn": "IP摄像机" + }, + "desc": { + "en": "Connect IP-cameras to iobroker", + "de": "Schließen Sie IP-Kameras an iobroker an", + "ru": "Подключите IP-камеры к iobroker", + "pt": "Conecte câmeras IP ao iobroker", + "nl": "Verbind IP-camera's met iobroker", + "fr": "Connectez des caméras IP à iobroker", + "it": "Collegare le telecamere IP a iobroker", + "es": "Conecte cámaras IP a iobroker", + "pl": "Podłącz kamery IP do iobroker", + "zh-cn": "将IP摄像机连接到iobroker" + }, + "authors": ["bluefox "], + "keywords": ["ip-cam", "web-cam", "video"], + "licenseInformation": { + "type": "free", + "license": "MIT" + }, + "platform": "Javascript/Node.js", + "icon": "cameras.png", + "enabled": true, + "extIcon": "https://raw.githubusercontent.com/ioBroker/ioBroker.cameras/master/admin/cameras.png", + "readme": "https://github.com/ioBroker/ioBroker.cameras/blob/master/README.md", + "loglevel": "info", + "webExtension": "lib/web.js", + "mode": "daemon", + "type": "multimedia", + "adminUI": { + "config": "materialize" + }, + "compact": true, + "messagebox": true, + "materialize": true, + "subscribable": true, + "eraseOnUpload": true, + "stopBeforeUpdate": true, + "tier": 3, + "dependencies": [ + { + "js-controller": ">=3.1.4", + "web": ">=2.0.0" + } + ], + "osDependencies": { + "linux": ["ffmpeg"] + }, + "connectionType": "local", + "dataSource": "poll", + "plugins": { + "sentry": { + "dsn": "https://4559263b70ec40af801ccd777f5a79e6@sentry.iobroker.net/231" + } + }, + "visWidgets": { + "vis2CameraWidgets": { + "i18n": "component", + "name": "vis2CameraWidgets", + "url": "cameras/customWidgets.js", + "color": "#508000", + "label": "cameras_set_label", + "components": ["RtspCamera", "SnapshotCamera"] + } + }, + "restartAdapters": ["vis-2"] }, - "title": "IP-Cameras", - "titleLang": { - "en": "IP-Cameras", - "de": "IP-Kameras", - "ru": "IP-камера", - "pt": "Câmeras IP", - "nl": "IP-camera's", - "fr": "Caméras IP", - "it": "Telecamere IP", - "es": "Cámaras IP", - "pl": "Kamery IP", - "zh-cn": "IP摄像机" - }, - "desc": { - "en": "Connect IP-cameras to iobroker", - "de": "Schließen Sie IP-Kameras an iobroker an", - "ru": "Подключите IP-камеры к iobroker", - "pt": "Conecte câmeras IP ao iobroker", - "nl": "Verbind IP-camera's met iobroker", - "fr": "Connectez des caméras IP à iobroker", - "it": "Collegare le telecamere IP a iobroker", - "es": "Conecte cámaras IP a iobroker", - "pl": "Podłącz kamery IP do iobroker", - "zh-cn": "将IP摄像机连接到iobroker" - }, - "authors": [ - "bluefox " - ], - "keywords": [ - "ip-cam", - "web-cam", - "video" - ], - "licenseInformation": { - "type": "free", - "license": "MIT" - }, - "platform": "Javascript/Node.js", - "icon": "cameras.png", - "enabled": true, - "extIcon": "https://raw.githubusercontent.com/ioBroker/ioBroker.cameras/master/admin/cameras.png", - "readme": "https://github.com/ioBroker/ioBroker.cameras/blob/master/README.md", - "loglevel": "info", - "webExtension": "lib/web.js", - "mode": "daemon", - "type": "multimedia", - "adminUI": { - "config": "materialize" - }, - "compact": true, - "messagebox": true, - "materialize": true, - "subscribable": true, - "eraseOnUpload": true, - "stopBeforeUpdate": true, - "tier": 3, - "dependencies": [ - { - "js-controller": ">=3.1.4", - "web": ">=2.0.0" - } - ], - "osDependencies": { - "linux": [ - "ffmpeg" - ] - }, - "connectionType": "local", - "dataSource": "poll", - "plugins": { - "sentry": { - "dsn": "https://4559263b70ec40af801ccd777f5a79e6@sentry.iobroker.net/231" - } - }, - "visWidgets": { - "vis2CameraWidgets": { - "i18n": "component", - "name": "vis2CameraWidgets", - "url": "cameras/customWidgets.js", - "color": "#508000", - "label": "cameras_set_label", - "components": [ - "RtspCamera", - "SnapshotCamera" + "native": { + "bind": "127.0.0.1", + "port": 8200, + "key": "", + "webInstance": "*", + "defaultTimeout": 5000, + "defaultCacheTimeout": 100, + "allowIPs": "", + "ffmpegPath": "/usr/bin/ffmpeg", + "tempPath": "", + "dateFormat": "LTS", + "language": "", + "cameras": [ + { + "name": "cam1", + "type": "url", + "url": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/admin/admin.png" + } ] - } }, - "restartAdapters": [ - "vis-2" - ] - }, - "native": { - "bind": "127.0.0.1", - "port": 8200, - "key": "", - "webInstance": "*", - "defaultTimeout": 5000, - "defaultCacheTimeout": 100, - "allowIPs": "", - "ffmpegPath": "/usr/bin/ffmpeg", - "tempPath": "", - "dateFormat": "LTS", - "language": "", - "cameras": [ - { - "name": "cam1", - "type": "url", - "url": "https://raw.githubusercontent.com/ioBroker/ioBroker.admin/master/admin/admin.png" - } + "objects": [], + "instanceObjects": [ + { + "_id": "", + "type": "meta", + "common": { + "name": "Cameras", + "type": "meta.user" + }, + "native": {} + } ] - }, - "objects": [], - "instanceObjects": [ - { - "_id": "", - "type": "meta", - "common": { - "name": "Cameras", - "type": "meta.user" - }, - "native": {} - } - ] } diff --git a/package.json b/package.json index 75efd8b..8ac8da1 100644 --- a/package.json +++ b/package.json @@ -21,38 +21,35 @@ "url": "https://github.com/ioBroker/ioBroker.cameras" }, "dependencies": { - "@iobroker/adapter-core": "^3.1.6", - "axios": "^1.7.2", + "@iobroker/adapter-core": "^3.2.3", + "axios": "^1.7.9", "decompress": "^4.2.1", "fluent-ffmpeg": "^2.1.3", "moment": "^2.30.1", "sharp": "0.33.4", - "uuid": "^10.0.0", + "uuid": "^11.0.5", "ws": "^8.18.0" }, "devDependencies": { - "@alcalzone/release-script": "^3.7.3", + "@alcalzone/release-script": "^3.8.0", "@alcalzone/release-script-plugin-iobroker": "^3.7.2", "@alcalzone/release-script-plugin-license": "^3.7.0", - "@iobroker/testing": "^4.1.3", - "@iobroker/vis-2-widgets-react-dev": "^2.0.2", - "@types/chai": "^4.3.16", + "@iobroker/build-tools": "^2.0.15", + "@iobroker/eslint-config": "^1.0.0", + "@iobroker/testing": "^5.0.3", + "@iobroker/vis-2-widgets-react-dev": "^4.0.4", + "@types/chai": "^4.3.20", "@types/chai-as-promised": "^7.1.8", - "@types/gulp": "^4.0.17", - "@types/mocha": "^10.0.7", - "@types/node": "^20.14.10", + "@types/mocha": "^10.0.10", + "@types/node": "^22.12.0", "@types/proxyquire": "^1.3.31", "@types/sinon": "^17.0.3", - "@types/sinon-chai": "^3.2.12", - "chai": "^4.4.1", + "@types/sinon-chai": "^4.0.0", + "chai": "^4.5.0", "chai-as-promised": "^7.1.2", - "eslint": "^8.57.0", - "gulp": "^4.0.2", - "gulp-rename": "^2.0.0", - "gulp-replace": "^1.1.4", - "mocha": "^10.6.0", + "mocha": "^11.1.0", "proxyquire": "^2.1.3", - "sinon": "^18.0.0", + "sinon": "^19.0.2", "sinon-chai": "^3.7.0" }, "main": "main.js", @@ -69,14 +66,24 @@ "scripts": { "test": "mocha --exit", "lint": "eslint", - "prepublishOnly": "node node_modules/gulp/bin/gulp --gulpfile gulpfile.js default", - "build": "node node_modules/gulp/bin/gulp.js", + "prepublishOnly": "node tasks", + "build": "node tasks", "release": "release-script", "release-patch": "release-script patch --yes", "release-minor": "release-script minor --yes", "release-major": "release-script major --yes", - "update-packages": "ncu --upgrade && cd src && ncu --upgrade && cd ../src-widgets && ncu --upgrade", - "npm": "npm i && cd src && npm i -f && cd .." + "update-packages": "npx -y npm-check-updates --upgrade && cd src-admin && npx -y npm-check-updates --upgrade && cd ../src-widgets && npx -y npm-check-updates --upgrade", + "npm": "npm i && cd src-admin && npm i -f && cd ..", + "0-clean": "node tasks --0-clean", + "1-npm": "node tasks --1-npm", + "2-build": "node tasks --2-build", + "3-copy": "node tasks --3-copy", + "admin-build": "node tasks --build-admin", + "widget-0-clean": "node tasks --widget-0-clean", + "widget-1-npm": "node tasks --widget-1-npm", + "widget-2-build": "node tasks --widget-2-build", + "widget-3-copy": "node tasks --widget-3-copy", + "widget-build": "node tasks --widget-build" }, "bugs": { "url": "https://github.com/ioBroker/ioBroker.cameras/issues" diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000..2f00708 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,3 @@ +import prettierConfig from '@iobroker/eslint-config/prettier.config.mjs'; + +export default prettierConfig; diff --git a/src/.gitignore b/src-admin/.gitignore similarity index 100% rename from src/.gitignore rename to src-admin/.gitignore diff --git a/src/README.md b/src-admin/README.md similarity index 100% rename from src/README.md rename to src-admin/README.md diff --git a/src-admin/eslint.config.mjs b/src-admin/eslint.config.mjs new file mode 100644 index 0000000..380966a --- /dev/null +++ b/src-admin/eslint.config.mjs @@ -0,0 +1,34 @@ +import config, { reactConfig } from '@iobroker/eslint-config'; + +export default [ + ...config, + ...reactConfig, + { + rules: { + 'no-new-func': 'warn', + 'no-extend-native': 'warn', + 'no-eval': 'warn', + }, + }, + { + languageOptions: { + parserOptions: { + projectService: { + allowDefaultProject: ['*.mjs'], + }, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + // disable temporary the rule 'jsdoc/require-param' and enable 'jsdoc/require-jsdoc' + rules: { + 'jsdoc/require-jsdoc': 'off', + 'jsdoc/require-param': 'off', + '@/no-duplicate-imports': 'error', + }, + }, + { + ignores: ['build/**/*', 'node_modules/**/*', 'src/serviceWorker.js', 'vite.config.mjs'], + }, +]; diff --git a/src-admin/index.html b/src-admin/index.html new file mode 100644 index 0000000..5aa74f3 --- /dev/null +++ b/src-admin/index.html @@ -0,0 +1,48 @@ + + + + + + + + + + ioBroker.cameras + + + +
+ + + diff --git a/src-admin/package-lock.json b/src-admin/package-lock.json new file mode 100644 index 0000000..ca20544 --- /dev/null +++ b/src-admin/package-lock.json @@ -0,0 +1,4516 @@ +{ + "name": "cameras-admin", + "version": "2.1.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cameras-admin", + "version": "2.1.2", + "dependencies": { + "@iobroker/adapter-react-v5": "^7.4.19", + "@material-ui/icons": "^4.11.3", + "@mui/icons-material": "^6.4.1", + "@mui/material": "^6.4.1", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.4.0" + } + }, + "node_modules/@alcalzone/jsonl-db": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@alcalzone/jsonl-db/-/jsonl-db-3.1.1.tgz", + "integrity": "sha512-1ezCM6Od1vW3uT+ALLkAg0vN+MZtib18k1A+JPvLTm55tb4Lj9PsF4x3o9mBI102/nRAI3FpkEzLJAeZlkXdDA==", + "license": "MIT", + "dependencies": { + "@alcalzone/proper-lockfile": "^4.1.3-0", + "alcalzone-shared": "^4.0.8", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@alcalzone/jsonl-db/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@alcalzone/pak": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@alcalzone/pak/-/pak-0.8.1.tgz", + "integrity": "sha512-sPdxNxdXLH96kbyWLdIljVSIY2N6/qnPqkq5AlWvuizjGQUwHIUtWZHLss9XNDV/hY7YkgdIb9ILHbMTnRBxVQ==", + "license": "MIT", + "dependencies": { + "axios": "^0.26.0", + "execa": "^5.0.0", + "fs-extra": "^10.0.1" + } + }, + "node_modules/@alcalzone/pak/node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/@alcalzone/pak/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@alcalzone/proper-lockfile": { + "version": "4.1.3-0", + "resolved": "https://registry.npmjs.org/@alcalzone/proper-lockfile/-/proper-lockfile-4.1.3-0.tgz", + "integrity": "sha512-8mlX3l5Xc+pYyiK9G156NyMosNuvvukL+TtNMqw7ti2zgVpz+WqPMPb2J1WU8I03Jbm4cXF+Q0D53hWvQqLQ0Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/@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==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@datalust/winston-seq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@datalust/winston-seq/-/winston-seq-1.0.2.tgz", + "integrity": "sha512-TxmBkN/26j+8rC/yshm9t29DKSPN69cQuGyvRmufvhPQIU2SnDlQLZmEGsPL3vQYWoBTTgu7+foYs+HmgeOl/g==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "seq-logging": "^1.1.1", + "winston-transport": "^4.4.2" + }, + "peerDependencies": { + "winston": "^3.0.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@iobroker/adapter-react-v5": { + "version": "7.4.19", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-react-v5/-/adapter-react-v5-7.4.19.tgz", + "integrity": "sha512-ewO9LOdxocUSkQsV3hz/pdEK9OIn1w08j57V9JdhRucw08pSp+mt80pnjJ7ZgvQc0jSzAVVO9DjDjbQ71arLYw==", + "license": "MIT", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@iobroker/js-controller-common": "^7.0.6", + "@iobroker/js-controller-common-db": "^7.0.6", + "@iobroker/socket-client": "^4.0.0", + "@iobroker/types": "^7.0.6", + "@mui/icons-material": "^6.4.1", + "@mui/material": "^6.4.1", + "@sentry/browser": "^8.51.0", + "cronstrue": "^2.53.0", + "file-selector": "^2.1.2", + "react-color": "^2.19.3", + "react-colorful": "^5.6.1", + "react-cropper": "^2.3.3", + "react-dropzone": "^14.3.5", + "react-inlinesvg": "^4.1.8" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "*" + } + }, + "node_modules/@iobroker/db-base": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/db-base/-/db-base-7.0.6.tgz", + "integrity": "sha512-+zXsJ7pw9AlSnD91zlDbEosfvGRtI7DwxXr2bD0kMINZpmFOJLPxdVRe1OVjOMc2+ohyibDliwqNzGyVCFkuyw==", + "license": "MIT", + "dependencies": { + "@iobroker/js-controller-common-db": "7.0.6", + "deep-clone": "^3.0.3", + "fs-extra": "^11.1.0", + "respjs": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@iobroker/db-objects-file": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/db-objects-file/-/db-objects-file-7.0.6.tgz", + "integrity": "sha512-Gph6eeimucIJzY4HxFZmXYx9hvvqLhC3wkPQm+w59n4jA+o5OcYWeHIBNgPJpJTjJSukhUlJAA22jWbZy+qQAw==", + "license": "Apache 2.0", + "dependencies": { + "@iobroker/db-base": "7.0.6", + "@iobroker/db-objects-redis": "7.0.6", + "deep-clone": "^3.0.3", + "fs-extra": "^11.1.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@iobroker/db-objects-jsonl": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/db-objects-jsonl/-/db-objects-jsonl-7.0.6.tgz", + "integrity": "sha512-Kb9iW7IlK/8fm97P2TRunI/JaPWHFQesHKRPEqq696EFtLqozQMr5CwxRjrseYXFoUAk47zALjUPnPdG9dAldw==", + "license": "Apache 2.0", + "dependencies": { + "@alcalzone/jsonl-db": "~3.1.1", + "@iobroker/db-base": "7.0.6", + "@iobroker/db-objects-file": "7.0.6", + "@iobroker/db-objects-redis": "7.0.6", + "deep-clone": "^3.0.3", + "fs-extra": "^11.1.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@iobroker/db-objects-redis": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/db-objects-redis/-/db-objects-redis-7.0.6.tgz", + "integrity": "sha512-BPUP5MgzxNwJCkkDhVXLNAccREOcikhNVI5DcRzrZ3j4yRbKOfjro1/Wu5/nudBMNI4pmUDP/rwE7IbfUPaV2A==", + "license": "Apache 2.0", + "dependencies": { + "@iobroker/db-base": "7.0.6", + "deep-clone": "^3.0.3", + "ioredis": "^4.28.2", + "mime-types": "^2.1.35", + "node.extend": "^2.0.2", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=16.4.0" + } + }, + "node_modules/@iobroker/db-states-file": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/db-states-file/-/db-states-file-7.0.6.tgz", + "integrity": "sha512-MIFlOVLd9emgAoWR+vq5B+A68+YxOCGLkN7RPxQw2kUO1pomK3USrbLF4ReCFtM8GLZI/HhaT5Q+a9FBYU1+2w==", + "license": "MIT", + "dependencies": { + "@iobroker/db-base": "7.0.6", + "@iobroker/db-states-redis": "7.0.6" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@iobroker/db-states-jsonl": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/db-states-jsonl/-/db-states-jsonl-7.0.6.tgz", + "integrity": "sha512-KBPxXo7Z+/l9kWZBrhmNQTYALPssIzsYJ4w1qB2EbQlrlklAQV7Aodf4g+M+/pkzy7aq9BVwvzksr/yhIk1BxQ==", + "license": "MIT", + "dependencies": { + "@alcalzone/jsonl-db": "~3.1.1", + "@iobroker/db-base": "7.0.6", + "@iobroker/db-states-file": "7.0.6", + "@iobroker/db-states-redis": "7.0.6" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@iobroker/db-states-redis": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/db-states-redis/-/db-states-redis-7.0.6.tgz", + "integrity": "sha512-HQbAzJ6Q11U9pkO4h+mI8J08D9O1IpPcGeQGDjptJOKNzQMeQ2fvTc+N+n+vtiEy/PBanNADXsi9frbcyWqWGg==", + "license": "MIT", + "dependencies": { + "@iobroker/db-base": "7.0.6", + "ioredis": "^4.28.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@iobroker/js-controller-common": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/js-controller-common/-/js-controller-common-7.0.6.tgz", + "integrity": "sha512-W/R37U1DuR6wxdbCp0ZWdmnQiGXVTCjrOcPKysd2kABQ/wWwOuaUrtllLaB9aPzNGE7WCRqvo26U18Vm2U7fSg==", + "license": "MIT", + "dependencies": { + "@iobroker/db-objects-file": "7.0.6", + "@iobroker/db-objects-jsonl": "7.0.6", + "@iobroker/db-objects-redis": "7.0.6", + "@iobroker/db-states-file": "7.0.6", + "@iobroker/db-states-jsonl": "7.0.6", + "@iobroker/db-states-redis": "7.0.6", + "@iobroker/js-controller-common-db": "7.0.6", + "fs-extra": "^11.1.0", + "jszip": "^3.10.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "optionalDependencies": { + "winston-seq-updated": "^1.0.4", + "winston-syslog": "^2.6.0" + } + }, + "node_modules/@iobroker/js-controller-common-db": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/js-controller-common-db/-/js-controller-common-db-7.0.6.tgz", + "integrity": "sha512-36eTg6RP43hCF7MirjjMSFu61sqZh4MOpj64uaETSKZcjwrhV5QWztdeJXB72H9b5yqo880m5wtNXLEW/FQjbw==", + "license": "MIT", + "dependencies": { + "@alcalzone/pak": "^0.8.1", + "axios": "^1.7.4", + "ci-info": "^3.8.0", + "deep-clone": "^3.0.3", + "event-stream": "^4.0.1", + "fs-extra": "^11.1.0", + "jsonwebtoken": "^9.0.0", + "node-forge": "^1.3.0", + "node.extend": "^2.0.2", + "promisify-child-process": "^4.1.2", + "readline": "^1.3.0", + "semver": "^7.5.2", + "triple-beam": "^1.3.0", + "winston": "^3.7.2", + "winston-daily-rotate-file": "^5.0.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "@datalust/winston-seq": "^1.0.0", + "diskusage": "^1.1.3", + "winston-syslog": "^2.6.0" + } + }, + "node_modules/@iobroker/socket-client": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@iobroker/socket-client/-/socket-client-4.0.0.tgz", + "integrity": "sha512-W5pbwQJNiVw3f2mhvyLbvfwTywDu6cCzqHlRjm1iMhrgEPadxjzcbusSbUq32w+q3IClpGVM+J04jmyK24Nmdw==", + "license": "MIT" + }, + "node_modules/@iobroker/types": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-7.0.6.tgz", + "integrity": "sha512-hCAw/ICjxQ48cIAVBvBAkj2NMkBkYILNFsPLH5yhcAH+B57SldS/2uz37+8i+dFzn4GlMXC7X04flJK02kyIdw==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT", + "peer": true + }, + "node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@material-ui/core/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "license": "MIT", + "peer": true + }, + "node_modules/@material-ui/icons": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.1.tgz", + "integrity": "sha512-SfDLWMV5b5oXgDf3NTa2hCTPC1d2defhDH2WgFKmAiejC4mSfXYbyi+AFCLzpizauXhgBm8OaZy9BHKnrSpahQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.1.tgz", + "integrity": "sha512-wsxFcUTQxt4s+7Bg4GgobqRjyaHLmZGNOs+HJpbwrwmLbT6mhIJxhpqsKzzWq9aDY8xIe7HCjhpH7XI5UD6teA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^6.4.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.1.tgz", + "integrity": "sha512-MFBfia6UiKxyoLeGkAh8M15bkeDmfnsUTMRJd/vTQue6YQ8AQ6lw9HqDthyYghzDEWIvZO/lQQzLrZE8XwNJLA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.4.1", + "@mui/system": "^6.4.1", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.4.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.4.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.1.tgz", + "integrity": "sha512-DcT7mwK89owwgcEuiE7w458te4CIjHbYWW6Kn6PiR6eLtxBsoBYphA968uqsQAOBQDpbYxvkuFLwhgk4bxoN/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.4.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.0.tgz", + "integrity": "sha512-ek/ZrDujrger12P6o4luQIfRd2IziH7jQod2WMbLqGE03Iy0zUwYmckRTVhRQTLPNccpD8KXGcALJF+uaUQlbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.1.tgz", + "integrity": "sha512-rgQzgcsHCTtzF9MZ+sL0tOhf2ZBLazpjrujClcb4Siju5lTrK0xX4PsiropActzCemNfM+mOu+0jezAVnfRK8g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.4.1", + "@mui/styled-engine": "^6.4.0", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.4.1", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/types": { + "version": "7.2.21", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz", + "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-iQUDUeYh87SvR4lVojaRaYnQix8BbRV51MxaV6MBmqthecQoxwSbS5e2wnbDJUeFxY2ppV505CiqPLtd0OWkqw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/types": "^7.2.21", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz", + "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz", + "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz", + "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz", + "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz", + "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz", + "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz", + "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz", + "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz", + "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz", + "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz", + "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz", + "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz", + "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz", + "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz", + "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz", + "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz", + "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz", + "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz", + "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@sentry-internal/browser-utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.52.0.tgz", + "integrity": "sha512-ojFldpRpGrgacIQMbbMZeqLYetNJJ61n+Pz29FpggaIRrbkq84ocoy4FCy+9BuLo6ywgxtUFrjOXD9pPRcZtUA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.52.0.tgz", + "integrity": "sha512-r62Ufg4uGlvQsQ+nRSiq9y0ieVFRlZvUaoT/zMjmPuMg29O9rRAMdPJuiCpBH4++x8KJoJ9c2HBRizn6/3uc5Q==", + "license": "MIT", + "dependencies": { + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.52.0.tgz", + "integrity": "sha512-b4hQPni1G2tcV5XuAPSV4RTX3vqPXO9RfUXLuTBzOTNzBHDoj8nQv0yVvcysGy5tBAuVRo5ya5A+PG/iC6FA9A==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "8.52.0", + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.52.0.tgz", + "integrity": "sha512-4ES2uCUb9yEO1cbg15UBqiYU/syQYj5GviI+TvYvnPX3I8K2mK941ZRqfHh2HpFMhMxLgfX4jDqDGizNhXWdqg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "8.52.0", + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/browser": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.52.0.tgz", + "integrity": "sha512-7JpJ9zpInozBzy61eJf/6RPHoKUCFcoFuKd9rttkN1gyY9xkU1cQK+x1f0deiIHnF9ydftmDtXW+kGFI/+xqtw==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "8.52.0", + "@sentry-internal/feedback": "8.52.0", + "@sentry-internal/replay": "8.52.0", + "@sentry-internal/replay-canvas": "8.52.0", + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/core": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.52.0.tgz", + "integrity": "sha512-2j3B7IKmseTKFm6AyheJ+RSgXqIsx+3blFSuxpkdvsEt60Lbzva2uDkCENfBDOclioo1kvHgsyuXLfWW4A+wwA==", + "license": "MIT", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "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==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/alcalzone-shared": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/alcalzone-shared/-/alcalzone-shared-4.0.8.tgz", + "integrity": "sha512-Rr0efCjNL9lw7miDvU8exL87Y42ehsLU2jUGNQUphhnlvxnTMrHeApWgoOSGZvsE2PhxC3KO7Z+VpQ/IbuV3aA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "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.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", + "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/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cronstrue": { + "version": "2.53.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.53.0.tgz", + "integrity": "sha512-CkAcaI94xL8h6N7cGxgXfR5D7oV2yVtDzB9vMZP8tIgPyEv/oc/7nq9rlk7LMxvc3N+q6LKZmNLCVxJRpyEg8A==", + "license": "MIT", + "bin": { + "cronstrue": "bin/cli.js" + } + }, + "node_modules/cropperjs": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.2.tgz", + "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-clone": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/deep-clone/-/deep-clone-3.0.3.tgz", + "integrity": "sha512-6jtXIlCBAwr3GP/7Il52clbIFIKAxg/pnNkL4/sE6+Oqb10MXMtm9LDZV2IAuwdaKV9VBm8hlxAFk9r6pF8XRw==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diskusage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.2.0.tgz", + "integrity": "sha512-2u3OG3xuf5MFyzc4MctNRUKjjwK+UkovRYdD2ed/NZNZPrt0lqHnLKxGhlFVvAb4/oufIgQG3nWgwmeTbHOvXA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es6-promise": "^4.2.8", + "nan": "^2.18.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz", + "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==", + "license": "ISC" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "license": "MIT", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.1" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT", + "optional": true + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/glossy": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/glossy/-/glossy-0.1.7.tgz", + "integrity": "sha512-mTCC51QFadK75MvAhrL5nPVIP291NjML1guo10Sa7Yj04tJU4V++Vgm780NIddg9etQD9D8FM67hFGqM8EE2HQ==", + "optional": true, + "engines": { + "node": ">= 0.2.5" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ioredis": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", + "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.1", + "denque": "^1.1.0", + "lodash.defaults": "^4.2.0", + "lodash.flatten": "^4.4.0", + "lodash.isarguments": "^3.1.0", + "p-map": "^2.1.0", + "redis-commands": "1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", + "license": "MIT", + "peer": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "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==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jss": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.10.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/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==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "license": "MIT" + }, + "node_modules/material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==", + "license": "ISC" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/node.extend": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.3.tgz", + "integrity": "sha512-xwADg/okH48PvBmRZyoX8i8GJaKuJ1CqlqotlZOhUio8egD1P5trJupHKBzcPjSF9ifK2gPcEICRBnkfPqQXZw==", + "license": "(MIT OR GPL-2.0)", + "dependencies": { + "hasown": "^2.0.0", + "is": "^3.3.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", + "license": "MIT", + "peer": true + }, + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/promisify-child-process": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/promisify-child-process/-/promisify-child-process-4.1.2.tgz", + "integrity": "sha512-APnkIgmaHNJpkAn7k+CrJSi9WMuff5ctYFbD0CO2XIPkM8yO7d/ShouU2clywbpHV/DUsyc4bpJCsNgddNtx4g==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "license": "MIT", + "dependencies": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-cropper": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/react-cropper/-/react-cropper-2.3.3.tgz", + "integrity": "sha512-zghiEYkUb41kqtu+2jpX2Ntigf+Jj1dF9ew4lAobPzI2adaPE31z0p+5TcWngK6TvmWQUwK3lj4G+NDh1PDQ1w==", + "license": "MIT", + "dependencies": { + "cropperjs": "^1.5.13" + }, + "peerDependencies": { + "react": ">=17.0.2" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dropzone": { + "version": "14.3.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", + "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-from-dom": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.7.5.tgz", + "integrity": "sha512-CO92PmMKo/23uYPm6OFvh5CtZbMgHs/Xn+o095Lz/TZj9t8DSDhGdSOMLxBxwWI4sr0MF17KUn9yJWc5Q00R/w==", + "license": "MIT", + "peerDependencies": { + "react": "16.8 - 19" + } + }, + "node_modules/react-icons": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz", + "integrity": "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-inlinesvg": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.1.8.tgz", + "integrity": "sha512-VZHLoK3cZoN8DelBT6zr6w347t4/xsDjYbxDNbjyGzOJrvAIJORJoRVBop6EG/tW3Mpz0rEueS4YyD8WXgI6Tw==", + "license": "MIT", + "dependencies": { + "react-from-dom": "^0.7.5" + }, + "peerDependencies": { + "react": "16.8 - 19" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT", + "peer": true + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.0.1" + } + }, + "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==", + "license": "MIT", + "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" + } + }, + "node_modules/readable-stream/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==", + "license": "MIT" + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", + "license": "BSD" + }, + "node_modules/redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==", + "license": "MIT" + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/respjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/respjs/-/respjs-4.2.0.tgz", + "integrity": "sha512-/W219Wpyo0m6bVN9z/rqhe0ek6nJ7Tus9WhbWpA8aJI8FxtMrQw1u8RStxOswTyUrW/NXaKXuaNfKZFKYbwXkg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rollup": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz", + "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.32.1", + "@rollup/rollup-android-arm64": "4.32.1", + "@rollup/rollup-darwin-arm64": "4.32.1", + "@rollup/rollup-darwin-x64": "4.32.1", + "@rollup/rollup-freebsd-arm64": "4.32.1", + "@rollup/rollup-freebsd-x64": "4.32.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.32.1", + "@rollup/rollup-linux-arm-musleabihf": "4.32.1", + "@rollup/rollup-linux-arm64-gnu": "4.32.1", + "@rollup/rollup-linux-arm64-musl": "4.32.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.32.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1", + "@rollup/rollup-linux-riscv64-gnu": "4.32.1", + "@rollup/rollup-linux-s390x-gnu": "4.32.1", + "@rollup/rollup-linux-x64-gnu": "4.32.1", + "@rollup/rollup-linux-x64-musl": "4.32.1", + "@rollup/rollup-win32-arm64-msvc": "4.32.1", + "@rollup/rollup-win32-ia32-msvc": "4.32.1", + "@rollup/rollup-win32-x64-msvc": "4.32.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/seq-logging": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/seq-logging/-/seq-logging-1.1.2.tgz", + "integrity": "sha512-9n7bCIHiMdBene104oSEa2917OcNBw+uee2v+we4AQxmjqt/aeQkWy1296IvGsogbj5fK6wuDNhVhm/DYmauVA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "license": "MIT", + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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==", + "license": "MIT" + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT", + "peer": true + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unix-dgram": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.6.tgz", + "integrity": "sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==", + "hasInstallScript": true, + "license": "ISC", + "optional": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.16.0" + }, + "engines": { + "node": ">=0.10.48" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "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": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-daily-rotate-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-5.0.0.tgz", + "integrity": "sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==", + "license": "MIT", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^3.0.0", + "triple-beam": "^1.4.1", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-seq-updated": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/winston-seq-updated/-/winston-seq-updated-1.0.4.tgz", + "integrity": "sha512-PBcD6PHdN/6XqtFIeW/EnlVFD3hFulZsdSbDyVd/xp0MjHpTPAfBBhmSDUf72E+LQxSS952ctmI6XG1cS3nkTg==", + "license": "MIT", + "optional": true, + "dependencies": { + "seq-logging": "0.4.6", + "winston-transport": "^4.3.0" + } + }, + "node_modules/winston-seq-updated/node_modules/seq-logging": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/seq-logging/-/seq-logging-0.4.6.tgz", + "integrity": "sha512-cCkhK86q+PfLeC21eaOWBcXyPUROuRq/e9EaJIT1BkmEdTHjvIgViDn7Tgw+tdzFhezvn7buDfoXWD8xPtQfeg==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/winston-syslog": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/winston-syslog/-/winston-syslog-2.7.1.tgz", + "integrity": "sha512-MrU5gSwXgEbHwz5wFhn1rZtSCbRcP1PEB8zU49tgsfjQ63EjIVAkQpXmMocdbTLnTJ2cW3gLW6gmoOOOhyJZgg==", + "license": "MIT", + "optional": true, + "dependencies": { + "glossy": "^0.1.7", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 8" + }, + "optionalDependencies": { + "unix-dgram": "2.0.6" + }, + "peerDependencies": { + "winston": "^3.8.2" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/src-admin/package.json b/src-admin/package.json new file mode 100644 index 0000000..c49515a --- /dev/null +++ b/src-admin/package.json @@ -0,0 +1,38 @@ +{ + "name": "cameras-admin", + "version": "2.1.2", + "private": true, + "dependencies": { + "@iobroker/adapter-react-v5": "^7.4.19", + "@material-ui/icons": "^4.11.3", + "@mui/icons-material": "^6.4.1", + "@mui/material": "^6.4.1", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.4.0" + }, + "scripts": { + "start": "vite --host", + "build": "vite build", + "lint": "eslint -c eslint.config.mjs", + "check-ts": "tsc --noEmit --checkJS false", + "tsc": "tsc --project tsconfig.json" + }, + "eslintConfig": { + "extends": "react-app" + }, + "proxy": "http://127.0.0.1:8081", + "allowedHosts": [ + "127.0.0.1" + ], + "homepage": ".", + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 11", + "not op_mini all" + ] +} \ No newline at end of file diff --git a/src/public/favicon.ico b/src-admin/public/favicon.ico similarity index 100% rename from src/public/favicon.ico rename to src-admin/public/favicon.ico diff --git a/src/public/manifest.json b/src-admin/public/manifest.json similarity index 100% rename from src/public/manifest.json rename to src-admin/public/manifest.json diff --git a/src-admin/src/App.tsx b/src-admin/src/App.tsx new file mode 100644 index 0000000..333e1ad --- /dev/null +++ b/src-admin/src/App.tsx @@ -0,0 +1,211 @@ +import React from 'react'; +import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles'; + +import { AppBar, Tabs, Tab } from '@mui/material'; + +import { Loader, I18n, GenericApp, type IobTheme, type GenericAppState } from '@iobroker/adapter-react-v5'; + +import TabOptions from './Tabs/Options'; +import TabCameras from './Tabs/Cameras'; + +import enLang from './i18n/en.json'; +import deLang from './i18n/de.json'; +import ruLang from './i18n/ru.json'; +import ptLang from './i18n/pt.json'; +import nlLang from './i18n/nl.json'; +import frLang from './i18n/fr.json'; +import itLang from './i18n/it.json'; +import esLang from './i18n/es.json'; +import plLang from './i18n/pl.json'; +import ukLang from './i18n/uk.json'; +import zhCnLang from './i18n/zh-cn.json'; +import type { GenericAppProps, GenericAppSettings } from '@iobroker/adapter-react-v5/build/types'; +import type { CamerasAdapterConfig } from './types'; + +const styles: Record = { + tabContent: { + padding: 10, + height: 'calc(100% - 64px - 48px - 20px)', + overflow: 'auto', + }, + tabContentIFrame: { + padding: 10, + height: 'calc(100% - 64px - 48px - 20px - 38px)', + overflow: 'auto', + }, + selected: (theme: IobTheme): React.CSSProperties => ({ + color: theme.palette.mode === 'dark' ? undefined : '#FFF !important', + }), + indicator: (theme: IobTheme): React.CSSProperties => ({ + backgroundColor: theme.palette.mode === 'dark' ? theme.palette.secondary.main : '#FFF', + }), +}; + +interface AppState extends GenericAppState { + alive: boolean; + tab: string; +} + +function isIFrame(): boolean { + try { + return window.self !== window.top; + } catch { + return true; + } +} + +class App extends GenericApp { + private subscribed: string | null = null; + + private isIFrame = isIFrame(); + + constructor(props: GenericAppProps) { + const extendedProps: GenericAppSettings = {}; + extendedProps.adapterName = 'cameras'; + extendedProps.doNotLoadAllObjects = true; + extendedProps.translations = { + en: enLang, + de: deLang, + ru: ruLang, + pt: ptLang, + nl: nlLang, + fr: frLang, + it: itLang, + es: esLang, + pl: plLang, + uk: ukLang, + 'zh-cn': zhCnLang, + }; + + if (window.location.port === '3000') { + // extendedProps.socket = { + // protocol: 'http:', + // host: '192.168.178.45', + // port: 8081, + // }; + } + + super(props, extendedProps); + + Object.assign(this.state, { + tab: window.localStorage.getItem(`${this.adapterName || 'adapter'}-tab`) || 'options', + }); + } + + onAliveChanged = (id: string, state: ioBroker.State | null | undefined): void => { + if (id && this.state.alive !== !!state?.val) { + this.setState({ alive: !!state?.val }); + } + }; + + componentWillUnmount(): void { + if (this.subscribed) { + this.socket.unsubscribeState(this.subscribed, this.onAliveChanged); + } + super.componentWillUnmount(); + } + + // called when connected with admin and loaded instance object + async onConnectionReady(): Promise { + const state: ioBroker.State | null | undefined = await this.socket.getState(`${this.instanceId}.alive`); + if (this.state.alive !== !!state?.val) { + this.setState({ alive: !!state?.val }); + } + + // generate random key + if (!this.state.native.key) { + setTimeout(() => + this.updateNativeValue('key', (Math.round(Math.random() * 100000000000) / 100000).toFixed(6)), + ); + } + this.subscribed = `${this.instanceId}.alive`; + this.socket.subscribeState(this.subscribed, this.onAliveChanged).catch(e => this.showError(e)); + } + + render(): React.JSX.Element { + if (!this.state.loaded) { + return ( + + + + + + ); + } + + return ( + + +
+ + { + this.setState({ tab }); + window.localStorage.setItem(`${this.adapterName || 'adapter'}-tab`, tab); + }} + sx={{ '& .MuiTabs-indicator': styles.indicator }} + > + + + + + +
+ {(this.state.tab === 'options' || !this.state.tab) && ( + this.setState({ errorText: text })} + onLoad={native => this.onLoadConfig(native)} + instance={this.instance} + theme={this.state.theme} + getIpAddresses={() => this.socket.getIpAddresses(this.common!.host)} + getExtendableInstances={() => this.getExtendableInstances()} + onConfigError={configError => this.setConfigurationError(configError)} + adapterName={this.adapterName} + onChange={(attr: string, value: any, cb?: () => void): void => + this.updateNativeValue(attr, value, cb) + } + instanceAlive={this.state.alive} + /> + )} + {this.state.tab === 'cameras' && ( + cb(this.encrypt(value))} + decrypt={(value, cb) => cb(this.decrypt(value))} + instanceAlive={this.state.alive} + native={this.state.native as CamerasAdapterConfig} + onChange={(attr, value, cb) => this.updateNativeValue(attr, value, cb)} + /> + )} +
+ {this.renderError()} + {this.renderSaveCloseButtons()} +
+
+
+ ); + } +} + +export default App; diff --git a/src-admin/src/Tabs/Cameras.tsx b/src-admin/src/Tabs/Cameras.tsx new file mode 100644 index 0000000..b6ab71f --- /dev/null +++ b/src-admin/src/Tabs/Cameras.tsx @@ -0,0 +1,786 @@ +import React, { Component } from 'react'; + +import { + Fab, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + FormControl, + FormControlLabel, + InputLabel, + MenuItem, + Select, + TextField, + Checkbox, + CircularProgress, + IconButton, + Box, +} from '@mui/material'; + +import { + Delete as IconDelete, + Edit as IconEdit, + Add as IconAdd, + ArrowUpward as IconUp, + ArrowDownward as IconDown, + CameraAlt as IconTest, +} from '@mui/icons-material'; + +import { + type AdminConnection, + I18n, + type IobTheme, + Message as MessageDialog, + type ThemeType, +} from '@iobroker/adapter-react-v5'; + +import URLImage from '../Types/URLImage'; +import URLBasicAuthImage from '../Types/URLBasicAuthImage'; +import RTSPImageConfig from '../Types/RTSPImage'; +import RTSPReolinkE1Config from '../Types/RTSPReolinkE1'; +import RTSPEufyConfig from '../Types/RTSPEufy'; +import RTSPHiKamConfig from '../Types/RTSPHiKam'; +import type { CamerasAdapterConfig, CameraConfig, CameraConfigAny, CameraType } from '../types'; +import type { ConfigProps } from '../Types/ConfigGeneric'; +// eslint-disable-next-line @/no-duplicate-imports,no-duplicate-imports +import type ConfigGeneric from '../Types/ConfigGeneric'; + +interface IConfigGeneric extends ConfigGeneric { + readonly isRtsp: boolean; +} + +const TYPES: Record = { + url: { Config: URLImage as unknown as IConfigGeneric, name: 'URL' }, + urlBasicAuth: { Config: URLBasicAuthImage as unknown as IConfigGeneric, name: 'URL with basic auth' }, + rtsp: { Config: RTSPImageConfig as unknown as IConfigGeneric, name: 'RTSP Snapshot' }, + reolinkE1: { Config: RTSPReolinkE1Config as unknown as IConfigGeneric, name: 'Reolink E1 Snapshot' }, + eufy: { Config: RTSPEufyConfig as unknown as IConfigGeneric, name: 'Eufy Security' }, + hikam: { Config: RTSPHiKamConfig as unknown as IConfigGeneric, name: 'HiKam / WiWiCam' }, +}; + +const styles: Record = { + tab: { + width: '100%', + height: '100%', + }, + lineDiv: { + width: '100%', + paddingTop: 5, + paddingBottom: 5, + borderBottom: '1px dashed gray', + }, + lineCheck: { + display: 'inline-block', + width: 44, + }, + lineCheckbox: { + marginTop: 10, + }, + lineText: { + display: 'inline-block', + width: 200, + }, + lineDesc: { + display: 'inline-block', + flexGrow: 1, + }, + lineType: { + display: 'inline-block', + width: 200, + }, + lineEdit: { + display: 'inline-block', + marginTop: 10, + }, + lineUp: { + display: 'inline-block', + marginTop: 10, + }, + lineDown: { + display: 'inline-block', + marginTop: 10, + }, + lineDelete: { + display: 'inline-block', + marginTop: 10, + }, + lineUrl: (theme: IobTheme): React.CSSProperties => ({ + marginLeft: '48px', + fontSize: 'small', + fontStyle: 'italic', + color: theme.palette.text.disabled, + }), + lineNoButtonUp: { + display: 'inline-block', + width: 34, + marginLeft: 10, + }, + lineNoButtonDown: { + display: 'inline-block', + width: 40, + marginLeft: 10, + }, + divConfig: { + verticalAlign: 'top', + }, + divTestCam: { + flex: 1, + verticalAlign: 'top', + display: 'flex', + flexDirection: 'column', + }, + buttonIcon: { + marginTop: 6, + }, + buttonTest: { + marginBottom: 8, + }, + imgTest: { + width: '100%', + height: 'auto', + }, + sampleUrl: { + display: 'block', + marginTop: 8, + }, + link: { + color: 'inherit', + textDecoration: 'underline', + }, +}; + +interface CamerasProps { + decrypt: (text: string, callback: (decrypted: string) => void) => void; + encrypt: (text: string, callback: (encrypted: string) => void) => void; + native: CamerasAdapterConfig; + instanceAlive: boolean; + instance: number; + adapterName: string; + onError?: (error: string) => void; + onLoad?: () => void; + onChange: (attr: string, value: any, cb?: () => void) => void; + socket: AdminConnection; + themeType: ThemeType; + theme: IobTheme; +} + +interface CamerasState { + editCam: number | false; + editChanged: boolean; + requesting: boolean; + instanceAlive: boolean; + webInstanceHost: string; + editedSettings: string | null; + editedSettingsOld: string | null; + message: string; + testImg: string | null; +} + +export default class Cameras extends Component { + constructor(props: CamerasProps) { + super(props); + + this.state = { + editCam: false, + editChanged: false, + requesting: false, + instanceAlive: this.props.instanceAlive, + webInstanceHost: '', + editedSettings: null, + editedSettingsOld: null, + message: '', + testImg: null, + }; + + // translate all names once + Object.keys(TYPES).forEach((type: CameraType): void => { + if (TYPES[type].name && !TYPES[type].translated) { + TYPES[type].translated = true; + TYPES[type].name = I18n.t(TYPES[type].name); + if (TYPES[type].Config.isRtsp) { + TYPES[type].rtsp = true; + } + } + }); + } + + componentDidMount(): void { + this.getWebInstances().catch(e => this.props.onError?.(e)); + } + + static ip2int(ip: string): number { + return ip.split('.').reduce((ipInt, octet) => (ipInt << 8) + parseInt(octet, 10), 0) >>> 0; + } + + static findNetworkAddressOfHost(obj: ioBroker.HostObject, localIp: string): string | undefined { + const networkInterfaces = obj?.native?.hardware?.networkInterfaces; + if (!networkInterfaces) { + return; + } + + let hostIp: string | undefined; + Object.keys(networkInterfaces).forEach(inter => { + networkInterfaces[inter]?.forEach(ip => { + if (ip.internal) { + return; + } + if (localIp.includes(':') && ip.family !== 'IPv6') { + return; + } + if (localIp.includes('.') && !localIp.match(/[^.\d]/) && ip.family !== 'IPv4') { + return; + } + if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\d]/)) { + // if DNS name + hostIp = ip.address; + } else { + if ( + ip.family === 'IPv4' && + localIp.includes('.') && + (Cameras.ip2int(localIp) & Cameras.ip2int(ip.netmask)) === + (Cameras.ip2int(ip.address) & Cameras.ip2int(ip.netmask)) + ) { + hostIp = ip.address; + } else { + hostIp = ip.address; + } + } + }); + }); + + if (!hostIp) { + Object.keys(networkInterfaces).forEach(inter => { + networkInterfaces[inter]?.forEach(ip => { + if (ip.internal) { + return; + } + if (localIp.includes(':') && ip.family !== 'IPv6') { + return; + } + if (localIp.includes('.') && !localIp.match(/[^.\d]/) && ip.family !== 'IPv4') { + return; + } + if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\d]/)) { + // if DNS name + hostIp = ip.address; + } else { + hostIp = ip.address; + } + }); + }); + } + + if (!hostIp) { + Object.keys(networkInterfaces).forEach(inter => { + networkInterfaces[inter]?.forEach(ip => { + if (ip.internal) { + return; + } + hostIp = ip.address; + }); + }); + } + + return hostIp; + } + + async getWebInstances(): Promise { + const list = await this.props.socket.getAdapterInstances('web'); + let webInstance; + if (this.props.native.webInstance === '*') { + webInstance = list[0]; + } else { + const instance = this.props.native.webInstance; + webInstance = list.find(obj => obj._id.endsWith(instance)); + } + if (webInstance) { + webInstance.native = webInstance.native || {}; + if (!webInstance.native.bind || webInstance.native.bind === '0.0.0.0') { + // get current host + const host = await this.props.socket.getObject(`system.host.${webInstance.common.host}`); + // get ips on this host + const ip = host && Cameras.findNetworkAddressOfHost(host, window.location.hostname); + + // but for now + webInstance.native.bind = ip || window.location.hostname; + } + } + + if (webInstance) { + this.setState({ webInstanceHost: `${webInstance.native.bind}:${webInstance.native.port || 8082}` }); + } + } + + renderMessage(): React.JSX.Element | null { + if (this.state.message) { + const text = this.state.message.split('\n').map((item, i) =>

{item}

); + + return ( + this.setState({ message: '' })} + /> + ); + } + + return null; + } + + static getDerivedStateFromProps(props: CamerasProps, state: CamerasState): Partial | null { + if (state.instanceAlive !== props.instanceAlive) { + return { instanceAlive: props.instanceAlive }; + } + + return null; + } + + onTest(): void { + const settings: CameraConfig = JSON.parse(this.state.editedSettings || this.state.editedSettingsOld || '{}'); + + let timeout: ReturnType | null = setTimeout( + () => { + timeout = null; + this.setState({ message: 'Timeout', requesting: false }); + }, + parseInt((settings.timeout as string) || (this.props.native.defaultTimeout as string), 10) || 5_000, + ); + + this.setState({ requesting: true, testImg: null }, async () => { + const result = await this.props.socket.sendTo( + `${this.props.adapterName}.${this.props.instance}`, + 'test', + settings, + ); + + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + if (!result || !result.body || result.error) { + let error = result && result.error ? result.error : I18n.t('No answer'); + if (typeof error !== 'string') { + error = JSON.stringify(error); + } + // hide password + error = error.replace(/\/\/([^:]+):[^@]+@/, '//$1:xxx@'); + + this.setState({ message: error, requesting: false }); + } else { + this.setState({ testImg: result.body, requesting: false }); + } + }); + } + + onCameraSettingsChanged(settings: CameraConfig): void { + const oldSettings: CameraConfig = JSON.parse(this.state.editedSettingsOld || '{}'); + // apply changes + settings = Object.assign(oldSettings, settings); + const editedSettings = JSON.stringify(settings); + + if (this.state.editedSettingsOld === editedSettings) { + this.setState({ editChanged: false, editedSettings: null }); + } else if (this.state.editedSettingsOld !== editedSettings) { + this.setState({ editChanged: true, editedSettings }); + } + } + + renderConfigDialog(): React.JSX.Element | null { + if (this.state.editCam !== false) { + const cam: CameraConfig = JSON.parse(this.state.editedSettings || this.state.editedSettingsOld || '{}'); + const Config: React.FC> = (TYPES[cam.type] || TYPES.url) + .Config as unknown as React.FC>; + + return ( + this.state.editCam !== null && this.setState({ editCam: false, editChanged: false })} + > + + {I18n.t('Edit camera %s [%s]', cam.name, cam.type)} - {cam.desc} + + +
+
+ this.onCameraSettingsChanged(settings)} + encrypt={(value: string, cb: (encrypted: string) => void) => + this.props.encrypt(value, cb) + } + decrypt={(value: string, cb: (decrypted: string) => void) => + this.props.decrypt(value, cb) + } + /> +
+ { + const settings: CameraConfig = JSON.parse(JSON.stringify(cam)); + settings.timeout = e.target.value; + this.onCameraSettingsChanged(settings); + }} + /> +
+ { + const settings: CameraConfig = JSON.parse(JSON.stringify(cam)); + settings.cacheTimeout = e.target.value; + this.onCameraSettingsChanged(settings); + }} + /> +
+ { + const settings: CameraConfig = JSON.parse(JSON.stringify(cam)); + settings.addTime = e.target.checked; + this.onCameraSettingsChanged(settings); + }} + /> + } + /> +
+ { + const settings: CameraConfig = JSON.parse(JSON.stringify(cam)); + settings.title = e.target.value; + this.onCameraSettingsChanged(settings); + }} + /> + + +
+
+ + {this.state.testImg ? ( + test + ) : null} + {this.state.requesting ? : null} +
+
+
+ + + + +
+ ); + } + return null; + } + + renderCameraButtons(cam: CameraConfig, i: number): React.JSX.Element { + return ( +
+ + this.setState({ + editCam: i, + editedSettingsOld: JSON.stringify(cam), + editedSettings: null, + testImg: null, + }) + } + > + + + + {i ? ( + { + const cameras: CameraConfigAny[] = JSON.parse(JSON.stringify(this.props.native.cameras)); + const cam = cameras[i]; + cameras.splice(i, 1); + cameras.splice(i - 1, 0, cam); + this.props.onChange('cameras', cameras); + }} + > + + + ) : ( +
+   +
+ )} + + {i !== this.props.native.cameras.length - 1 ? ( + { + const cameras: CameraConfigAny[] = JSON.parse(JSON.stringify(this.props.native.cameras)); + const cam = cameras[i]; + cameras.splice(i, 1); + cameras.splice(i + 1, 0, cam); + this.props.onChange('cameras', cameras); + }} + > + + + ) : ( +
+   +
+ )} + + { + const cameras: CameraConfigAny[] = JSON.parse(JSON.stringify(this.props.native.cameras)); + cameras.splice(i, 1); + this.props.onChange('cameras', cameras); + }} + > + + +
+ ); + } + + renderCamera(cam: CameraConfigAny, i: number): React.JSX.Element { + const error = this.props.native.cameras.find((c, ii) => c.name === cam.name && ii !== i); + this.props.native.cameras.forEach((cam, i) => { + if (!cam.id) { + cam.id = Date.now() + i; + } + }); + + let description = (cam as any).url || ''; + if (description) { + // remove password + const m = description.match(/^https?:\/\/([^@]+)@/); + if (m && m[1]) { + description = description.replace(`${m[1]}@`, ''); + } + } + + return ( +
+
+
+ { + const cameras: CameraConfigAny[] = JSON.parse( + JSON.stringify(this.props.native.cameras), + ); + cameras[i].enabled = cameras[i].enabled === undefined ? false : !cameras[i].enabled; + this.props.onChange('cameras', cameras); + }} + /> +
+
+ { + const cameras: CameraConfigAny[] = JSON.parse( + JSON.stringify(this.props.native.cameras), + ); + cameras[i].name = e.target.value.replace(/[^-_\da-zA-Z]/g, '_'); + this.props.onChange('cameras', cameras); + }} + /> +
+
+ { + const cameras: CameraConfigAny[] = JSON.parse( + JSON.stringify(this.props.native.cameras), + ); + cameras[i].desc = e.target.value; + this.props.onChange('cameras', cameras); + }} + /> +
+
+ + {I18n.t('Type')} + + +
+ {this.renderCameraButtons(cam, i)} +
+ {description ? {description} : null} +
+ ); + } + + render(): React.JSX.Element { + return ( +
+ { + const cameras: CameraConfigAny[] = JSON.parse(JSON.stringify(this.props.native.cameras)); + let i = 1; + + while (cameras.find(cam => cam.name === `cam${i}`)) { + i++; + } + cameras.push({ name: `cam${i}`, type: 'url', id: Date.now(), rtsp: !!TYPES.url.rtsp, url: '' }); + this.props.onChange('cameras', cameras); + }} + > + + + {this.props.native.cameras + ? this.props.native.cameras.map((cam, i) => this.renderCamera(cam, i)) + : null} + {this.renderConfigDialog()} + {this.renderMessage()} +
+ ); + } +} diff --git a/src-admin/src/Tabs/Options.tsx b/src-admin/src/Tabs/Options.tsx new file mode 100644 index 0000000..4533988 --- /dev/null +++ b/src-admin/src/Tabs/Options.tsx @@ -0,0 +1,386 @@ +import React, { Component } from 'react'; + +import { TextField, Snackbar, IconButton, FormControl, Select, Button, MenuItem, InputLabel } from '@mui/material'; + +import { MdClose as IconClose, MdCheck as IconTest } from 'react-icons/md'; + +import { + I18n, + Logo, + DialogMessage, + DialogError, + type AdminConnection, + type IobTheme, +} from '@iobroker/adapter-react-v5'; +import type { CamerasAdapterConfig } from '../types'; + +const styles: Record = { + tab: { + width: '100%', + minHeight: '100%', + }, + bind: { + marginRight: 10, + marginBottom: 20, + minWidth: 200, + }, + port: { + width: 100, + }, + defaultTimeout: { + width: 150, + }, + ffmpegPath: { + width: 450, + }, + link: { + color: 'inherit', + }, +}; + +interface OptionsProps { + common: ioBroker.InstanceCommon; + native: CamerasAdapterConfig; + instanceAlive: boolean; + instance: number; + adapterName: string; + onError: (error: string) => void; + onConfigError: (error: string) => void; + onLoad: (config: CamerasAdapterConfig) => void; + onChange: (attr: string, value: number | string) => void; + getIpAddresses: () => Promise; + getExtendableInstances: () => Promise; + socket: AdminConnection; + theme: IobTheme; +} + +interface OptionsState { + showHint: boolean; + toast: string; + ips: string[]; + requesting: boolean; + webInstances: string[]; + errorText?: string; + messageText?: string; +} + +class Options extends Component { + constructor(props: OptionsProps) { + super(props); + + this.state = { + showHint: false, + toast: '', + ips: [], + requesting: true, + webInstances: [], + }; + } + + async componentDidMount(): Promise { + const ips: string[] = await this.props.getIpAddresses(); + const webInstances = await this.props.getExtendableInstances(); + this.setState({ + requesting: false, + ips, + webInstances: webInstances.map(item => item._id.replace('system.adapter.', '')), + }); + } + + renderError(): React.JSX.Element | null { + if (!this.state.errorText) { + return null; + } + return ( + this.setState({ errorText: '' })} + /> + ); + } + + renderToast(): React.JSX.Element | null { + if (!this.state.toast) { + return null; + } + return ( + this.setState({ toast: '' })} + ContentProps={{ + 'aria-describedby': 'message-id', + }} + message={{this.state.toast}} + action={[ + this.setState({ toast: '' })} + > + + , + ]} + /> + ); + } + + renderHint(): React.JSX.Element | null { + if (this.state.showHint) { + return ( + this.setState({ showHint: false })} + /> + ); + } + return null; + } + + onTestFfmpeg(): void { + let timeout: ReturnType | null = setTimeout(() => { + timeout = null; + this.setState({ toast: 'Timeout', requesting: false }); + }, 30000); + + this.setState({ requesting: true }, async () => { + const result = await this.props.socket.sendTo( + `${this.props.adapterName}.${this.props.instance}`, + 'ffmpeg', + { + path: this.props.native.ffmpegPath, + }, + ); + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + if (!result?.version || result.error) { + let error = result?.error ? result.error : I18n.t('No answer'); + if (typeof error !== 'string') { + error = JSON.stringify(error); + } + this.setState({ toast: error, requesting: false }); + } else { + this.setState({ toast: `${I18n.t('Success:')} ${result.version}`, requesting: false }); + } + }); + } + + renderSettings(): React.JSX.Element[] { + return [ + this.state.ips && this.state.ips.length ? ( + + {I18n.t('Local IP address')} + + + ) : ( + this.props.onChange('bind', e.target.value)} + /> + ), + this.props.onChange('port', e.target.value)} + />, +
, + this.props.onChange('defaultTimeout', e.target.value)} + />, +
, + + {I18n.t('WEB Instance')} + + , +
, + this.props.onChange('ffmpegPath', e.target.value)} + helperText={I18n.t('Like /usr/bin/ffmpeg')} + />, + , +
, + this.props.onChange('tempPath', e.target.value)} + helperText={I18n.t('If empty then in adapter folder')} + />, +
, + this.props.onChange('defaultCacheTimeout', e.target.value)} + helperText={I18n.t('How often the cameras will be asked for new snapshot. If 0, then by every request')} + />, +
, + this.props.onChange('dateFormat', e.target.value)} + helperText={ + + {I18n.t('See here:')}{' '} + + https://momentjs.com/ + + + } + />, + ]; + } + + renderMessage(): React.JSX.Element | null { + if (!this.state.messageText) { + return null; + } + return ( + this.setState({ messageText: '' })} + text={this.state.messageText} + /> + ); + } + + render(): React.JSX.Element { + return ( +
+ this.setState({ errorText: text })} + onLoad={this.props.onLoad} + /> + {this.renderSettings()} +
+ {this.renderHint()} + {this.renderToast()} + {this.renderMessage()} + {this.renderError()} + + ); + } +} + +export default Options; diff --git a/src-admin/src/Types/ConfigGeneric.tsx b/src-admin/src/Types/ConfigGeneric.tsx new file mode 100644 index 0000000..d0ecdbe --- /dev/null +++ b/src-admin/src/Types/ConfigGeneric.tsx @@ -0,0 +1,31 @@ +import { type JSX, Component } from 'react'; +import type { AdminConnection, IobTheme, ThemeType } from '@iobroker/adapter-react-v5'; +import type { CameraAdapterConfig } from '../types'; + +export interface ConfigProps { + onChange: ( + settings: Omit< + T, + 'name' | 'type' | 'desc' | 'timeout' | 'cacheTimeout' | 'addTime' | 'title' | 'id' | 'enabled' | 'rtsp' + >, + ) => void; + settings: Omit< + T, + 'name' | 'type' | 'desc' | 'timeout' | 'cacheTimeout' | 'addTime' | 'title' | 'id' | 'enabled' | 'rtsp' + >; + native: CameraAdapterConfig; + decrypt: (text: string, callback: (decrypted: string) => void) => void; + encrypt: (text: string, callback: (encrypted: string) => void) => void; + theme: IobTheme; + themeType: ThemeType; + socket: AdminConnection; +} + +export default abstract class ConfigGeneric extends Component< + ConfigProps, + Omit & S +> { + static isRtsp = false; + + abstract render(): JSX.Element; +} diff --git a/src-admin/src/Types/RTSPEufy.tsx b/src-admin/src/Types/RTSPEufy.tsx new file mode 100644 index 0000000..7ed9521 --- /dev/null +++ b/src-admin/src/Types/RTSPEufy.tsx @@ -0,0 +1,140 @@ +import React from 'react'; + +import { Button, Switch, TextField } from '@mui/material'; + +import { I18n, DialogSelectID } from '@iobroker/adapter-react-v5'; +import type { CameraConfigEufy } from '../types'; +import ConfigGeneric, { type ConfigProps } from './ConfigGeneric'; + +const styles: Record<'page' | 'ip' | 'username' | 'password' | 'quality', React.CSSProperties> = { + page: { + width: '100%', + }, + ip: { + marginRight: 8, + width: 200, + }, + username: { + marginTop: 16, + marginRight: 8, + width: 200, + }, + password: { + marginTop: 16, + width: 200, + }, + quality: { + marginTop: 16, + width: 200, + }, +}; + +export default class RTSPEufyConfig extends ConfigGeneric< + CameraConfigEufy, + { eusecInstalled: boolean; showSelectId: boolean } +> { + public static isRtsp = true; // this camera can be used in RTSP snapshot + + constructor(props: ConfigProps) { + super(props); + + this.state = { + ip: this.props.settings.ip || '', + oid: this.props.settings.oid || '', + useOid: this.props.settings.useOid || false, + eusecInstalled: false, + showSelectId: false, + }; + } + + async componentDidMount(): Promise { + // read if eusec adapter is installed + const instances = await this.props.socket.getAdapterInstances('eusec'); + if (this.state.useOid && !instances.length) { + this.setState({ useOid: false }); + } else { + this.setState({ eusecInstalled: !!instances.length }); + } + } + + reportSettings(): void { + this.props.onChange({ + ip: this.state.ip, + oid: this.state.oid, + useOid: this.state.useOid, + }); + } + + renderSelectID(): React.JSX.Element | null { + if (!this.state.showSelectId) { + return null; + } + return ( + obj._id.startsWith('eusec.') && obj._id.endsWith('.rtsp_stream_url')} + onClose={() => this.setState({ showSelectId: false })} + onOk={_oid => { + let oid: string | undefined; + if (Array.isArray(_oid)) { + oid = _oid[0]; + } else { + oid = _oid || ''; + } + this.setState({ oid, showSelectId: false }, () => this.reportSettings()); + }} + /> + ); + } + + render(): React.JSX.Element { + return ( +
+ {this.renderSelectID()} +
+ {this.state.eusecInstalled ? ( +
+ {I18n.t('From eusec adapter')} + this.setState({ useOid: !this.state.useOid })} + /> + {I18n.t('By IP address')} +
+ ) : null} + + {!this.state.useOid ? ( + this.setState({ ip: e.target.value }, () => this.reportSettings())} + /> + ) : ( +
+ this.setState({ oid: e.target.value }, () => this.reportSettings())} + /> + +
+ )} + +
+ ); + } +} diff --git a/src-admin/src/Types/RTSPHiKam.tsx b/src-admin/src/Types/RTSPHiKam.tsx new file mode 100644 index 0000000..78d4ded --- /dev/null +++ b/src-admin/src/Types/RTSPHiKam.tsx @@ -0,0 +1,107 @@ +import React from 'react'; + +import { MenuItem, Select, TextField } from '@mui/material'; + +import { I18n } from '@iobroker/adapter-react-v5'; +import type { CameraConfigHiKam } from '../types'; +import ConfigGeneric, { type ConfigProps } from './ConfigGeneric'; + +const styles: Record<'page' | 'ip' | 'username' | 'password' | 'quality', React.CSSProperties> = { + page: { + width: '100%', + }, + ip: { + marginRight: 8, + width: 200, + }, + username: { + marginTop: 16, + marginRight: 8, + width: 200, + }, + password: { + marginTop: 16, + width: 200, + }, + quality: { + marginTop: 16, + width: 200, + }, +}; + +export default class RTSPHiKamConfig extends ConfigGeneric { + public static isRtsp = true; // this camera can be used in RTSP snapshot + + constructor(props: ConfigProps) { + super(props); + + this.state = { + ip: this.props.settings.ip || '', + password: this.props.settings.password || '', + username: this.props.settings.username === undefined ? 'admin' : this.props.settings.username || '', + quality: this.props.settings.quality || 'low', + }; + } + + componentDidMount(): void { + this.props.decrypt(this.state.password, password => this.setState({ password })); + } + + reportSettings(): void { + this.props.encrypt(this.state.password, password => { + this.props.onChange({ + ip: this.state.ip, + username: this.state.username, + password, + quality: this.state.quality, + }); + }); + } + + render(): React.JSX.Element { + return ( +
+
+ this.setState({ ip: e.target.value }, () => this.reportSettings())} + /> +
+ this.setState({ username: e.target.value }, () => this.reportSettings())} + /> + this.setState({ password: e.target.value }, () => this.reportSettings())} + /> +
+ + +
+ ); + } +} diff --git a/src-admin/src/Types/RTSPImage.tsx b/src-admin/src/Types/RTSPImage.tsx new file mode 100644 index 0000000..97be6bd --- /dev/null +++ b/src-admin/src/Types/RTSPImage.tsx @@ -0,0 +1,274 @@ +import React from 'react'; + +import { TextField, Checkbox, FormControlLabel, Select, MenuItem, FormControl, InputLabel } from '@mui/material'; + +import { I18n } from '@iobroker/adapter-react-v5'; +import type { CameraConfigRtsp } from '../types'; +import ConfigGeneric, { type ConfigProps } from './ConfigGeneric'; + +const styles: Record = { + page: { + width: '100%', + }, + ip: { + marginRight: 8, + width: 200, + }, + port: { + marginRight: 8, + width: 200, + }, + protocol: { + width: 70, + }, + username: { + marginTop: 16, + marginRight: 8, + width: 200, + }, + password: { + marginTop: 16, + width: 200, + }, + urlPath: { + marginTop: 16, + marginBotton: `24px !important`, + width: 408, + }, + width: { + marginTop: 16, + marginRight: 8, + width: 90, + }, + height: { + marginTop: 16, + width: 90, + }, + expertMode: { + marginTop: 16, + }, + suffix: { + marginTop: 16, + width: 200, + }, + prefix: { + marginTop: 16, + marginRight: 8, + width: 200, + }, + ffmpgDiv: { + marginTop: 16, + }, + ffmpgLabel: { + fontSize: 'smaller', + fontWeight: 'bold', + }, + ffmpgCommand: { + fontFamily: 'monospace', + fontSize: 'smaller', + }, +}; + +export default class RTSPImageConfig extends ConfigGeneric { + public static isRtsp = true; // this camera can be used in RTSP snapshot + + constructor(props: ConfigProps) { + super(props); + + this.state = { + ip: this.props.settings.ip || '', + port: this.props.settings.port || '554', + urlPath: this.props.settings.urlPath || '', + password: this.props.settings.password || '', + username: this.props.settings.username === undefined ? 'admin' : this.props.settings.username || '', + url: `rtsp://${this.props.settings.username ? `${this.props.settings.username}:***@` : ''}${this.props.settings.ip}:${this.props.settings.port}${this.props.settings.urlPath ? (this.props.settings.urlPath.startsWith('/') ? this.props.settings.urlPath : `/${this.props.settings.urlPath}`) : ''}`, + originalHeight: this.props.settings.originalHeight || '', + originalWidth: this.props.settings.originalWidth || '', + prefix: this.props.settings.prefix || '', + suffix: this.props.settings.suffix || '', + protocol: this.props.settings.protocol || 'udp', + expertMode: false, + }; + } + + componentDidMount(): void { + this.props.decrypt(this.state.password || '', password => this.setState({ password })); + } + + reportSettings(): void { + this.props.encrypt(this.state.password || '', password => { + this.props.onChange({ + ip: this.state.ip, + username: this.state.username, + password, + port: this.state.port, + urlPath: this.state.urlPath, + prefix: this.state.prefix, + suffix: this.state.suffix, + protocol: this.state.protocol, + originalWidth: this.state.originalWidth, + originalHeight: this.state.originalHeight, + }); + }); + } + + buildCommand(options: Omit): string[] { + const parameters = ['-y']; + options.prefix && parameters.push(options.prefix); + parameters.push('-rtsp_transport'); + parameters.push(options.protocol || 'udp'); + parameters.push('-i'); + parameters.push( + `rtsp://${options.username ? options.username + (options.password ? ':***' : '') : ''}@${options.ip}:${options.port || 554}${options.urlPath ? (options.urlPath.startsWith('/') ? options.urlPath : `/${options.urlPath}`) : ''}`, + ); + parameters.push('-loglevel'); + parameters.push('error'); + if (options.originalWidth && options.originalHeight) { + parameters.push(`scale=${options.originalWidth}:${options.originalHeight}`); + } + parameters.push('-vframes'); + parameters.push('1'); + options.suffix && parameters.push(options.suffix); + parameters.push( + `${this.props.native.tempPath ? `${this.props.native.tempPath}/` : ''}${options.ip.replace(/[.:]/g, '_')}.jpg`, + ); + return parameters; + } + + render(): React.JSX.Element { + return ( +
+
+ this.setState({ ip: e.target.value }, () => this.reportSettings())} + /> + this.setState({ port: e.target.value }, () => this.reportSettings())} + /> + + {I18n.t('Protocol')} + + +
+ this.setState({ urlPath: e.target.value }, () => this.reportSettings())} + helperText={this.state.url} + /> +
+ this.setState({ username: e.target.value }, () => this.reportSettings())} + /> + this.setState({ password: e.target.value }, () => this.reportSettings())} + /> +
+ this.setState({ expertMode: e.target.checked })} + /> + } + label={I18n.t('Expert settings')} + /> + {this.state.expertMode ?
: null} + {this.state.expertMode ? ( + + this.setState({ originalWidth: e.target.value }, () => this.reportSettings()) + } + /> + ) : null} + {this.state.expertMode ? ( +
x
+ ) : null} + {this.state.expertMode ? ( + + this.setState({ originalHeight: e.target.value }, () => this.reportSettings()) + } + /> + ) : null} + {this.state.expertMode ?
: null} + {this.state.expertMode ? ( + this.setState({ prefix: e.target.value }, () => this.reportSettings())} + /> + ) : null} + {this.state.expertMode ? ( + this.setState({ suffix: e.target.value }, () => this.reportSettings())} + /> + ) : null} + {this.state.expertMode ?
: null} + {this.state.expertMode ?
: null} + {this.state.expertMode ? ( +
+ {I18n.t('ffmpeg command')}: + ffmpeg {this.buildCommand(this.state).join(' ')} +
+ ) : null} + +
+ ); + } +} diff --git a/src-admin/src/Types/RTSPReolinkE1.tsx b/src-admin/src/Types/RTSPReolinkE1.tsx new file mode 100644 index 0000000..74e1080 --- /dev/null +++ b/src-admin/src/Types/RTSPReolinkE1.tsx @@ -0,0 +1,107 @@ +import React from 'react'; + +import { MenuItem, Select, TextField } from '@mui/material'; + +import { I18n } from '@iobroker/adapter-react-v5'; +import ConfigGeneric, { type ConfigProps } from './ConfigGeneric'; +import type { CameraConfigReolink } from '../types'; + +const styles = { + page: { + width: '100%', + }, + ip: { + marginRight: 8, + width: 200, + }, + username: { + marginTop: 16, + marginRight: 8, + width: 200, + }, + password: { + marginTop: 16, + width: 200, + }, + quality: { + marginTop: 16, + width: 200, + }, +}; + +export default class RTSPReolinkE1Config extends ConfigGeneric { + public static isRtsp = true; // this camera can be used in RTSP snapshot + + constructor(props: ConfigProps) { + super(props); + + this.state = { + ip: this.props.settings.ip || '', + password: this.props.settings.password || '', + username: this.props.settings.username === undefined ? 'admin' : this.props.settings.username || '', + quality: this.props.settings.quality || 'low', + }; + } + + componentDidMount(): void { + this.props.decrypt(this.state.password || '', password => this.setState({ password })); + } + + reportSettings(): void { + this.props.encrypt(this.state.password || '', password => { + this.props.onChange({ + ip: this.state.ip, + username: this.state.username, + password, + quality: this.state.quality, + }); + }); + } + + render(): React.JSX.Element { + return ( +
+
+ this.setState({ ip: e.target.value }, () => this.reportSettings())} + /> +
+ this.setState({ username: e.target.value }, () => this.reportSettings())} + /> + this.setState({ password: e.target.value }, () => this.reportSettings())} + /> +
+ + +
+ ); + } +} diff --git a/src-admin/src/Types/URLBasicAuthImage.tsx b/src-admin/src/Types/URLBasicAuthImage.tsx new file mode 100644 index 0000000..06a6dfa --- /dev/null +++ b/src-admin/src/Types/URLBasicAuthImage.tsx @@ -0,0 +1,76 @@ +import React from 'react'; + +import { TextField } from '@mui/material'; + +import { I18n } from '@iobroker/adapter-react-v5'; +import type { CameraConfigUrlBasicAuth } from '../types'; +import ConfigGeneric, { type ConfigProps } from './ConfigGeneric'; + +const styles: Record<'page' | 'url', React.CSSProperties> = { + page: { + width: '100%', + }, + url: { + width: '100%', + }, +}; + +export default class URLBasicAuthImageConfig extends ConfigGeneric { + constructor(props: ConfigProps) { + super(props); + + this.state = { + url: this.props.settings.url || '', + password: this.props.settings.password || '', + username: this.props.settings.username || '', + }; + } + + componentDidMount(): void { + this.props.decrypt(this.state.password, password => this.setState({ password })); + } + + reportSettings(): void { + this.props.encrypt(this.state.password, password => { + this.props.onChange({ + url: this.state.url, + username: this.state.username, + password, + }); + }); + } + + render(): React.JSX.Element { + return ( +
+ this.setState({ url: e.target.value }, () => this.reportSettings())} + /> +
+ this.setState({ username: e.target.value }, () => this.reportSettings())} + /> +
+ this.setState({ password: e.target.value }, () => this.reportSettings())} + /> +
+ ); + } +} diff --git a/src-admin/src/Types/URLImage.tsx b/src-admin/src/Types/URLImage.tsx new file mode 100644 index 0000000..4ee6cc3 --- /dev/null +++ b/src-admin/src/Types/URLImage.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +import { TextField } from '@mui/material'; + +import { I18n } from '@iobroker/adapter-react-v5'; +import type { CameraConfigUrl } from '../types'; +import ConfigGeneric, { type ConfigProps } from './ConfigGeneric'; + +const styles: Record<'page' | 'url', React.CSSProperties> = { + page: { + width: '100%', + }, + url: { + width: '100%', + }, +}; + +export default class UrlImageConfig extends ConfigGeneric { + constructor(props: ConfigProps) { + super(props); + + this.state = { + url: this.props.settings.url || '', + }; + } + + reportSettings(): void { + this.props.onChange({ + url: this.state.url, + }); + } + + render(): React.JSX.Element { + return ( +
+ this.setState({ url: e.target.value }, () => this.reportSettings())} + /> +
+ ); + } +} diff --git a/src/src/i18n/de.json b/src-admin/src/i18n/de.json similarity index 90% rename from src/src/i18n/de.json rename to src-admin/src/i18n/de.json index 8d8c5e8..3ea12cb 100644 --- a/src/src/i18n/de.json +++ b/src-admin/src/i18n/de.json @@ -22,7 +22,7 @@ "Edit camera %s [%s]": "Kamera bearbeiten %s [%s]", "Cameras": "Kameras", "Local IP address": "Lokale IP-Adresse", - "Local port": "Lokaler Hafen", + "Local port": "Lokaler Port", "Default timeout (ms)": "Standard-Timeout (ms)", "WEB Instance": "WEB-Instanz", "All": "Alles", @@ -32,14 +32,14 @@ "Path to store temporary images": "Pfad zum Speichern temporärer Bilder", "If empty then in adapter folder": "Wenn leer, dann im Adapterordner", "Default cache timeout (ms)": "Standard-Cache-Timeout (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "Wie oft die Kameras nach neuen Schnappschüssen gefragt werden. Wenn 0, dann bei jeder Anfrage", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "Wie oft die Kameras nach neuen Schnappschüssen gefragt werden. Wenn 0, dann bei jeder Anfrage", "URL": "URL", "URL with basic auth": "URL mit einfacher Auth", "RTSP Snapshot": "RTSP-Snapshot", "Local URL": "Lokale URL", "Web URL": "Web-URL", "Camera IP": "Kamera-IP", - "Port": "Hafen", + "Port": "Port", "Path": "Weg", "Cache timeout (ms)": "Cache-Timeout (ms)", "If empty, use default settings. If 0, cache disabled": "Wenn leer, Standardeinstellungen verwenden. Wenn 0, Cache deaktiviert", diff --git a/src/src/i18n/en.json b/src-admin/src/i18n/en.json similarity index 92% rename from src/src/i18n/en.json rename to src-admin/src/i18n/en.json index 7b64737..39225ad 100644 --- a/src/src/i18n/en.json +++ b/src-admin/src/i18n/en.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Path to store temporary images", "If empty then in adapter folder": "If empty then in adapter folder", "Default cache timeout (ms)": "Default cache timeout (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "How often the cameras will be ascked for new snapshot. If 0, then by every request", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "How often the cameras will be asked for new snapshot. If 0, then by every request", "URL": "URL", "URL with basic auth": "URL with basic auth", "RTSP Snapshot": "RTSP Snapshot", diff --git a/src/src/i18n/es.json b/src-admin/src/i18n/es.json similarity index 92% rename from src/src/i18n/es.json rename to src-admin/src/i18n/es.json index 6ae530c..214e733 100644 --- a/src/src/i18n/es.json +++ b/src-admin/src/i18n/es.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Ruta para almacenar imágenes temporales", "If empty then in adapter folder": "Si está vacío, entonces en la carpeta del adaptador", "Default cache timeout (ms)": "Tiempo de espera de caché predeterminado (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "Con qué frecuencia se pedirá a las cámaras una nueva instantánea. Si es 0, entonces por cada solicitud", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "Con qué frecuencia se pedirá a las cámaras una nueva instantánea. Si es 0, entonces por cada solicitud", "URL": "URL", "URL with basic auth": "URL con autenticación básica", "RTSP Snapshot": "Instantánea de RTSP", diff --git a/src/src/i18n/fr.json b/src-admin/src/i18n/fr.json similarity index 92% rename from src/src/i18n/fr.json rename to src-admin/src/i18n/fr.json index f09f587..dbf0c38 100644 --- a/src/src/i18n/fr.json +++ b/src-admin/src/i18n/fr.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Chemin de stockage des images temporaires", "If empty then in adapter folder": "Si vide, alors dans le dossier de l'adaptateur", "Default cache timeout (ms)": "Délai d'expiration du cache par défaut (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "La fréquence à laquelle les caméras seront demandées pour un nouvel instantané. Si 0, alors à chaque requête", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "La fréquence à laquelle les caméras seront demandées pour un nouvel instantané. Si 0, alors à chaque requête", "URL": "URL", "URL with basic auth": "URL avec authentification de base", "RTSP Snapshot": "Instantané RTSP", diff --git a/src/src/i18n/it.json b/src-admin/src/i18n/it.json similarity index 92% rename from src/src/i18n/it.json rename to src-admin/src/i18n/it.json index 072b7f0..9ab220b 100644 --- a/src/src/i18n/it.json +++ b/src-admin/src/i18n/it.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Percorso per memorizzare le immagini temporanee", "If empty then in adapter folder": "Se vuoto, nella cartella dell'adattatore", "Default cache timeout (ms)": "Timeout cache predefinito (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "La frequenza con cui le telecamere riceveranno una nuova istantanea. Se 0, allora da ogni richiesta", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "La frequenza con cui le telecamere riceveranno una nuova istantanea. Se 0, allora da ogni richiesta", "URL": "URL", "URL with basic auth": "URL con autenticazione di base", "RTSP Snapshot": "Istantanea RTSP", diff --git a/src/src/i18n/nl.json b/src-admin/src/i18n/nl.json similarity index 92% rename from src/src/i18n/nl.json rename to src-admin/src/i18n/nl.json index 98949b7..a52c318 100644 --- a/src/src/i18n/nl.json +++ b/src-admin/src/i18n/nl.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Pad om tijdelijke afbeeldingen op te slaan", "If empty then in adapter folder": "Indien leeg dan in adaptermap", "Default cache timeout (ms)": "Standaard cachetime-out (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "Hoe vaak de camera's worden gevraagd om een nieuwe momentopname. Indien 0, dan bij elk verzoek", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "Hoe vaak de camera's worden gevraagd om een nieuwe momentopname. Indien 0, dan bij elk verzoek", "URL": "URL", "URL with basic auth": "URL met basisauthenticatie", "RTSP Snapshot": "RTSP-momentopname", diff --git a/src/src/i18n/pl.json b/src-admin/src/i18n/pl.json similarity index 93% rename from src/src/i18n/pl.json rename to src-admin/src/i18n/pl.json index 82e5e09..8b99f20 100644 --- a/src/src/i18n/pl.json +++ b/src-admin/src/i18n/pl.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Ścieżka do przechowywania obrazów tymczasowych", "If empty then in adapter folder": "Jeśli jest pusty, to w folderze adaptera", "Default cache timeout (ms)": "Domyślny limit czasu pamięci podręcznej (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "Jak często kamery będą pytane o nowe zdjęcie. Jeśli 0, to przy każdym żądaniu", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "Jak często kamery będą pytane o nowe zdjęcie. Jeśli 0, to przy każdym żądaniu", "URL": "Adres URL", "URL with basic auth": "Adres URL z podstawowym uwierzytelnieniem", "RTSP Snapshot": "Migawka RTSP", diff --git a/src/src/i18n/pt.json b/src-admin/src/i18n/pt.json similarity index 92% rename from src/src/i18n/pt.json rename to src-admin/src/i18n/pt.json index 2eedb8b..e1c2f77 100644 --- a/src/src/i18n/pt.json +++ b/src-admin/src/i18n/pt.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Caminho para armazenar imagens temporárias", "If empty then in adapter folder": "Se estiver vazio, então na pasta do adaptador", "Default cache timeout (ms)": "Tempo limite de cache padrão (ms)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "Com que frequência as câmeras serão solicitadas para um novo instantâneo. Se 0, então a cada solicitação", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "Com que frequência as câmeras serão solicitadas para um novo instantâneo. Se 0, então a cada solicitação", "URL": "URL", "URL with basic auth": "URL com autenticação básica", "RTSP Snapshot": "Instantâneo RTSP", diff --git a/src/src/i18n/ru.json b/src-admin/src/i18n/ru.json similarity index 93% rename from src/src/i18n/ru.json rename to src-admin/src/i18n/ru.json index 5302bfe..2b5c5f2 100644 --- a/src/src/i18n/ru.json +++ b/src-admin/src/i18n/ru.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Путь для хранения временных изображений", "If empty then in adapter folder": "Если пусто, то в папке адаптера", "Default cache timeout (ms)": "Время ожидания кэша по умолчанию (мс)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "Как часто камеры будут запрашивать новый снимок. Если 0, то при каждом запросе", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "Как часто камеры будут запрашивать новый снимок. Если 0, то при каждом запросе", "URL": "URL-адрес", "URL with basic auth": "URL с базовой авторизацией", "RTSP Snapshot": "Снимок RTSP", diff --git a/src/src/i18n/uk.json b/src-admin/src/i18n/uk.json similarity index 93% rename from src/src/i18n/uk.json rename to src-admin/src/i18n/uk.json index e7978e9..1846b18 100644 --- a/src/src/i18n/uk.json +++ b/src-admin/src/i18n/uk.json @@ -32,7 +32,7 @@ "Path to store temporary images": "Шлях для зберігання тимчасових зображень", "If empty then in adapter folder": "Якщо порожній, то в папці адаптера", "Default cache timeout (ms)": "Час очікування кешу за умовчанням (мс)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "Як часто камери запитуватимуть новий знімок. Якщо 0, то за кожним запитом", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "Як часто камери запитуватимуть новий знімок. Якщо 0, то за кожним запитом", "URL": "URL", "URL with basic auth": "URL-адреса з базовою авторизацією", "RTSP Snapshot": "Знімок RTSP", diff --git a/src/src/i18n/zh-cn.json b/src-admin/src/i18n/zh-cn.json similarity index 93% rename from src/src/i18n/zh-cn.json rename to src-admin/src/i18n/zh-cn.json index 71dfc25..e24b83b 100644 --- a/src/src/i18n/zh-cn.json +++ b/src-admin/src/i18n/zh-cn.json @@ -32,7 +32,7 @@ "Path to store temporary images": "存放临时图片的路径", "If empty then in adapter folder": "如果为空则在适配器文件夹中", "Default cache timeout (ms)": "默认缓存超时(毫秒)", - "How often the cameras will be ascked for new snapshot. If 0, then by every request": "相机被要求拍摄新快照的频率。如果为 0,则按每个请求", + "How often the cameras will be asked for new snapshot. If 0, then by every request": "相机被要求拍摄新快照的频率。如果为 0,则按每个请求", "URL": "网址", "URL with basic auth": "具有基本身份验证的 URL", "RTSP Snapshot": "RTSP 快照", diff --git a/src/src/index.js b/src-admin/src/index.tsx similarity index 75% rename from src/src/index.js rename to src-admin/src/index.tsx index abe5aef..d0c0bec 100644 --- a/src/src/index.js +++ b/src-admin/src/index.tsx @@ -6,13 +6,22 @@ import * as serviceWorker from './serviceWorker'; import '@iobroker/adapter-react-v5/index.css'; import App from './App'; +declare global { + interface Window { + sentryDSN: string; + adapterName: string | undefined; + } +} + window.adapterName = 'cameras'; console.log(`iobroker.${window.adapterName}@${pack.version}`); const container = document.getElementById('root'); -const root = createRoot(container); -root.render(); +if (container) { + const root = createRoot(container); + root.render(); +} // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. diff --git a/src-admin/src/serviceWorker.ts b/src-admin/src/serviceWorker.ts new file mode 100644 index 0000000..f87fc6d --- /dev/null +++ b/src-admin/src/serviceWorker.ts @@ -0,0 +1,138 @@ +/* eslint-disable */ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read http://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/), +); + +export function register(config?: { + onUpdate: (r: ServiceWorkerRegistration) => void; + onSuccess: (r: ServiceWorkerRegistration) => void; +}): void { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL('./', window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `./service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit http://bit.ly/CRA-PWA', + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW( + swUrl: string | URL, + config?: { onUpdate: (r: ServiceWorkerRegistration) => void; onSuccess: (r: ServiceWorkerRegistration) => void }, +): void { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker === null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See http://bit.ly/CRA-PWA.', + ); + + // Execute callback + if (config?.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config?.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker( + swUrl: string | URL, + config?: { onUpdate: (r: ServiceWorkerRegistration) => void; onSuccess: (r: ServiceWorkerRegistration) => void }, +): void { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if (response.status === 404 || (contentType !== null && contentType.indexOf('javascript') === -1)) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log('No internet connection found. App is running in offline mode.'); + }); +} + +export function unregister(): void { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + return registration.unregister(); + }); + } +} diff --git a/src-admin/src/types.d.ts b/src-admin/src/types.d.ts new file mode 100644 index 0000000..bea6a07 --- /dev/null +++ b/src-admin/src/types.d.ts @@ -0,0 +1,86 @@ +export type CameraType = 'url' | 'urlBasicAuth' | 'rtsp' | 'reolinkE1' | 'eufy' | 'hikam'; + +export interface CameraConfig { + name: string; + type: CameraType; + id: number; + desc?: string; + timeout?: number | string; + cacheTimeout?: number | string; + addTime?: boolean; + title?: string; + enabled?: boolean; + rtsp: boolean; +} + +export interface CameraConfigUrl extends CameraConfig { + type: 'url'; + url: string; +} + +export interface CameraConfigUrlBasicAuth extends CameraConfig { + type: 'urlBasicAuth'; + url: string; + password: string; + username: string; +} + +export interface CameraConfigEufy extends CameraConfig { + type: 'eufy'; + ip: string; + oid: string; + useOid: boolean; +} + +export interface CameraConfigHiKam extends CameraConfig { + type: 'hikam'; + ip: string; + password: string; + username: string; + quality: 'low' | 'high'; +} + +export interface CameraConfigRtsp extends CameraConfig { + type: 'rtsp'; + ip: string; + port: string | number; + urlPath: string; + password?: string; + username?: string; + originalWidth?: string | number; + originalHeight?: string | number; + prefix?: string; + suffix?: string; + protocol: 'udp' | 'tcp'; +} + +export interface CameraConfigReolink extends CameraConfig { + type: 'reolinkE1'; + ip: string; + password?: string; + username?: string; + quality: 'high' | 'low'; +} + +export type CameraConfigAny = + | CameraConfigUrl + | CameraConfigUrlBasicAuth + | CameraConfigRtsp + | CameraConfigEufy + | CameraConfigHiKam + | CameraConfigReolink; + +export interface CamerasAdapterConfig { + bind: string; + port: number; + key: string; + webInstance: string; + defaultTimeout: number | string; + defaultCacheTimeout: number | string; + allowIPs: string; + ffmpegPath: string; + tempPath: string; + dateFormat: 'LTS'; + language: ioBroker.Languages; + cameras: CameraConfigAny[]; +} diff --git a/src-admin/tsconfig.json b/src-admin/tsconfig.json new file mode 100644 index 0000000..aa44b70 --- /dev/null +++ b/src-admin/tsconfig.json @@ -0,0 +1,37 @@ +// Specialized tsconfig for the admin directory, +// includes DOM typings and configures the admin build +{ + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + // check JS files + "allowJs": true, + // This is necessary for the automatic typing of the adapter config + "resolveJsonModule": true, + // If you want to disable the stricter type checks (not recommended), uncomment the following line + // "strict": false, + // And enable some of those features for more fine-grained control + "strictNullChecks": true, + // "strictPropertyInitialization": true, + // "strictBindCallApply": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + "useUnknownInCatchVariables": false, + "target": "ES2022", + "baseUrl": "./", + "allowSyntheticDefaultImports": true, + "checkJs": false, + "noEmit": false, + "outDir": "./build", + "sourceMap": true, + "sourceRoot": "./src", + "noImplicitAny": true, + "skipLibCheck": true, + "verbatimModuleSyntax": true, + "lib": ["es2018", "DOM"], + "jsx": "react", + "types": ["@iobroker/types"] + }, + "include": ["./src/**/*.ts", "./src/**/*.d.ts", "./src/**/*.tsx", "./src/**/*.json", "./src/**/*.css"], + "exclude": ["**/node_modules", "**/dist"] +} diff --git a/src-admin/vite.config.mjs b/src-admin/vite.config.mjs new file mode 100644 index 0000000..0454cc4 --- /dev/null +++ b/src-admin/vite.config.mjs @@ -0,0 +1,33 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig(() => { + return { + build: { + outDir: 'build', + }, + plugins: [react()], + base: './', + server: { + port: 3000, + proxy: { + '/adapter': { + target: 'http://localhost:8081', + changeOrigin: true, + secure: false, + configure: (proxy, _options) => { + proxy.on('error', (err, _req, _res) => { + console.log('proxy error', err); + }); + proxy.on('proxyReq', (proxyReq, req, _res) => { + console.log('Sending Request to the Target:', req.method, req.url); + }); + proxy.on('proxyRes', (proxyRes, req, _res) => { + console.log('Received Response from the Target:', proxyRes.statusCode, req.url); + }); + }, + }, + }, + }, + }; +}); diff --git a/src-widgets/package.json b/src-widgets/package.json index fc2e482..c9036b5 100644 --- a/src-widgets/package.json +++ b/src-widgets/package.json @@ -1,33 +1,33 @@ { "name": "iobroker.vis-2-widgets-camera", "private": true, - "version": "2.0.2", + "version": "2.1.2", "dependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@craco/craco": "^7.1.0", - "@iobroker/adapter-react-v5": "^6.0.19", - "@iobroker/vis-2-widgets-react-dev": "^2.0.2", - "@mui/icons-material": "^5.16.1", - "@mui/material": "^5.16.1", + "@iobroker/adapter-react-v5": "^7.4.19", + "@iobroker/vis-2-widgets-react-dev": "^4.0.4", + "@mui/icons-material": "^6.4.1", + "@mui/material": "^6.4.1", "craco-esbuild": "^0.6.1", "craco-module-federation": "^1.1.0", "eslint": "^8.57.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-eqeqeq-fix": "^1.0.3", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "^6.9.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-react": "^7.34.4", - "eslint-plugin-react-hooks": "^4.6.2", - "hls.js": "^1.5.13", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.1.0", + "hls.js": "^1.5.20", "moment": "^2.30.1", "node-sass": "^9.0.0", "prop-types": "^15.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-scripts": "^5.0.1", - "sass": "^1.77.8", - "uuid": "^10.0.0" + "sass": "^1.83.4", + "uuid": "^11.0.5" }, "scripts": { "start": "set PORT=4173 && craco start", diff --git a/src/package.json b/src/package.json deleted file mode 100644 index 4b6e17e..0000000 --- a/src/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "cameras-admin", - "version": "2.1.2", - "private": true, - "dependencies": { - "@iobroker/adapter-react-v5": "^6.0.19", - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@mui/icons-material": "^5.16.1", - "@mui/material": "^5.16.1", - "babel-eslint": "^10.1.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-icons": "^5.2.1", - "react-scripts": "^5.0.1", - "@material-ui/icons": "^4.11.3", - "eslint": "^8.56.0", - "eslint-plugin-import": "^2.29.1" - }, - "scripts": { - "start": "set DANGEROUSLY_DISABLE_HOST_CHECK=true&& react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": "react-app" - }, - "proxy": "http://127.0.0.1:8081", - "allowedHosts": [ - "127.0.0.1" - ], - "homepage": ".", - "browserslist": [ - ">0.2%", - "not dead", - "not ie <= 11", - "not op_mini all" - ] -} \ No newline at end of file diff --git a/src/public/index.html b/src/public/index.html deleted file mode 100644 index bbbcc5a..0000000 --- a/src/public/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - ioBroker.cameras - - - -
- - diff --git a/src/src/App.js b/src/src/App.js deleted file mode 100644 index e543baf..0000000 --- a/src/src/App.js +++ /dev/null @@ -1,177 +0,0 @@ -import React from 'react'; -import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles'; - -import { - AppBar, - Tabs, - Tab, -} from '@mui/material'; - -import { Loader, I18n, GenericApp } from '@iobroker/adapter-react-v5'; - -import TabOptions from './Tabs/Options'; -import TabCameras from './Tabs/Cameras'; - -const styles = { - tabContent: { - padding: 10, - height: 'calc(100% - 64px - 48px - 20px)', - overflow: 'auto', - }, - tabContentIFrame: { - padding: 10, - height: 'calc(100% - 64px - 48px - 20px - 38px)', - overflow: 'auto', - }, - selected: theme => ({ - color: theme.palette.mode === 'dark' ? undefined : '#FFF !important', - }), - indicator: theme => ({ - backgroundColor: theme.palette.mode === 'dark' ? theme.palette.secondary.main : '#FFF', - }), -}; - -class App extends GenericApp { - constructor(props) { - const extendedProps = {}; - extendedProps.adapterName = 'cameras'; - extendedProps.doNotLoadAllObjects = true; - extendedProps.translations = { - 'en': require('./i18n/en'), - 'de': require('./i18n/de'), - 'ru': require('./i18n/ru'), - 'pt': require('./i18n/pt'), - 'nl': require('./i18n/nl'), - 'fr': require('./i18n/fr'), - 'it': require('./i18n/it'), - 'es': require('./i18n/es'), - 'pl': require('./i18n/pl'), - 'uk': require('./i18n/uk'), - 'zh-cn': require('./i18n/zh-cn'), - }; - - if (window.location.port === '3000') { - // extendedProps.socket = { - // protocol: 'http:', - // host: '192.168.178.45', - // port: 8081, - // }; - } - - super(props, extendedProps); - } - - onAliveChanged = (id, state) => { - if (id && this.state.alive !== (!!state?.val)) { - this.setState({ alive: !!state?.val }); - } - } - - componentWillUnmount() { - this.subscribed && this.socket.unsubscribeState(this.subscribed, this.onAliveChanged); - super.componentWillUnmount(); - } - - // called when connected with admin and loaded instance object - onConnectionReady() { - this.socket.getState(`${this.instanceId}.alive`) - .then(state => { - if (this.state.alive !== (!!state?.val)) { - this.setState({ alive: !!state?.val }); - } - - // generate random key - if (!this.state.native.key) { - setTimeout(() => this.updateNativeValue('key', (Math.round(Math.random() * 100000000000) / 100000).toFixed(6))); - } - this.subscribed = `${this.instanceId}.alive`; - this.socket.subscribeState(this.subscribed, this.onAliveChanged); - }); - } - - getSelectedTab() { - const tab = this.state.selectedTab; - - if (!tab || tab === 'options') { - return 0; - } else - if (tab === 'cameras') { - return 1; - } - } - - render() { - if (!this.state.loaded) { - return - - - - - } - - return - -
- - this.selectTab(e.target.dataset.name, index)} - sx={{ '& .MuiTabs-indicator': styles.indicator }} - > - - - - - -
- {(this.state.selectedTab === 'options' || !this.state.selectedTab) && cb(this.encrypt(value))} - decrypt={(value, cb) => cb(this.decrypt(value))} - onError={text => this.setState({ errorText: text })} - onLoad={native => this.onLoadConfig(native)} - instance={this.instance} - theme={this.state.theme} - getIpAddresses={() => this.socket.getIpAddresses(this.common.host)} - getExtendableInstances={() => this.getExtendableInstances()} - onConfigError={configError => this.setConfigurationError(configError)} - adapterName={this.adapterName} - onChange={(attr, value, cb) => this.updateNativeValue(attr, value, cb)} - instanceAlive={this.state.alive} - />} - {this.state.selectedTab === 'cameras' && cb(this.encrypt(value))} - decrypt={(value, cb) => cb(this.decrypt(value))} - instanceAlive={this.state.alive} - native={this.state.native} - onChange={(attr, value, cb) => this.updateNativeValue(attr, value, cb)} - />} -
- {this.renderError()} - {this.renderSaveCloseButtons()} -
-
-
- } -} - -export default App; diff --git a/src/src/Tabs/Cameras.js b/src/src/Tabs/Cameras.js deleted file mode 100644 index a85ae52..0000000 --- a/src/src/Tabs/Cameras.js +++ /dev/null @@ -1,657 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; - -import { - Fab, - Button, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - FormControl, - FormControlLabel, - InputLabel, - MenuItem, - Select, - TextField, - Checkbox, - CircularProgress, -} from '@mui/material'; - -import { - Delete as IconDelete, - Edit as IconEdit, - Add as IconAdd, - ArrowUpward as IconUp, - ArrowDownward as IconDown, - CameraAlt as IconTest, -} from '@mui/icons-material'; - -import { I18n, Message as MessageDialog } from '@iobroker/adapter-react-v5'; - -import URLImage from '../Types/URLImage'; -import URLBasicAuthImage from '../Types/URLBasicAuthImage'; -import RTSPImageConfig from '../Types/RTSPImage'; -import RTSPReolinkE1Config from '../Types/RTSPReolinkE1'; -import RTSPEufyConfig from '../Types/RTSPEufy'; -import RTSPHiKamConfig from '../Types/RTSPHiKam'; - -const TYPES = { - url: { Config: URLImage, name: 'URL' }, - urlBasicAuth: { Config: URLBasicAuthImage, name: 'URL with basic auth' }, - rtsp: { Config: RTSPImageConfig, name: 'RTSP Snapshot' }, - reolinkE1: { Config: RTSPReolinkE1Config, name: 'Reolink E1 Snapshot' }, - eufy: { Config: RTSPEufyConfig, name: 'Eufy Security' }, - hikam: { Config: RTSPHiKamConfig, name: 'HiKam / WiWiCam' }, -}; - -const styles = { - tab: { - width: '100%', - height: '100%', - }, - lineDiv: { - width: '100%', - paddingBottom: 5, - borderBottom: '1px dashed gray', - }, - lineCheck: { - display: 'inline-block', - width: 44, - }, - lineCheckbox: { - marginTop: 10, - }, - lineText: { - display: 'inline-block', - width: 200, - }, - lineDesc: { - display: 'inline-block', - width: 'calc(100% - 644px)', - }, - lineType: { - display: 'inline-block', - width: 200, - }, - lineEdit: { - display: 'inline-block', - marginLeft: 10, - marginTop: 10, - }, - lineUp: { - display: 'inline-block', - marginLeft: 10, - marginTop: 10, - }, - lineDown: { - display: 'inline-block', - marginLeft: 10, - marginTop: 10, - }, - lineDelete: { - display: 'inline-block', - marginLeft: 10, - marginTop: 10, - }, - lineUrl: { - marginLeft: 200, - opacity: 0.5, - fontSize: 'small', - fontStyle: 'italic', - }, - type: { - width: '100%', - }, - name: { - width: 'calc(100% - 10px)', - }, - desc: { - width: 'calc(100% - 10px)', - }, - lineNoButtonUp: { - display: 'inline-block', - width: 40, - marginLeft: 10, - }, - lineNoButtonDown: { - display: 'inline-block', - width: 40, - marginLeft: 10, - }, - divConfig: { - verticalAlign: 'top', - }, - divTestCam: { - flex: 1, - verticalAlign: 'top', - display: 'flex', - flexDirection: 'column', - }, - buttonIcon: { - marginTop: 6, - }, - buttonTest: { - marginBottom: 8, - }, - imgTest: { - width: '100%', - height: 'auto', - }, - sampleUrl: { - display: 'block', - marginTop: 8, - }, - link: { - color: 'inherit', - textDecoration: 'underline', - }, -}; - -class Server extends Component { - constructor(props) { - super(props); - - this.state = { - editCam: false, - editChanged: false, - requesting: false, - instanceAlive: this.props.instanceAlive, - webInstanceHost: '', - }; - - // translate all names once - Object.keys(TYPES).forEach(type => { - if (TYPES[type].name && !TYPES[type].translated) { - TYPES[type].translated = true; - TYPES[type].name = I18n.t(TYPES[type].name); - if (TYPES[type].Config.getRtsp && TYPES[type].Config.getRtsp()) { - TYPES[type].rtsp = true; - } - } - }); - } - - componentDidMount() { - this.getWebInstances(); - } - - static ip2int(ip) { - return ip.split('.').reduce((ipInt, octet) => (ipInt << 8) + parseInt(octet, 10), 0) >>> 0; - } - - static findNetworkAddressOfHost(obj, localIp) { - const networkInterfaces = obj?.native?.hardware?.networkInterfaces; - if (!networkInterfaces) { - return null; - } - - let hostIp; - Object.keys(networkInterfaces).forEach(inter => { - networkInterfaces[inter].forEach(ip => { - if (ip.internal) { - return; - } else if (localIp.includes(':') && ip.family !== 'IPv6') { - return; - } else if (localIp.includes('.') && !localIp.match(/[^.\d]/) && ip.family !== 'IPv4') { - return; - } - if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\d]/)) { // if DNS name - hostIp = ip.address; - } else { - if (ip.family === 'IPv4' && localIp.includes('.') && - (Server.ip2int(localIp) & Server.ip2int(ip.netmask)) === (Server.ip2int(ip.address) & Server.ip2int(ip.netmask))) { - hostIp = ip.address; - } else { - hostIp = ip.address; - } - } - }); - }); - - if (!hostIp) { - Object.keys(networkInterfaces).forEach(inter => { - networkInterfaces[inter].forEach(ip => { - if (ip.internal) { - return; - } else if (localIp.includes(':') && ip.family !== 'IPv6') { - return; - } else if (localIp.includes('.') && !localIp.match(/[^.\d]/) && ip.family !== 'IPv4') { - return; - } - if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\d]/)) { // if DNS name - hostIp = ip.address; - } else { - hostIp = ip.address; - } - }); - }); - } - - if (!hostIp) { - Object.keys(networkInterfaces).forEach(inter => { - networkInterfaces[inter].forEach(ip => { - if (ip.internal) { - return; - } - hostIp = ip.address; - }); - }); - } - - return hostIp; - } - - getWebInstances() { - this.props.socket.getAdapterInstances('web') - .then(async list => { - let webInstance; - if (this.props.native.webInstance === '*') { - webInstance = list[0]; - } else { - const instance = this.props.native.webInstance; - webInstance = list.find(obj => obj._id.endsWith(instance)); - } - if (webInstance) { - webInstance.native = webInstance.native || {}; - if (!webInstance.native.bind || webInstance.native.bind === '0.0.0.0') { - // get current host - const host = await this.props.socket.getObject(`system.host.${webInstance.common.host}`); - // get ips on this host - const ip = Server.findNetworkAddressOfHost(host, window.location.hostname); - - // but for now - webInstance.native.bind = ip || window.location.hostname; - } - } - - webInstance && this.setState({ webInstanceHost: `${webInstance.native.bind}:${webInstance.native.port || 8082}`}); - }); - } - - renderMessage() { - if (this.state.message) { - const text = this.state.message.split('\n').map((item, i) =>

{item}

); - - return this.setState({ message: '' })} />; - } else { - return null; - } - } - - static getDerivedStateFromProps(props, state) { - if (state.instanceAlive !== props.instanceAlive) { - return { instanceAlive: props.instanceAlive }; - } else { - return null; - } - } - - onTest() { - const settings = JSON.parse(this.state.editedSettings || this.state.editedSettingsOld); - - let timeout = setTimeout(() => { - timeout = null; - this.setState({ message: 'Timeout', requesting: false }); - }, settings.timeout || this.props.native.defaultTimeout); - - this.setState({ requesting: true, testImg: null }, () => { - this.props.socket.sendTo(`${this.props.adapterName}.${this.props.instance}`, 'test', settings) - .then(result => { - timeout && clearTimeout(timeout); - if (!result || !result.body || result.error) { - let error = (result && result.error) ? result.error : I18n.t('No answer'); - if (typeof error !== 'string') { - error = JSON.stringify(error); - } - // hide password - error = error.replace(/\/\/([^:]+):[^@]+@/, '//$1:xxx@'); - - this.setState({ message: error, requesting: false }); - } else { - this.setState({ testImg: result.body, requesting: false }); - } - }); - }); - } - - onCameraSettingsChanged(settings) { - const oldSettings = JSON.parse(this.state.editedSettingsOld); - // apply changes - settings = Object.assign(oldSettings, settings); - const editedSettings = JSON.stringify(settings); - - if (this.state.editedSettingsOld === editedSettings) { - this.setState({ editChanged: false, editedSettings: null }); - } else if (this.state.editedSettingsOld !== editedSettings) { - this.setState({ editChanged: true, editedSettings }); - } - } - - renderConfigDialog() { - if (this.state.editCam !== false) { - const cam = JSON.parse(this.state.editedSettings || this.state.editedSettingsOld); - let Config = (TYPES[cam.type] || TYPES.url).Config; - - return this.state.editCam !== null && this.setState({ editCam: false, editChanged: false })} - > - {I18n.t('Edit camera %s [%s]', cam.name, cam.type)} - {cam.desc} - -
-
- this.onCameraSettingsChanged(settings)} - encrypt={(value, cb) => - this.props.encrypt(value, cb)} - decrypt={(value, cb) => - this.props.decrypt(value, cb)} - /> -
- { - const settings = JSON.parse(JSON.stringify(cam)); - settings.timeout = e.target.value; - this.onCameraSettingsChanged(settings); - }} - /> -
- { - const settings = JSON.parse(JSON.stringify(cam)); - settings.cacheTimeout = e.target.value; - this.onCameraSettingsChanged(settings); - }} - /> -
- { - const settings = JSON.parse(JSON.stringify(cam)); - settings.addTime = e.target.checked; - this.onCameraSettingsChanged(settings); - }} - /> - } - /> -
- { - const settings = JSON.parse(JSON.stringify(cam)); - settings.title = e.target.value; - this.onCameraSettingsChanged(settings); - }} - /> - - -
-
- - {this.state.testImg ? test : null} - {this.state.requesting ? : null} -
-
-
- - - - -
; - } else { - return null; - } - } - - renderCameraButtons(cam, i) { - return [ - { - let editedSettingsOld = JSON.parse(JSON.stringify(this.props.native.cameras[i])); - editedSettingsOld = JSON.stringify(editedSettingsOld); - this.setState({ editCam: i, editedSettingsOld, editedSettings: null, testImg: null }); - }}> - - , - - i ? - { - const cameras = JSON.parse(JSON.stringify(this.props.native.cameras)); - const cam = cameras[i]; - cameras.splice(i, 1); - cameras.splice(i - 1, 0, cam); - this.props.onChange('cameras', cameras); - }}> - - - : -
 
, - - i !== this.props.native.cameras.length - 1 ? - { - const cameras = JSON.parse(JSON.stringify(this.props.native.cameras)); - const cam = cameras[i]; - cameras.splice(i, 1); - cameras.splice(i + 1, 0, cam); - this.props.onChange('cameras', cameras); - }}> - - - : -
 
, - - { - const cameras = JSON.parse(JSON.stringify(this.props.native.cameras)); - cameras.splice(i, 1); - this.props.onChange('cameras', cameras); - }}> - - - ]; - } - - renderCamera(cam, i) { - const error = this.props.native.cameras.find((c, ii) => c.name === cam.name && ii !== i); - this.props.native.cameras.forEach((cam, i) => { - if (!cam.id) { - cam.id = Date.now() + i; - } - }); - - let description = cam.url || ''; - if (description) { - // remove password - const m = description.match(/^https?:\/\/([^@]+)@/); - if (m && m[1]) { - description = description.replace(`${m[1]}@`, ''); - } - } - - return
-
- { - const cameras = JSON.parse(JSON.stringify(this.props.native.cameras)); - cameras[i].enabled = cameras[i].enabled === undefined ? false : !cameras[i].enabled; - this.props.onChange('cameras', cameras); - }} - /> -
-
- { - const cameras = JSON.parse(JSON.stringify(this.props.native.cameras)); - cameras[i].name = e.target.value.replace(/[^-_\da-zA-Z]/g, '_'); - this.props.onChange('cameras', cameras); - }} - /> -
-
- { - const cameras = JSON.parse(JSON.stringify(this.props.native.cameras)); - cameras[i].desc = e.target.value; - this.props.onChange('cameras', cameras); - }} - /> -
-
- - {I18n.t('Type')} - - -
- {this.renderCameraButtons(cam, i)} - {description ?
{description}
: null} -
; - } - - render() { - return
- { - const cameras = JSON.parse(JSON.stringify(this.props.native.cameras)); - let i = 1; - // eslint-disable-next-line - while (cameras.find(cam => cam.name === `cam${i}`)) { - i++; - } - cameras.push({ name: `cam${i}`, type: 'url', id: Date.now() }); - this.props.onChange('cameras', cameras); - }} - > - - - {this.props.native.cameras ? this.props.native.cameras.map((cam, i) => this.renderCamera(cam, i)) : null} - {this.renderConfigDialog()} - {this.renderMessage()} -
; - } -} - -Server.propTypes = { - decrypt: PropTypes.func.isRequired, - encrypt: PropTypes.func.isRequired, - native: PropTypes.object.isRequired, - instance: PropTypes.number.isRequired, - adapterName: PropTypes.string.isRequired, - onError: PropTypes.func, - onLoad: PropTypes.func, - onChange: PropTypes.func, - socket: PropTypes.object.isRequired, - themeType: PropTypes.string.isRequired, -}; - -export default Server; diff --git a/src/src/Tabs/Options.js b/src/src/Tabs/Options.js deleted file mode 100644 index be5f619..0000000 --- a/src/src/Tabs/Options.js +++ /dev/null @@ -1,310 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - TextField, - Snackbar, - IconButton, - FormControl, - Select, - Button, - MenuItem, - InputLabel, -} from '@mui/material'; - -import { - MdClose as IconClose, - MdCheck as IconTest, -} from 'react-icons/md'; - -import { - I18n, - Logo, - Message, - Error as DialogError, -} from '@iobroker/adapter-react-v5'; - -const styles = { - tab: { - width: '100%', - minHeight: '100%', - }, - bind: { - marginRight: 10, - marginBottom: 20, - minWidth: 200, - }, - port: { - width: 100, - }, - defaultTimeout: { - width: 150, - }, - ffmpegPath: { - width: 450, - }, - link: { - color: 'inherit', - } -}; - -class Options extends Component { - constructor(props) { - super(props); - - this.state = { - showHint: false, - toast: '', - ips: [], - requesting: true, - webInstances: [], - }; - } - - componentDidMount() { - let ips; - this.props.getIpAddresses() - .then(_ips => ips = _ips) - .then(() => this.props.getExtendableInstances()) - .then(webInstances => - this.setState({ requesting: false, ips, webInstances: webInstances.map(item => - item._id.replace('system.adapter.', '')) })); - } - - showError(text) { - this.setState({ errorText: text }); - } - - renderError() { - if (!this.state.errorText) { - return null; - } - return this.setState({ errorText: '' })}/>; - } - - renderToast() { - if (!this.state.toast) { - return null; - } - return this.setState({ toast: '' })} - ContentProps={{ - 'aria-describedby': 'message-id', - }} - message={{this.state.toast}} - action={[ - this.setState({ toast: '' })} - > - - , - ]} - />; - } - - renderHint() { - if (this.state.showHint) { - return this.setState({ showHint: false })} - />; - } else { - return null; - } - } - - onTestFfmpeg() { - let timeout = setTimeout(() => { - timeout = null; - this.setState({ toast: 'Timeout', requesting: false }); - }, 30000); - - this.setState({ requesting: true }, () => { - this.props.socket.sendTo(`${this.props.adapterName}.${this.props.instance}`, 'ffmpeg', { path: this.props.native.ffmpegPath }) - .then(result => { - timeout && clearTimeout(timeout); - if (!result?.version || result.error) { - let error = result?.error ? result.error : I18n.t('No answer'); - if (typeof error !== 'string') { - error = JSON.stringify(error); - } - this.setState({ toast: error, requesting: false }); - } else { - this.setState({ toast: `${I18n.t('Success:')} ${result.version}`, requesting: false }); - } - }); - }); - } - - renderSettings() { - return [ - this.state.ips && this.state.ips.length ? - - {I18n.t('Local IP address')} - : - this.props.onChange('bind', e.target.value)} - />, - this.props.onChange('port', e.target.value)} - />, -
, - this.props.onChange('defaultTimeout', e.target.value)} - />, -
, - - {I18n.t('WEB Instance')} - - , -
, - this.props.onChange('ffmpegPath', e.target.value)} - helperText={I18n.t('Like /usr/bin/ffmpeg')} - />, - , -
, - this.props.onChange('tempPath', e.target.value)} - helperText={I18n.t('If empty then in adapter folder')} - />, -
, - this.props.onChange('defaultCacheTimeout', e.target.value)} - helperText={I18n.t('How often the cameras will be ascked for new snapshot. If 0, then by every request')} - />, -
, - this.props.onChange('dateFormat', e.target.value)} - helperText={{I18n.t('See here:')} https://momentjs.com/} - />, - ]; - } - - renderMessage() { - if (!this.state.messageText) { - return null; - } - return this.setState({ messageText: '' })}>{this.state.messageText} - } - - render() { - return
- this.setState({ errorText: text })} - onLoad={this.props.onLoad} - /> - {this.renderSettings()} -
- {this.renderHint()} - {this.renderToast()} - {this.renderMessage()} - {this.renderError()} - ; - } -} - -Options.propTypes = { - common: PropTypes.object.isRequired, - native: PropTypes.object.isRequired, - instanceAlive: PropTypes.bool, - instance: PropTypes.number.isRequired, - adapterName: PropTypes.string.isRequired, - onError: PropTypes.func, - onConfigError: PropTypes.func, - onLoad: PropTypes.func, - onChange: PropTypes.func, - getIpAddresses: PropTypes.func, - getExtendableInstances: PropTypes.func, - socket: PropTypes.object.isRequired, - theme: PropTypes.object.isRequired, -}; - -export default Options; diff --git a/src/src/Types/RTSPEufy.js b/src/src/Types/RTSPEufy.js deleted file mode 100644 index ab5fa9c..0000000 --- a/src/src/Types/RTSPEufy.js +++ /dev/null @@ -1,133 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - Button, - Switch, - TextField, -} from '@mui/material'; - -import { I18n, SelectID } from '@iobroker/adapter-react-v5'; - -const styles = { - page: { - width: '100%', - }, - ip: { - marginRight: 8, - width: 200, - }, - username: { - marginTop: 16, - marginRight: 8, - width: 200, - }, - password: { - marginTop: 16, - width: 200, - }, - quality: { - marginTop: 16, - width: 200, - }, -}; - -class RTSPEufyConfig extends Component { - constructor(props) { - super(props); - - const state = JSON.parse(JSON.stringify(this.props.settings)); - - // set default values - state.ip = state.ip || ''; - state.oid = state.oid || ''; - state.useOid = state.useOid || false; - state.eusecInstalled = false; - - this.state = state; - } - - componentDidMount() { - // read if eusec adapter is installed - this.props.socket.getAdapterInstances('eusec') - .then(instances => { - if (this.state.useOid && !instances.length) { - this.setState({ useOid: false }); - } else { - this.setState({ eusecInstalled: !!instances.length }); - } - }); - } - - reportSettings() { - this.props.onChange({ - ip: this.state.ip, - oid: this.state.oid, - useOid: this.state.useOid, - }); - } - - renderSelectID() { - if (!this.state.showSelectId) { - return null; - } - return obj._id.startsWith('eusec.') && obj._id.endsWith('.rtsp_stream_url')} - statesOnly={true} - onClose={() => this.setState({ showSelectId: false })} - onOk={oid => { - this.setState({ oid, showSelectId: false }, () => this.reportSettings()); - }} - /> - } - - render() { - return
- {this.renderSelectID()} -
- {this.state.eusecInstalled ?
- {I18n.t('From eusec adapter')} - this.setState({ useOid: !this.state.useOid })} - /> - {I18n.t('By IP address')} -
: null} - - {!this.state.useOid ? this.setState({ ip: e.target.value }, () => this.reportSettings())} - /> :
- this.setState({ oid: e.target.value }, () => this.reportSettings())} - /> - -
} - -
; - } -} - -RTSPEufyConfig.propTypes = { - socket: PropTypes.object, - onChange: PropTypes.func, - native: PropTypes.object, - defaultTimeout: PropTypes.number, - decode: PropTypes.func, - encode: PropTypes.func, - themeType: PropTypes.string, -}; - -export default RTSPEufyConfig; diff --git a/src/src/Types/RTSPHiKam.js b/src/src/Types/RTSPHiKam.js deleted file mode 100644 index ef4e6d0..0000000 --- a/src/src/Types/RTSPHiKam.js +++ /dev/null @@ -1,122 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - MenuItem, - Select, - TextField, -} from '@mui/material'; - -import { I18n } from '@iobroker/adapter-react-v5'; - -const styles = { - page: { - width: '100%', - }, - ip: { - marginRight: 8, - width: 200, - }, - username: { - marginTop: 16, - marginRight: 8, - width: 200, - }, - password: { - marginTop: 16, - width: 200, - }, - quality: { - marginTop: 16, - width: 200, - }, -}; - -class RTSPHiKamConfig extends Component { - constructor(props) { - super(props); - - const state = JSON.parse(JSON.stringify(this.props.settings)); - - // set default values - state.ip = state.ip || ''; - state.password = state.password || ''; - state.username = state.username === undefined ? 'admin' : (state.username || ''); - state.quality = state.quality || 'low'; - - this.state = state; - } - - static getRtsp() { - return true; // this camera can be used in RTSP snapshot - } - - componentDidMount() { - this.props.decrypt(this.state.password, - password => this.setState({ password })); - } - - reportSettings() { - this.props.encrypt(this.state.password, password => { - this.props.onChange({ - ip: this.state.ip, - username: this.state.username, - password, - quality: this.state.quality, - }); - }); - } - - render() { - return
-
- this.setState({ ip: e.target.value }, () => this.reportSettings())} - /> -
- this.setState({ username: e.target.value }, () => this.reportSettings())} - /> - this.setState({ password: e.target.value }, () => this.reportSettings())} - /> -
- - -
; - } -} - -RTSPHiKamConfig.propTypes = { - onChange: PropTypes.func, - native: PropTypes.object, - defaultTimeout: PropTypes.number, - decode: PropTypes.func, - encode: PropTypes.func, -}; - -export default RTSPHiKamConfig; diff --git a/src/src/Types/RTSPImage.js b/src/src/Types/RTSPImage.js deleted file mode 100644 index 1109155..0000000 --- a/src/src/Types/RTSPImage.js +++ /dev/null @@ -1,264 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - TextField, - Checkbox, - FormControlLabel, - Select, - MenuItem, - FormControl, - InputLabel, -} from '@mui/material'; - -import { I18n } from '@iobroker/adapter-react-v5'; - -const styles = { - page: { - width: '100%', - }, - ip: { - marginRight: 8, - width: 200, - }, - port: { - marginRight: 8, - width: 200, - }, - protocol: { - width: 70, - }, - username: { - marginTop: 16, - marginRight: 8, - width: 200, - }, - password: { - marginTop: 16, - width: 200, - }, - urlPath: { - marginTop: 16, - marginBotton: `24px !important`, - width: 408, - }, - width: { - marginTop: 16, - marginRight: 8, - width: 90, - }, - height: { - marginTop: 16, - width: 90, - }, - expertMode: { - marginTop: 16, - }, - suffix: { - marginTop: 16, - width: 200, - }, - prefix: { - marginTop: 16, - marginRight: 8, - width: 200, - }, - ffmpgDiv: { - marginTop: 16, - }, - ffmpgLabel: { - fontSize: 'smaller', - fontWeight: 'bold', - }, - ffmpgCommand: { - fontFamily: 'monospace', - fontSize: 'smaller', - }, -}; - -class RTSPImageConfig extends Component { - constructor(props) { - super(props); - - const state = JSON.parse(JSON.stringify(this.props.settings)); - - // set default values - state.ip = state.ip || ''; - state.port = state.port || '554'; - state.urlPath = state.urlPath || ''; - state.password = state.password || ''; - state.username = state.username === undefined ? 'admin' : (state.username || ''); - state.url = `rtsp://${state.username ? `${state.username}:***@` : ''}${state.ip}:${state.port}${state.urlPath ? (state.urlPath.startsWith('/') ? state.urlPath : `/${state.urlPath}`) : ''}`; - state.originalWidth = state.originalWidth || ''; - state.originalHeight = state.originalHeight || ''; - state.prefix = state.prefix || ''; - state.suffix = state.suffix || ''; - state.protocol = state.protocol || 'udp'; - - this.state = state; - } - - static getRtsp() { - return true; // this camera can be used in RTSP snapshot - } - - componentDidMount() { - this.props.decrypt(this.state.password, - password => this.setState({ password })); - } - - reportSettings() { - this.props.encrypt(this.state.password, password => { - this.props.onChange({ - ip: this.state.ip, - username: this.state.username, - password, - port: this.state.port, - urlPath: this.state.urlPath, - prefix: this.state.prefix, - suffix: this.state.suffix, - protocol: this.state.protocol, - originalWidth: this.state.originalWidth, - originalHeight: this.state.originalHeight, - }); - }); - } - - buildCommand(options) { - const parameters = ['-y']; - options.prefix && parameters.push(options.prefix); - parameters.push('-rtsp_transport'); - parameters.push(options.protocol || 'udp'); - parameters.push('-i'); - parameters.push(`rtsp://${options.username ? options.username + (options.password ? ':***' : '') : ''}@${options.ip}:${options.port || 554}${options.urlPath ? (options.urlPath.startsWith('/') ? options.urlPath : `/${options.urlPath}`) : ''}`); - parameters.push('-loglevel'); - parameters.push('error'); - if (options.originalWidth && options.originalHeight) { - parameters.push(`scale=${options.originalWidth}:${options.originalHeight}`); - } - parameters.push('-vframes'); - parameters.push('1'); - options.suffix && parameters.push(options.suffix); - parameters.push(`${this.props.native.tempPath ? `${this.props.native.tempPath}/` : ''}${options.ip.replace(/[.:]/g, '_')}.jpg`); - return parameters; - } - - render() { - return
-
- this.setState({ ip: e.target.value }, () => this.reportSettings())} - /> - this.setState({ port: e.target.value }, () => this.reportSettings())} - /> - - {I18n.t('Protocol')} - - -
- this.setState({ urlPath: e.target.value }, () => this.reportSettings())} - helperText={this.state.url} - /> -
- this.setState({ username: e.target.value }, () => this.reportSettings())} - /> - this.setState({ password: e.target.value }, () => this.reportSettings())} - /> -
- this.setState({ expertMode: e.target.checked })} - />} - label={I18n.t('Expert settings')} - /> - {this.state.expertMode ?
: null} - {this.state.expertMode ? this.setState({ originalWidth: e.target.value }, () => this.reportSettings())} - /> : null} - {this.state.expertMode ?
x
: null} - {this.state.expertMode ? this.setState({ originalHeight: e.target.value }, () => this.reportSettings())} - /> : null} - {this.state.expertMode ?
: null} - {this.state.expertMode ? this.setState({ prefix: e.target.value }, () => this.reportSettings())} - /> : null} - {this.state.expertMode ? this.setState({ suffix: e.target.value }, () => this.reportSettings())} - /> : null} - {this.state.expertMode ?
: null} - {this.state.expertMode ?
: null} - {this.state.expertMode ?
- {I18n.t('ffmpeg command')}: ffmpeg {this.buildCommand(this.state).join(' ')} -
: null} - -
; - } -} - -RTSPImageConfig.propTypes = { - onChange: PropTypes.func, - native: PropTypes.object, - defaultTimeout: PropTypes.number, - decode: PropTypes.func, - encode: PropTypes.func, -}; - -export default RTSPImageConfig; diff --git a/src/src/Types/RTSPReolinkE1.js b/src/src/Types/RTSPReolinkE1.js deleted file mode 100644 index 11ec213..0000000 --- a/src/src/Types/RTSPReolinkE1.js +++ /dev/null @@ -1,122 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - MenuItem, - Select, - TextField, -} from '@mui/material'; - -import { I18n } from '@iobroker/adapter-react-v5'; - -const styles = { - page: { - width: '100%', - }, - ip: { - marginRight: 8, - width: 200, - }, - username: { - marginTop: 16, - marginRight: 8, - width: 200, - }, - password: { - marginTop: 16, - width: 200, - }, - quality: { - marginTop: 16, - width: 200, - }, -}; - -class RTSPReolinkE1Config extends Component { - constructor(props) { - super(props); - - const state = JSON.parse(JSON.stringify(this.props.settings)); - - // set default values - state.ip = state.ip || ''; - state.password = state.password || ''; - state.username = state.username === undefined ? 'admin' : (state.username || ''); - state.quality = state.quality || 'low'; - - this.state = state; - } - - static getRtsp() { - return true; // this camera can be used in RTSP snapshot - } - - componentDidMount() { - this.props.decrypt(this.state.password, - password => this.setState({ password })); - } - - reportSettings() { - this.props.encrypt(this.state.password, password => { - this.props.onChange({ - ip: this.state.ip, - username: this.state.username, - password, - quality: this.state.quality, - }); - }); - } - - render() { - return
-
- this.setState({ ip: e.target.value }, () => this.reportSettings())} - /> -
- this.setState({ username: e.target.value }, () => this.reportSettings())} - /> - this.setState({ password: e.target.value }, () => this.reportSettings())} - /> -
- - -
; - } -} - -RTSPReolinkE1Config.propTypes = { - onChange: PropTypes.func, - native: PropTypes.object, - defaultTimeout: PropTypes.number, - decode: PropTypes.func, - encode: PropTypes.func, -}; - -export default RTSPReolinkE1Config; diff --git a/src/src/Types/URLBasicAuthImage.js b/src/src/Types/URLBasicAuthImage.js deleted file mode 100644 index 7673f2e..0000000 --- a/src/src/Types/URLBasicAuthImage.js +++ /dev/null @@ -1,90 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - TextField, -} from '@mui/material'; - -import { I18n } from '@iobroker/adapter-react-v5'; - -const styles = { - page: { - width: '100%', - }, - url: { - width: '100%', - }, -}; - -class Config extends Component { - constructor(props) { - super(props); - - const state = JSON.parse(JSON.stringify(this.props.settings)); - - // set default values - state.url = state.url || ''; - state.password = state.password || ''; - state.username = state.username || ''; - - this.state = state; - } - - componentDidMount() { - this.props.decrypt(this.state.password, - password => this.setState({ password })); - } - - reportSettings() { - this.props.encrypt(this.state.password, password => { - this.props.onChange({ - url: this.state.url, - username: this.state.username, - password, - }); - }); - } - - render() { - return
- this.setState({ url: e.target.value }, () => this.reportSettings())} - /> -
- this.setState({ username: e.target.value }, () => this.reportSettings())} - /> -
- this.setState({ password: e.target.value }, () => this.reportSettings())} - /> -
; - } -} - -Config.propTypes = { - onChange: PropTypes.func, - defaultTimeout: PropTypes.number, - decode: PropTypes.func, - encode: PropTypes.func, -}; - -export default Config; diff --git a/src/src/Types/URLImage.js b/src/src/Types/URLImage.js deleted file mode 100644 index 5bc50f7..0000000 --- a/src/src/Types/URLImage.js +++ /dev/null @@ -1,57 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - TextField, -} from '@mui/material'; - -import { I18n } from '@iobroker/adapter-react-v5'; - -const styles = { - page: { - width: '100%', - }, - url: { - width: '100%', - }, -}; - -class Config extends Component { - constructor(props) { - super(props); - - const state = JSON.parse(JSON.stringify(this.props.settings)); - // set default values - state.url = state.url || ''; - - this.state = state; - } - - reportSettings() { - this.props.onChange({ - url: this.state.url, - }); - } - - render() { - return
- this.setState({ url: e.target.value }, () => - this.reportSettings())} - /> -
; - } -} - -Config.propTypes = { - onChange: PropTypes.func.isRequired, - defaultTimeout: PropTypes.number, - settings: PropTypes.object.isRequired, -}; - -export default Config; diff --git a/src/src/serviceWorker.js b/src/src/serviceWorker.js deleted file mode 100644 index 2283ff9..0000000 --- a/src/src/serviceWorker.js +++ /dev/null @@ -1,135 +0,0 @@ -// This optional code is used to register a service worker. -// register() is not called by default. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on subsequent visits to a page, after all the -// existing tabs open on the page have been closed, since previously cached -// resources are updated in the background. - -// To learn more about the benefits of this model and instructions on how to -// opt-in, read http://bit.ly/CRA-PWA - -const isLocalhost = Boolean( - window.location.hostname === 'localhost' || - // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || - // 127.0.0.1/8 is considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ - ) -); - -export function register(config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return; - } - - window.addEventListener('load', () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; - - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config); - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit http://bit.ly/CRA-PWA' - ); - }); - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config); - } - }); - } -} - -function registerValidSW(swUrl, config) { - navigator.serviceWorker - .register(swUrl) - .then(registration => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' - ); - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch(error => { - console.error('Error during service worker registration:', error); - }); -} - -function checkValidServiceWorker(swUrl, config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl) - .then(response => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then(registration => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } - }) - .catch(() => { - console.log( - 'No internet connection found. App is running in offline mode.' - ); - }); -} - -export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then(registration => { - registration.unregister(); - }); - } -} diff --git a/tasks.js b/tasks.js new file mode 100644 index 0000000..ba7126f --- /dev/null +++ b/tasks.js @@ -0,0 +1,127 @@ +/** + * Copyright 2018-2025 bluefox + * + * MIT License + * + **/ +'use strict'; + +const fs = require('fs'); +const adapterName = require('./package.json').name.replace('iobroker.', ''); +const buildHelper = require('@iobroker/vis-2-widgets-react-dev/buildHelper'); +const { deleteFoldersRecursive, buildReact, npmInstall, copyFiles, patchHtmlFile } = require('@iobroker/build-tools'); +const { copyFileSync } = require('node:fs'); + +async function copyAllFiles() { + deleteFoldersRecursive(`${__dirname}/admin`); + copyFiles(['src-admin/build/**/*', '!src-admin/build/index.html', 'admin-config/*'], 'admin/'); + + await patchHtmlFile(`${__dirname}/src-admin/build/index.html`); + copyFileSync(`${__dirname}/src-admin/build/index.html`, `${__dirname}/admin/index_m.html`); +} + +function clean() { + deleteFoldersRecursive(`${__dirname}/admin`); + deleteFoldersRecursive(`${__dirname}/src-admin/build`); +} + +function widgetsClean() { + deleteFoldersRecursive(`${__dirname}/src-widgets/build`); + deleteFoldersRecursive(`${__dirname}/widgets`); +} + +async function widgetsCopyAllFiles() { + copyFiles([`${__dirname}/src-widgets/build/*.js`], `widgets/${adapterName}`); + copyFiles([`${__dirname}/src-widgets/build/img/*`], `widgets/${adapterName}/img`); + copyFiles([`${__dirname}/src-widgets/build/*.map`], `widgets/${adapterName}`); + + const ignore = buildHelper.ignoreFiles(`${__dirname}/src-widgets/`); + const copy = buildHelper.copyFiles(`${__dirname}/src-widgets/`); + + copyFiles([ + `${__dirname}/src-widgets/build/static/**/*`, + ...ignore, + ], `widgets/${adapterName}/static`); + + //copyFiles(copy, `widgets/${adapterName}/static/js`); + copyFiles([`${__dirname}/src-widgets/src/i18n/*.json`], `widgets/${adapterName}/i18n`); + + await new Promise(resolve => + setTimeout(() => { + if ( + fs.existsSync(`widgets/${adapterName}/static/media`) && + !fs.readdirSync(`widgets/${adapterName}/static/media`).length + ) { + fs.rmdirSync(`widgets/${adapterName}/static/media`); + } + resolve(null); + }, 500), + ); +} + +if (process.argv.includes('--0-clean')) { + clean(); +} else if (process.argv.includes('--1-npm')) { + if (!fs.existsSync(`${__dirname}/src-admin/node_modules`)) { + npmInstall('src-admin').catch(e => { + console.error(`Cannot run npm: ${e}`); + process.exit(2); + }); + } +} else if (process.argv.includes('--2-build')) { + buildReact('src-admin', { rootDir: 'src-admin', tsc: true, vite: true }).catch(e => { + console.error(`Cannot build: ${e}`); + process.exit(2); + }); +} else if (process.argv.includes('--3-copy')) { + copyAllFiles().catch(e => { + console.error(`Cannot copy: ${e}`); + process.exit(2); + }); +} else if (process.argv.includes('--build-admin')) { + clean(); + npmInstall('src-admin') + .then(() => buildReact('src-admin', { rootDir: 'src-admin', tsc: true, vite: true })) + .then(() => copyAllFiles()); +} else if (process.argv.includes('--widget-0-clean')) { + widgetsClean(); +} else if (process.argv.includes('--widget-1-npm')) { + if (!fs.existsSync(`${__dirname}/src-widgets/node_modules`)) { + npmInstall('src-widgets').catch(e => { + console.error(`Cannot run npm: ${e}`); + process.exit(2); + }); + } +} else if (process.argv.includes('--widget-2-build')) { + buildReact(`${__dirname}/src-widgets`, { rootDir: `${__dirname}/src-widgets`, craco: true }).catch(e => { + console.error(`Cannot build: ${e}`); + process.exit(2); + }); +} else if (process.argv.includes('--widget-3-copy')) { + widgetsCopyAllFiles().catch(e => { + console.error(`Cannot copy: ${e}`); + process.exit(2); + }); +} else if (process.argv.includes('--widget-build')) { + widgetsClean(); + npmInstall('src-widgets') + .then(() => buildReact(`${__dirname}/src-widgets`, { rootDir: `${__dirname}/src-widgets`, craco: true })) + .then(() => widgetsCopyAllFiles()) + .catch(e => { + console.error(`Cannot build: ${e}`); + process.exit(2); + }); +} else { + clean(); + npmInstall('src-admin') + .then(() => buildReact('src-admin', { rootDir: 'src-admin', tsc: true, vite: true })) + .then(() => copyAllFiles()) + .then(() => widgetsClean()) + .then(() => npmInstall('src-widgets')) + .then(() => buildReact(`${__dirname}/src-widgets`, { rootDir: `${__dirname}/src-widgets`, craco: true })) + .then(() => widgetsCopyAllFiles()) + .catch(e => { + console.error(`Cannot build: ${e}`); + process.exit(2); + }); +} diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..5f8b860 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": false, + "checkJs": false, + "noEmit": false, + "declaration": false, + "types": ["@iobroker/types"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/matter/ControllerNode.ts", "src/**/*.test.ts"] +} diff --git a/tsconfig.json b/tsconfig.json index a5a8004..070a1f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,7 +24,7 @@ // "noUnusedLocals": true, // "noUnusedParameters": true, - // Consider targetting es2017 or higher if you require the new NodeJS 8+ features + // Consider targeting es2017 or higher if you require the new Node.js 8+ features "target": "es2015" }, @@ -35,7 +35,7 @@ "exclude": [ "node_modules/**", "admin/**", - "src/**", + "src-admin/**", "src-widgets/**" ] } \ No newline at end of file diff --git a/widgets/cameras/customWidgets.js b/widgets/cameras/customWidgets.js index 38fc6b3..79f42ff 100644 --- a/widgets/cameras/customWidgets.js +++ b/widgets/cameras/customWidgets.js @@ -1,2 +1,2 @@ -var vis2CameraWidgets;!function(){"use strict";var e={1927:function(e,r,_){var n={"./RtspCamera":function(){return Promise.all([_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_prop-types_prop-types"),_.e("webpack_sharing_consume_default_mui_material_mui_material"),_.e("webpack_sharing_consume_default_mui_icons-material_mui_icons-material"),_.e("webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev"),_.e("src_RtspCamera_jsx")]).then((function(){return function(){return _(57003)}}))},"./SnapshotCamera":function(){return Promise.all([_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_prop-types_prop-types"),_.e("webpack_sharing_consume_default_mui_material_mui_material"),_.e("webpack_sharing_consume_default_mui_icons-material_mui_icons-material"),_.e("webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev"),_.e("src_SnapshotCamera_jsx")]).then((function(){return function(){return _(54779)}}))},"./translations":function(){return _.e("src_translations_js").then((function(){return function(){return _(43188)}}))}},t=function(e,r){return _.R=r,r=_.o(n,e)?n[e]():Promise.resolve().then((function(){throw new Error('Module "'+e+'" does not exist in container.')})),_.R=void 0,r},s=function(e,r){if(_.S){var n="default",t=_.S[n];if(t&&t!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return _.S[n]=e,_.I(n,r)}};_.d(r,{get:function(){return t},init:function(){return s}})}},r={};function _(n){var t=r[n];if(void 0!==t)return t.exports;var s=r[n]={id:n,loaded:!1,exports:{}};return e[n].call(s.exports,s,s.exports,_),s.loaded=!0,s.exports}_.m=e,_.c=r,_.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return _.d(r,{a:r}),r},_.d=function(e,r){for(var n in r)_.o(r,n)&&!_.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},_.f={},_.e=function(e){return Promise.all(Object.keys(_.f).reduce((function(r,n){return _.f[n](e,r),r}),[]))},_.u=function(e){return"static/js/"+e+"."+{"vendors-node_modules_iobroker_adapter-react-v5_GenericApp_js-node_modules_react_jsx-runtime_js":"3298ab89","vendors-node_modules_iobroker_adapter-react-v5_assets_devices_parseNames_js-node_modules_iobr-c9c0ef":"77eb913b",webpack_sharing_consume_default_react_react:"b0a6443e","webpack_sharing_consume_default_prop-types_prop-types":"aca21ded",webpack_sharing_consume_default_mui_material_mui_material:"d6c67c49","webpack_sharing_consume_default_mui_icons-material_mui_icons-material":"aab8c41f",webpack_sharing_consume_default_mui_material_styles_mui_material_styles:"bf590549","node_modules_iobroker_adapter-react-v5_assets_devices_sync_recursive_-node_modules_iobroker_a-81710b":"b048f7c4","vendors-node_modules_iobroker_vis-2-widgets-react-dev_index_jsx":"d398aa7b","webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5":"a3800538","vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24":"2462ed59","vendors-node_modules_mui_material_styles_styled_js":"d94bd5f4","vendors-node_modules_mui_icons-material_esm_index_js-node_modules_mui_material_colors_blue_js-51d778":"f5c79ca0",webpack_sharing_consume_default_clsx_clsx:"7d07010b","node_modules_react_jsx-runtime_js":"6adda16a","vendors-node_modules_mui_material_styles_index_js":"7a09f152",webpack_sharing_consume_default_mui_system_mui_system:"22305f87","node_modules_mui_material_colors_blue_js-node_modules_mui_material_colors_common_js-node_modu-f64287":"f8889a35","vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-0a6db2":"59ecaade","vendors-node_modules_mui_material_index_js-node_modules_babel_runtime_helpers_objectWithoutPr-18965d":"bc40f7d6","webpack_sharing_consume_default_react-dom_react-dom":"fb052048","vendors-node_modules_mui_system_esm_index_js":"ea5121d7","node_modules_mui_system_esm_useThemeProps_useThemeProps_js-node_modules_react_jsx-runtime_js":"2735adac",node_modules_clsx_dist_clsx_mjs:"23036dbb","node_modules_prop-types_index_js":"72e247dc","node_modules_react-dom_client_js":"5480faae","vendors-node_modules_react-dom_index_js":"afe11875",node_modules_react_index_js:"0b2915c6","webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev":"a0515197",src_RtspCamera_jsx:"db3a0929",src_SnapshotCamera_jsx:"bac7a9b6",src_translations_js:"943281eb","node_modules_iobroker_adapter-react-v5_assets_devices_sync_recursive_-node_modules_iobroker_a-673682":"becacf29"}[e]+".chunk.js"},_.miniCssF=function(e){},_.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}(),_.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},function(){var e={},r="iobroker.vis-2-widgets-camera:";_.l=function(n,t,s,o){if(e[n])e[n].push(t);else{var a,u;if(void 0!==s)for(var i=document.getElementsByTagName("script"),d=0;d=0)){if(t.push(s),e[n])return e[n];_.o(_.S,n)||(_.S[n]={});var o=_.S[n],a="iobroker.vis-2-widgets-camera",u=function(e,r,_,n){var t=o[e]=o[e]||{},s=t[r];(!s||!s.loaded&&(!n!=!s.eager?n:a>s.from))&&(t[r]={get:_,from:a,eager:!!n})},i=[];if("default"===n)u("@iobroker/adapter-react-v5","*",(function(){return Promise.all([_.e("vendors-node_modules_iobroker_adapter-react-v5_GenericApp_js-node_modules_react_jsx-runtime_js"),_.e("vendors-node_modules_iobroker_adapter-react-v5_assets_devices_parseNames_js-node_modules_iobr-c9c0ef"),_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_prop-types_prop-types"),_.e("webpack_sharing_consume_default_mui_material_mui_material"),_.e("webpack_sharing_consume_default_mui_icons-material_mui_icons-material"),_.e("webpack_sharing_consume_default_mui_material_styles_mui_material_styles"),_.e("node_modules_iobroker_adapter-react-v5_assets_devices_sync_recursive_-node_modules_iobroker_a-81710b")]).then((function(){return function(){return _(26079)}}))})),u("@iobroker/vis-2-widgets-react-dev","*",(function(){return Promise.all([_.e("vendors-node_modules_iobroker_vis-2-widgets-react-dev_index_jsx"),_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_mui_material_mui_material"),_.e("webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5")]).then((function(){return function(){return _(25582)}}))})),u("@mui/icons-material","*",(function(){return Promise.all([_.e("vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24"),_.e("vendors-node_modules_mui_material_styles_styled_js"),_.e("vendors-node_modules_mui_icons-material_esm_index_js-node_modules_mui_material_colors_blue_js-51d778"),_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_prop-types_prop-types"),_.e("webpack_sharing_consume_default_clsx_clsx"),_.e("node_modules_react_jsx-runtime_js")]).then((function(){return function(){return _(28675)}}))})),u("@mui/material/styles","*",(function(){return Promise.all([_.e("vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24"),_.e("vendors-node_modules_mui_material_styles_styled_js"),_.e("vendors-node_modules_mui_material_styles_index_js"),_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_prop-types_prop-types"),_.e("webpack_sharing_consume_default_mui_system_mui_system"),_.e("node_modules_mui_material_colors_blue_js-node_modules_mui_material_colors_common_js-node_modu-f64287")]).then((function(){return function(){return _(93059)}}))})),u("@mui/material","*",(function(){return Promise.all([_.e("vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24"),_.e("vendors-node_modules_mui_material_styles_styled_js"),_.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-0a6db2"),_.e("vendors-node_modules_mui_material_styles_index_js"),_.e("vendors-node_modules_mui_material_index_js-node_modules_babel_runtime_helpers_objectWithoutPr-18965d"),_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_prop-types_prop-types"),_.e("webpack_sharing_consume_default_clsx_clsx"),_.e("webpack_sharing_consume_default_mui_system_mui_system"),_.e("webpack_sharing_consume_default_react-dom_react-dom")]).then((function(){return function(){return _(76960)}}))})),u("@mui/system","*",(function(){return Promise.all([_.e("vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24"),_.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-0a6db2"),_.e("vendors-node_modules_mui_system_esm_index_js"),_.e("webpack_sharing_consume_default_react_react"),_.e("webpack_sharing_consume_default_prop-types_prop-types"),_.e("webpack_sharing_consume_default_clsx_clsx"),_.e("node_modules_mui_system_esm_useThemeProps_useThemeProps_js-node_modules_react_jsx-runtime_js")]).then((function(){return function(){return _(5937)}}))})),u("clsx","*",(function(){return _.e("node_modules_clsx_dist_clsx_mjs").then((function(){return function(){return _(63733)}}))})),u("prop-types","*",(function(){return _.e("node_modules_prop-types_index_js").then((function(){return function(){return _(52007)}}))})),u("react-dom/client","*",(function(){return Promise.all([_.e("webpack_sharing_consume_default_react-dom_react-dom"),_.e("node_modules_react-dom_client_js")]).then((function(){return function(){return _(1250)}}))})),u("react-dom","*",(function(){return Promise.all([_.e("vendors-node_modules_react-dom_index_js"),_.e("webpack_sharing_consume_default_react_react")]).then((function(){return function(){return _(54164)}}))})),u("react","*",(function(){return _.e("node_modules_react_index_js").then((function(){return function(){return _(72791)}}))}));return i.length?e[n]=Promise.all(i).then((function(){return e[n]=1})):e[n]=1}}}(),function(){var e;_.g.importScripts&&(e=_.g.location+"");var r=_.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var n=r.getElementsByTagName("script");if(n.length)for(var t=n.length-1;t>-1&&!e;)e=n[t--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),_.p=e}(),function(){var e=function(e){var r=function(e){return e.split(".").map((function(e){return+e==e?+e:e}))},_=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=_[1]?r(_[1]):[];return _[2]&&(n.length++,n.push.apply(n,r(_[2]))),_[3]&&(n.push([]),n.push.apply(n,r(_[3]))),n},r=function(r,_){r=e(r),_=e(_);for(var n=0;;){if(n>=r.length)return n<_.length&&"u"!=(typeof _[n])[0];var t=r[n],s=(typeof t)[0];if(n>=_.length)return"u"==s;var o=_[n],a=(typeof o)[0];if(s!=a)return"o"==s&&"n"==a||"s"==a||"u"==s;if("o"!=s&&"u"!=s&&t!=o)return t=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var t=1,s=1;s0?".":"")+(t=2,a);return _}var o=[];for(s=1;s=_.length||"o"==(d=(typeof(i=_[o]))[0]))return!u||("u"==c?a>n&&!s:""==c!=s);if("u"==d){if(!u||"u"!=c)return!1}else if(u)if(c==d)if(a<=n){if(i!=r[a])return!1}else{if(s?i>r[a]:i{"use strict";var e={7434:(e,_,r)=>{var o={"./RtspCamera":()=>Promise.all([r.e("webpack_sharing_consume_default_react_react"),r.e("webpack_sharing_consume_default_prop-types_prop-types"),r.e("webpack_sharing_consume_default_mui_material_mui_material"),r.e("webpack_sharing_consume_default_mui_icons-material_mui_icons-material"),r.e("webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev"),r.e("src_RtspCamera_jsx")]).then((()=>()=>r(3184))),"./SnapshotCamera":()=>Promise.all([r.e("webpack_sharing_consume_default_react_react"),r.e("webpack_sharing_consume_default_prop-types_prop-types"),r.e("webpack_sharing_consume_default_mui_material_mui_material"),r.e("webpack_sharing_consume_default_mui_icons-material_mui_icons-material"),r.e("webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev"),r.e("src_SnapshotCamera_jsx")]).then((()=>()=>r(7855))),"./translations":()=>r.e("src_translations_js").then((()=>()=>r(5850)))},s=(e,_)=>(r.R=_,_=r.o(o,e)?o[e]():Promise.resolve().then((()=>{throw new Error('Module "'+e+'" does not exist in container.')})),r.R=void 0,_),a=(e,_)=>{if(r.S){var o="default",s=r.S[o];if(s&&s!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return r.S[o]=e,r.I(o,_)}};r.d(_,{get:()=>s,init:()=>a})}},_={};function r(o){var s=_[o];if(void 0!==s)return s.exports;var a=_[o]={id:o,loaded:!1,exports:{}};return e[o].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=e,r.c=_,r.n=e=>{var _=e&&e.__esModule?()=>e.default:()=>e;return r.d(_,{a:_}),_},r.d=(e,_)=>{for(var o in _)r.o(_,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:_[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((_,o)=>(r.f[o](e,_),_)),[])),r.u=e=>"static/js/"+e+"."+{"node_modules_iobroker_adapter-react-v5_i18n_de_json":"87ff3ac7","node_modules_iobroker_adapter-react-v5_i18n_en_json":"13a4292d","node_modules_iobroker_adapter-react-v5_i18n_es_json":"3c7029cb","vendors-node_modules_iobroker_adapter-react-v5_i18n_fr_json":"49fd8bc0","vendors-node_modules_iobroker_adapter-react-v5_i18n_it_json":"32a0ec6b","node_modules_iobroker_adapter-react-v5_i18n_nl_json":"a221b4da","node_modules_iobroker_adapter-react-v5_i18n_pl_json":"fc2262b1","node_modules_iobroker_adapter-react-v5_i18n_pt_json":"9a5826b2","node_modules_iobroker_adapter-react-v5_i18n_ru_json":"3a32c677","node_modules_iobroker_adapter-react-v5_i18n_zh-cn_json":"f1a49e94","vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be":"a1e48aa4","vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be":"4d02f653","vendors-node_modules_iobroker_adapter-react-v5_build_index_js":"c3b244f8","node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e0":"602aa2f7","vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83":"8344849e","vendors-node_modules_mui_icons-material_esm_index_js":"8738fdfc","vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764":"fcd25086","vendors-node_modules_mui_material_index_js":"6c911353","vendors-node_modules_mui_system_esm_index_js":"5cd25769","node_modules_prop-types_index_js":"94bc55cd","node_modules_react-dom_client_js":"26e3ee66","vendors-node_modules_react-dom_index_js":"e9feb302",node_modules_react_index_js:"2c46f430",src_RtspCamera_jsx:"f981189f",src_SnapshotCamera_jsx:"5cd2e2f2",src_translations_js:"00eec871","node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e1":"2279c251"}[e]+".chunk.js",r.miniCssF=e=>{},r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}(),r.o=(e,_)=>Object.prototype.hasOwnProperty.call(e,_),(()=>{var e={},_="iobroker.vis-2-widgets-camera:";r.l=(o,s,a,t)=>{if(e[o])e[o].push(s);else{var i,n;if(void 0!==a)for(var d=document.getElementsByTagName("script"),m=0;m{i.onerror=i.onload=null,clearTimeout(c);var s=e[o];if(delete e[o],i.parentNode&&i.parentNode.removeChild(i),s&&s.forEach((e=>e(r))),_)return _(r)},c=setTimeout(l.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=l.bind(null,i.onerror),i.onload=l.bind(null,i.onload),n&&document.head.appendChild(i)}}})(),r.r=e=>{"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{r.S={};var e={},_={};r.I=(o,s)=>{s||(s=[]);var a=_[o];if(a||(a=_[o]={}),!(s.indexOf(a)>=0)){if(s.push(a),e[o])return e[o];r.o(r.S,o)||(r.S[o]={});var t=r.S[o],i="iobroker.vis-2-widgets-camera",n=(e,_,r,o)=>{var s=t[e]=t[e]||{},a=s[_];(!a||!a.loaded&&(!o!=!a.eager?o:i>a.from))&&(s[_]={get:r,from:i,eager:!!o})},d=[];if("default"===o)n("@iobroker/adapter-react-v5/i18n/de.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_de_json").then((()=>()=>r(3123))))),n("@iobroker/adapter-react-v5/i18n/en.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_en_json").then((()=>()=>r(6603))))),n("@iobroker/adapter-react-v5/i18n/es.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_es_json").then((()=>()=>r(5148))))),n("@iobroker/adapter-react-v5/i18n/fr.json","*",(()=>r.e("vendors-node_modules_iobroker_adapter-react-v5_i18n_fr_json").then((()=>()=>r(4176))))),n("@iobroker/adapter-react-v5/i18n/it.json","*",(()=>r.e("vendors-node_modules_iobroker_adapter-react-v5_i18n_it_json").then((()=>()=>r(7801))))),n("@iobroker/adapter-react-v5/i18n/nl.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_nl_json").then((()=>()=>r(9646))))),n("@iobroker/adapter-react-v5/i18n/pl.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_pl_json").then((()=>()=>r(1356))))),n("@iobroker/adapter-react-v5/i18n/pt.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_pt_json").then((()=>()=>r(324))))),n("@iobroker/adapter-react-v5/i18n/ru.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_ru_json").then((()=>()=>r(7629))))),n("@iobroker/adapter-react-v5/i18n/zh-cn.json","*",(()=>r.e("node_modules_iobroker_adapter-react-v5_i18n_zh-cn_json").then((()=>()=>r(9156))))),n("@iobroker/adapter-react-v5","*",(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be"),r.e("vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be"),r.e("vendors-node_modules_iobroker_adapter-react-v5_build_index_js"),r.e("webpack_sharing_consume_default_react_react"),r.e("webpack_sharing_consume_default_prop-types_prop-types"),r.e("webpack_sharing_consume_default_mui_system_mui_system"),r.e("webpack_sharing_consume_default_mui_material_mui_material"),r.e("webpack_sharing_consume_default_mui_icons-material_mui_icons-material")]).then((()=>()=>r(8475))))),n("@iobroker/vis-2-widgets-react-dev","*",(()=>Promise.all([r.e("webpack_sharing_consume_default_react_react"),r.e("webpack_sharing_consume_default_mui_material_mui_material"),r.e("webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5"),r.e("node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e0")]).then((()=>()=>r(8835))))),n("@mui/icons-material","*",(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be"),r.e("vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be"),r.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83"),r.e("vendors-node_modules_mui_icons-material_esm_index_js"),r.e("webpack_sharing_consume_default_react_react"),r.e("webpack_sharing_consume_default_prop-types_prop-types"),r.e("webpack_sharing_consume_default_mui_system_mui_system")]).then((()=>()=>r(6157))))),n("@mui/material","*",(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be"),r.e("vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be"),r.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83"),r.e("vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764"),r.e("vendors-node_modules_mui_material_index_js"),r.e("webpack_sharing_consume_default_react_react"),r.e("webpack_sharing_consume_default_prop-types_prop-types"),r.e("webpack_sharing_consume_default_mui_system_mui_system"),r.e("webpack_sharing_consume_default_react-dom_react-dom")]).then((()=>()=>r(8705))))),n("@mui/system","*",(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be"),r.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83"),r.e("vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764"),r.e("vendors-node_modules_mui_system_esm_index_js"),r.e("webpack_sharing_consume_default_react_react"),r.e("webpack_sharing_consume_default_prop-types_prop-types")]).then((()=>()=>r(1774))))),n("prop-types","*",(()=>r.e("node_modules_prop-types_index_js").then((()=>()=>r(5173))))),n("react-dom/client","*",(()=>Promise.all([r.e("webpack_sharing_consume_default_react-dom_react-dom"),r.e("node_modules_react-dom_client_js")]).then((()=>()=>r(4391))))),n("react-dom","*",(()=>Promise.all([r.e("vendors-node_modules_react-dom_index_js"),r.e("webpack_sharing_consume_default_react_react")]).then((()=>()=>r(7950))))),n("react","*",(()=>r.e("node_modules_react_index_js").then((()=>()=>r(5043)))));return d.length?e[o]=Promise.all(d).then((()=>e[o]=1)):e[o]=1}}})(),(()=>{var e;r.g.importScripts&&(e=r.g.location+"");var _=r.g.document;if(!e&&_&&(_.currentScript&&"SCRIPT"===_.currentScript.tagName.toUpperCase()&&(e=_.currentScript.src),!e)){var o=_.getElementsByTagName("script");if(o.length)for(var s=o.length-1;s>-1&&(!e||!/^http(s?):/.test(e));)e=o[s--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=e})(),(()=>{var e=e=>{var _=e=>e.split(".").map((e=>+e==e?+e:e)),r=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),o=r[1]?_(r[1]):[];return r[2]&&(o.length++,o.push.apply(o,_(r[2]))),r[3]&&(o.push([]),o.push.apply(o,_(r[3]))),o},_=(_,r)=>{_=e(_),r=e(r);for(var o=0;;){if(o>=_.length)return o=r.length)return"u"==a;var t=r[o],i=(typeof t)[0];if(a!=i)return"o"==a&&"n"==i||"s"==i||"u"==a;if("o"!=a&&"u"!=a&&s!=t)return s{var _=e[0],r="";if(1===e.length)return"*";if(_+.5){r+=0==_?">=":-1==_?"<":1==_?"^":2==_?"~":_>0?"=":"!=";for(var s=1,a=1;a0?".":"")+(s=2,i);return r}var t=[];for(a=1;a{if(0 in _){r=e(r);var o=_[0],a=o<0;a&&(o=-o-1);for(var t=0,i=1,n=!0;;i++,t++){var d,m,u=i<_.length?(typeof _[i])[0]:"";if(t>=r.length||"o"==(m=(typeof(d=r[t]))[0]))return!n||("u"==u?i>o&&!a:""==u!=a);if("u"==m){if(!n||"u"!=u)return!1}else if(n)if(u==m)if(i<=o){if(d!=_[i])return!1}else{if(a?d>_[i]:d<_[i])return!1;d!=_[i]&&(n=!1)}else if("s"!=u&&"n"!=u){if(a||i<=o)return!1;n=!1,i--}else{if(i<=o||me&&r.o(e,_),t=e=>(e.loaded=1,e.get()),i=e=>Object.keys(e).reduce(((_,r)=>(e[r].eager&&(_[r]=e[r]),_)),{}),n=(e,r,o)=>{var s=o?i(e[r]):e[r];return Object.keys(s).reduce(((e,r)=>!e||!s[e].loaded&&_(e,r)?r:e),0)},d=(e,_,r,s)=>"Unsatisfied version "+r+" from "+(r&&e[_][r].from)+" of shared singleton module "+_+" (required "+o(s)+")",m=e=>{throw new Error(e)},u=e=>{"undefined"!==typeof console&&console.warn&&console.warn(e)},l=e=>function(_,o,s,a,t){var i=r.I(_);return i&&i.then&&!s?i.then(e.bind(e,_,r.S[_],o,!1,a,t)):e(_,r.S[_],o,s,a,t)},c=(e,_,r)=>r?r():((e,_)=>m("Shared module "+_+" doesn't exist in shared scope "+e))(e,_),p=l(((e,_,r,o,i,m)=>{if(!a(_,r))return c(e,r,m);var l=n(_,r,o);return s(i,l)||u(d(_,r,l,i)),t(_[r][l])})),v={},f={8437:()=>p("default","react",!1,[0],(()=>r.e("node_modules_react_index_js").then((()=>()=>r(5043))))),5973:()=>p("default","prop-types",!1,[0],(()=>r.e("node_modules_prop-types_index_js").then((()=>()=>r(5173))))),8565:()=>p("default","@mui/system",!1,[0],(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83"),r.e("vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764"),r.e("vendors-node_modules_mui_system_esm_index_js")]).then((()=>()=>r(1774))))),7085:()=>p("default","@mui/material",!1,[0],(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be"),r.e("vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be"),r.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83"),r.e("vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764"),r.e("vendors-node_modules_mui_material_index_js"),r.e("webpack_sharing_consume_default_prop-types_prop-types"),r.e("webpack_sharing_consume_default_mui_system_mui_system"),r.e("webpack_sharing_consume_default_react-dom_react-dom")]).then((()=>()=>r(8705))))),1839:()=>p("default","@mui/icons-material",!1,[0],(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be"),r.e("vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be"),r.e("vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83"),r.e("vendors-node_modules_mui_icons-material_esm_index_js"),r.e("webpack_sharing_consume_default_mui_system_mui_system")]).then((()=>()=>r(6157))))),5636:()=>p("default","@iobroker/adapter-react-v5",!1,[0],(()=>Promise.all([r.e("vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be"),r.e("vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be"),r.e("vendors-node_modules_iobroker_adapter-react-v5_build_index_js"),r.e("webpack_sharing_consume_default_prop-types_prop-types"),r.e("webpack_sharing_consume_default_mui_system_mui_system"),r.e("webpack_sharing_consume_default_mui_icons-material_mui_icons-material")]).then((()=>()=>r(8475))))),3479:()=>p("default","react-dom",!1,[0],(()=>Promise.all([r.e("vendors-node_modules_react-dom_index_js"),r.e("webpack_sharing_consume_default_react_react")]).then((()=>()=>r(7950))))),5301:()=>p("default","@iobroker/vis-2-widgets-react-dev",!1,[0],(()=>Promise.all([r.e("webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5"),r.e("node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e1")]).then((()=>()=>r(8835)))))},b={webpack_sharing_consume_default_react_react:[8437],"webpack_sharing_consume_default_prop-types_prop-types":[5973],webpack_sharing_consume_default_mui_system_mui_system:[8565],webpack_sharing_consume_default_mui_material_mui_material:[7085],"webpack_sharing_consume_default_mui_icons-material_mui_icons-material":[1839],"webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5":[5636],"webpack_sharing_consume_default_react-dom_react-dom":[3479],"webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev":[5301]},h={};r.f.consumes=(e,_)=>{r.o(b,e)&&b[e].forEach((e=>{if(r.o(v,e))return _.push(v[e]);if(!h[e]){var o=_=>{v[e]=0,r.m[e]=o=>{delete r.c[e],o.exports=_()}};h[e]=!0;var s=_=>{delete v[e],r.m[e]=o=>{throw delete r.c[e],_}};try{var a=f[e]();a.then?_.push(v[e]=a.then(o).catch(s)):o(a)}catch(t){s(t)}}}))}})(),(()=>{var e={vis2CameraWidgets:0};r.f.j=(_,o)=>{var s=r.o(e,_)?e[_]:void 0;if(0!==s)if(s)o.push(s[2]);else if(/^webpack_sharing_consume_default_(iobroker_(adapter\-react\-v5_iobroker_adapter\-react\-v5|vis\-2\-widgets\-react\-dev_iobroker_vis\-2\-widgets\-react\-dev)|mui_((icons\-material_mui_icons\-|material_mui_)material|system_mui_system)|react(\-dom_react\-dom|_react)|prop\-types_prop\-types)$/.test(_))e[_]=0;else{var a=new Promise(((r,o)=>s=e[_]=[r,o]));o.push(s[2]=a);var t=r.p+r.u(_),i=new Error;r.l(t,(o=>{if(r.o(e,_)&&(0!==(s=e[_])&&(e[_]=void 0),s)){var a=o&&("load"===o.type?"missing":o.type),t=o&&o.target&&o.target.src;i.message="Loading chunk "+_+" failed.\n("+a+": "+t+")",i.name="ChunkLoadError",i.type=a,i.request=t,s[1](i)}}),"chunk-"+_,_)}};var _=(_,o)=>{var s,a,t=o[0],i=o[1],n=o[2],d=0;if(t.some((_=>0!==e[_]))){for(s in i)r.o(i,s)&&(r.m[s]=i[s]);if(n)n(r)}for(_&&_(o);d= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = function(msg) {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"iobroker.vis-2-widgets-camera\";\n\tvar register = function(name, version, factory, eager) {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = function(id) {\n\t\tvar handleError = function(err) { warn(\"Initialization of sharing external failed: \" + err); };\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = function(module) { return module && module.init && module.init(__webpack_require__.S[name], initScope); }\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"@iobroker/adapter-react-v5\", \"*\", function() { return Promise.all([__webpack_require__.e(\"vendors-node_modules_iobroker_adapter-react-v5_GenericApp_js-node_modules_react_jsx-runtime_js\"), __webpack_require__.e(\"vendors-node_modules_iobroker_adapter-react-v5_assets_devices_parseNames_js-node_modules_iobr-c9c0ef\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_material_mui_material\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_icons-material_mui_icons-material\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_material_styles_mui_material_styles\"), __webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_assets_devices_sync_recursive_-node_modules_iobroker_a-81710b\")]).then(function() { return function() { return __webpack_require__(26079); }; }); });\n\t\t\tregister(\"@iobroker/vis-2-widgets-react-dev\", \"*\", function() { return Promise.all([__webpack_require__.e(\"vendors-node_modules_iobroker_vis-2-widgets-react-dev_index_jsx\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_material_mui_material\"), __webpack_require__.e(\"webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5\")]).then(function() { return function() { return __webpack_require__(25582); }; }); });\n\t\t\tregister(\"@mui/icons-material\", \"*\", function() { return Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_styled_js\"), __webpack_require__.e(\"vendors-node_modules_mui_icons-material_esm_index_js-node_modules_mui_material_colors_blue_js-51d778\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_clsx_clsx\"), __webpack_require__.e(\"node_modules_react_jsx-runtime_js\")]).then(function() { return function() { return __webpack_require__(28675); }; }); });\n\t\t\tregister(\"@mui/material/styles\", \"*\", function() { return Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_styled_js\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\"), __webpack_require__.e(\"node_modules_mui_material_colors_blue_js-node_modules_mui_material_colors_common_js-node_modu-f64287\")]).then(function() { return function() { return __webpack_require__(93059); }; }); });\n\t\t\tregister(\"@mui/material\", \"*\", function() { return Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_styled_js\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-0a6db2\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_index_js\"), __webpack_require__.e(\"vendors-node_modules_mui_material_index_js-node_modules_babel_runtime_helpers_objectWithoutPr-18965d\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_clsx_clsx\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\"), __webpack_require__.e(\"webpack_sharing_consume_default_react-dom_react-dom\")]).then(function() { return function() { return __webpack_require__(76960); }; }); });\n\t\t\tregister(\"@mui/system\", \"*\", function() { return Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_styled-engine_index_js-node_modules_mui_system_esm_createTheme_creat-c54a24\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-0a6db2\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_clsx_clsx\"), __webpack_require__.e(\"node_modules_mui_system_esm_useThemeProps_useThemeProps_js-node_modules_react_jsx-runtime_js\")]).then(function() { return function() { return __webpack_require__(5937); }; }); });\n\t\t\tregister(\"clsx\", \"*\", function() { return __webpack_require__.e(\"node_modules_clsx_dist_clsx_mjs\").then(function() { return function() { return __webpack_require__(63733); }; }); });\n\t\t\tregister(\"prop-types\", \"*\", function() { return __webpack_require__.e(\"node_modules_prop-types_index_js\").then(function() { return function() { return __webpack_require__(52007); }; }); });\n\t\t\tregister(\"react-dom/client\", \"*\", function() { return Promise.all([__webpack_require__.e(\"webpack_sharing_consume_default_react-dom_react-dom\"), __webpack_require__.e(\"node_modules_react-dom_client_js\")]).then(function() { return function() { return __webpack_require__(1250); }; }); });\n\t\t\tregister(\"react-dom\", \"*\", function() { return Promise.all([__webpack_require__.e(\"vendors-node_modules_react-dom_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\")]).then(function() { return function() { return __webpack_require__(54164); }; }); });\n\t\t\tregister(\"react\", \"*\", function() { return __webpack_require__.e(\"node_modules_react_index_js\").then(function() { return function() { return __webpack_require__(72791); }; }); });\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(function() { return initPromises[name] = 1; });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = function(str) {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=function(p){return p.split(\".\").map((function(p){return+p==p?+p:p}))},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = function(a, b) {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f {\n\t\treturn Promise.all([__webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_material_mui_material\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_icons-material_mui_icons-material\"), __webpack_require__.e(\"webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev\"), __webpack_require__.e(\"src_RtspCamera_jsx\")]).then(() => (() => ((__webpack_require__(3184)))));\n\t},\n\t\"./SnapshotCamera\": () => {\n\t\treturn Promise.all([__webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_material_mui_material\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_icons-material_mui_icons-material\"), __webpack_require__.e(\"webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev\"), __webpack_require__.e(\"src_SnapshotCamera_jsx\")]).then(() => (() => ((__webpack_require__(7855)))));\n\t},\n\t\"./translations\": () => {\n\t\treturn __webpack_require__.e(\"src_translations_js\").then(() => (() => ((__webpack_require__(5850)))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + {\"node_modules_iobroker_adapter-react-v5_i18n_de_json\":\"87ff3ac7\",\"node_modules_iobroker_adapter-react-v5_i18n_en_json\":\"13a4292d\",\"node_modules_iobroker_adapter-react-v5_i18n_es_json\":\"3c7029cb\",\"vendors-node_modules_iobroker_adapter-react-v5_i18n_fr_json\":\"49fd8bc0\",\"vendors-node_modules_iobroker_adapter-react-v5_i18n_it_json\":\"32a0ec6b\",\"node_modules_iobroker_adapter-react-v5_i18n_nl_json\":\"a221b4da\",\"node_modules_iobroker_adapter-react-v5_i18n_pl_json\":\"fc2262b1\",\"node_modules_iobroker_adapter-react-v5_i18n_pt_json\":\"9a5826b2\",\"node_modules_iobroker_adapter-react-v5_i18n_ru_json\":\"3a32c677\",\"node_modules_iobroker_adapter-react-v5_i18n_zh-cn_json\":\"f1a49e94\",\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\":\"a1e48aa4\",\"vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be\":\"4d02f653\",\"vendors-node_modules_iobroker_adapter-react-v5_build_index_js\":\"c3b244f8\",\"node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e0\":\"602aa2f7\",\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83\":\"8344849e\",\"vendors-node_modules_mui_icons-material_esm_index_js\":\"8738fdfc\",\"vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764\":\"fcd25086\",\"vendors-node_modules_mui_material_index_js\":\"6c911353\",\"vendors-node_modules_mui_system_esm_index_js\":\"5cd25769\",\"node_modules_prop-types_index_js\":\"94bc55cd\",\"node_modules_react-dom_client_js\":\"26e3ee66\",\"vendors-node_modules_react-dom_index_js\":\"e9feb302\",\"node_modules_react_index_js\":\"2c46f430\",\"src_RtspCamera_jsx\":\"f981189f\",\"src_SnapshotCamera_jsx\":\"5cd2e2f2\",\"src_translations_js\":\"00eec871\",\"node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e1\":\"2279c251\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"iobroker.vis-2-widgets-camera:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.S = {};\nvar initPromises = {};\nvar initTokens = {};\n__webpack_require__.I = (name, initScope) => {\n\tif(!initScope) initScope = [];\n\t// handling circular init calls\n\tvar initToken = initTokens[name];\n\tif(!initToken) initToken = initTokens[name] = {};\n\tif(initScope.indexOf(initToken) >= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = (msg) => {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"iobroker.vis-2-widgets-camera\";\n\tvar register = (name, version, factory, eager) => {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = (id) => {\n\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/de.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_de_json\").then(() => (() => (__webpack_require__(3123))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/en.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_en_json\").then(() => (() => (__webpack_require__(6603))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/es.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_es_json\").then(() => (() => (__webpack_require__(5148))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/fr.json\", \"*\", () => (__webpack_require__.e(\"vendors-node_modules_iobroker_adapter-react-v5_i18n_fr_json\").then(() => (() => (__webpack_require__(4176))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/it.json\", \"*\", () => (__webpack_require__.e(\"vendors-node_modules_iobroker_adapter-react-v5_i18n_it_json\").then(() => (() => (__webpack_require__(7801))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/nl.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_nl_json\").then(() => (() => (__webpack_require__(9646))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/pl.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_pl_json\").then(() => (() => (__webpack_require__(1356))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/pt.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_pt_json\").then(() => (() => (__webpack_require__(324))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/ru.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_ru_json\").then(() => (() => (__webpack_require__(7629))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5/i18n/zh-cn.json\", \"*\", () => (__webpack_require__.e(\"node_modules_iobroker_adapter-react-v5_i18n_zh-cn_json\").then(() => (() => (__webpack_require__(9156))))));\n\t\t\tregister(\"@iobroker/adapter-react-v5\", \"*\", () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be\"), __webpack_require__.e(\"vendors-node_modules_iobroker_adapter-react-v5_build_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_material_mui_material\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_icons-material_mui_icons-material\")]).then(() => (() => (__webpack_require__(8475))))));\n\t\t\tregister(\"@iobroker/vis-2-widgets-react-dev\", \"*\", () => (Promise.all([__webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_material_mui_material\"), __webpack_require__.e(\"webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5\"), __webpack_require__.e(\"node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e0\")]).then(() => (() => (__webpack_require__(8835))))));\n\t\t\tregister(\"@mui/icons-material\", \"*\", () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83\"), __webpack_require__.e(\"vendors-node_modules_mui_icons-material_esm_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\")]).then(() => (() => (__webpack_require__(6157))))));\n\t\t\tregister(\"@mui/material\", \"*\", () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764\"), __webpack_require__.e(\"vendors-node_modules_mui_material_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\"), __webpack_require__.e(\"webpack_sharing_consume_default_react-dom_react-dom\")]).then(() => (() => (__webpack_require__(8705))))));\n\t\t\tregister(\"@mui/system\", \"*\", () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\")]).then(() => (() => (__webpack_require__(1774))))));\n\t\t\tregister(\"prop-types\", \"*\", () => (__webpack_require__.e(\"node_modules_prop-types_index_js\").then(() => (() => (__webpack_require__(5173))))));\n\t\t\tregister(\"react-dom/client\", \"*\", () => (Promise.all([__webpack_require__.e(\"webpack_sharing_consume_default_react-dom_react-dom\"), __webpack_require__.e(\"node_modules_react-dom_client_js\")]).then(() => (() => (__webpack_require__(4391))))));\n\t\t\tregister(\"react-dom\", \"*\", () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_react-dom_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\")]).then(() => (() => (__webpack_require__(7950))))));\n\t\t\tregister(\"react\", \"*\", () => (__webpack_require__.e(\"node_modules_react_index_js\").then(() => (() => (__webpack_require__(5043))))));\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = (str) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=p=>{return p.split(\".\").map((p=>{return+p==p?+p:p}))},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = (a, b) => {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e {\n\t// see webpack/lib/util/semver.js for original code\n\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a {\n\t// see webpack/lib/util/semver.js for original code\n\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f {\n\treturn scope && __webpack_require__.o(scope, key);\n}\nvar get = (entry) => {\n\tentry.loaded = 1;\n\treturn entry.get()\n};\nvar eagerOnly = (versions) => {\n\treturn Object.keys(versions).reduce((filtered, version) => {\n\t\t\tif (versions[version].eager) {\n\t\t\t\tfiltered[version] = versions[version];\n\t\t\t}\n\t\t\treturn filtered;\n\t}, {});\n};\nvar findLatestVersion = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key];\n};\nvar findSatisfyingVersion = (scope, key, requiredVersion, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\tif (!satisfy(requiredVersion, b)) return a;\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key]\n};\nvar findSingletonVersionKey = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\treturn Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n\t}, 0);\n};\nvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n};\nvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => {\n\tvar versions = scope[key];\n\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \")\" + (eager ? \" for eager consumption\" : \"\") + \" of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n\t\treturn key + \" from \" + versions[key].from;\n\t}).join(\", \");\n};\nvar fail = (msg) => {\n\tthrow new Error(msg);\n}\nvar failAsNotExist = (scopeName, key) => {\n\treturn fail(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n}\nvar warn = /*#__PURE__*/ (msg) => {\n\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n};\nvar init = (fn) => (function(scopeName, key, eager, c, d) {\n\tvar promise = __webpack_require__.I(scopeName);\n\tif (promise && promise.then && !eager) {\n\t\treturn promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d));\n\t}\n\treturn fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d);\n});\n\nvar useFallback = (scopeName, key, fallback) => {\n\treturn fallback ? fallback() : failAsNotExist(scopeName, key);\n}\nvar load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\twarn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\tif (fallback) return fallback();\n\tfail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));\n});\nvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\treturn get(scope[key][version]);\n});\nvar loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\twarn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\tfail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar installedModules = {};\nvar moduleToHandlerMapping = {\n\t8437: () => (loadSingletonVersion(\"default\", \"react\", false, [0], () => (__webpack_require__.e(\"node_modules_react_index_js\").then(() => (() => (__webpack_require__(5043))))))),\n\t5973: () => (loadSingletonVersion(\"default\", \"prop-types\", false, [0], () => (__webpack_require__.e(\"node_modules_prop-types_index_js\").then(() => (() => (__webpack_require__(5173))))))),\n\t8565: () => (loadSingletonVersion(\"default\", \"@mui/system\", false, [0], () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_index_js\")]).then(() => (() => (__webpack_require__(1774))))))),\n\t7085: () => (loadSingletonVersion(\"default\", \"@mui/material\", false, [0], () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_Grid_createGrid_js-node_modules_mui_system_esm_RtlProvide-971764\"), __webpack_require__.e(\"vendors-node_modules_mui_material_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\"), __webpack_require__.e(\"webpack_sharing_consume_default_react-dom_react-dom\")]).then(() => (() => (__webpack_require__(8705))))))),\n\t1839: () => (loadSingletonVersion(\"default\", \"@mui/icons-material\", false, [0], () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be\"), __webpack_require__.e(\"vendors-node_modules_mui_system_esm_DefaultPropsProvider_DefaultPropsProvider_js-node_modules-510a83\"), __webpack_require__.e(\"vendors-node_modules_mui_icons-material_esm_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\")]).then(() => (() => (__webpack_require__(6157))))))),\n\t5636: () => (loadSingletonVersion(\"default\", \"@iobroker/adapter-react-v5\", false, [0], () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_mui_system_esm_colorManipulator_colorManipulator_js-node_modules_mui_sys-5651be\"), __webpack_require__.e(\"vendors-node_modules_mui_material_styles_createTheme_js-node_modules_mui_material_styles_iden-be41be\"), __webpack_require__.e(\"vendors-node_modules_iobroker_adapter-react-v5_build_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_prop-types_prop-types\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_system_mui_system\"), __webpack_require__.e(\"webpack_sharing_consume_default_mui_icons-material_mui_icons-material\")]).then(() => (() => (__webpack_require__(8475))))))),\n\t3479: () => (loadSingletonVersion(\"default\", \"react-dom\", false, [0], () => (Promise.all([__webpack_require__.e(\"vendors-node_modules_react-dom_index_js\"), __webpack_require__.e(\"webpack_sharing_consume_default_react_react\")]).then(() => (() => (__webpack_require__(7950))))))),\n\t5301: () => (loadSingletonVersion(\"default\", \"@iobroker/vis-2-widgets-react-dev\", false, [0], () => (Promise.all([__webpack_require__.e(\"webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5\"), __webpack_require__.e(\"node_modules_iobroker_vis-2-widgets-react-dev_index_js-_081e1\")]).then(() => (() => (__webpack_require__(8835)))))))\n};\n// no consumes in initial chunks\nvar chunkMapping = {\n\t\"webpack_sharing_consume_default_react_react\": [\n\t\t8437\n\t],\n\t\"webpack_sharing_consume_default_prop-types_prop-types\": [\n\t\t5973\n\t],\n\t\"webpack_sharing_consume_default_mui_system_mui_system\": [\n\t\t8565\n\t],\n\t\"webpack_sharing_consume_default_mui_material_mui_material\": [\n\t\t7085\n\t],\n\t\"webpack_sharing_consume_default_mui_icons-material_mui_icons-material\": [\n\t\t1839\n\t],\n\t\"webpack_sharing_consume_default_iobroker_adapter-react-v5_iobroker_adapter-react-v5\": [\n\t\t5636\n\t],\n\t\"webpack_sharing_consume_default_react-dom_react-dom\": [\n\t\t3479\n\t],\n\t\"webpack_sharing_consume_default_iobroker_vis-2-widgets-react-dev_iobroker_vis-2-widgets-react-dev\": [\n\t\t5301\n\t]\n};\nvar startedInstallModules = {};\n__webpack_require__.f.consumes = (chunkId, promises) => {\n\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n\t\tchunkMapping[chunkId].forEach((id) => {\n\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n\t\t\tif(!startedInstallModules[id]) {\n\t\t\tvar onFactory = (factory) => {\n\t\t\t\tinstalledModules[id] = 0;\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tmodule.exports = factory();\n\t\t\t\t}\n\t\t\t};\n\t\t\tstartedInstallModules[id] = true;\n\t\t\tvar onError = (error) => {\n\t\t\t\tdelete installedModules[id];\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n\t\t\t\tif(promise.then) {\n\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n\t\t\t\t} else onFactory(promise);\n\t\t\t} catch(e) { onError(e); }\n\t\t\t}\n\t\t});\n\t}\n}","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"vis2CameraWidgets\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^webpack_sharing_consume_default_(iobroker_(adapter\\-react\\-v5_iobroker_adapter\\-react\\-v5|vis\\-2\\-widgets\\-react\\-dev_iobroker_vis\\-2\\-widgets\\-react\\-dev)|mui_((icons\\-material_mui_icons\\-|material_mui_)material|system_mui_system)|react(\\-dom_react\\-dom|_react)|prop\\-types_prop\\-types)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkiobroker_vis_2_widgets_camera\"] = self[\"webpackChunkiobroker_vis_2_widgets_camera\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(7434);\n"],"names":["moduleMap","Promise","all","__webpack_require__","e","then","get","module","getScope","R","o","resolve","Error","undefined","init","shareScope","initScope","S","name","oldScope","I","d","exports","__webpack_module_cache__","moduleId","cachedModule","id","loaded","__webpack_modules__","call","m","c","n","getter","__esModule","a","definition","key","Object","defineProperty","enumerable","f","chunkId","keys","reduce","promises","u","miniCssF","g","globalThis","this","Function","window","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","i","length","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","fn","setTimeout","bind","type","target","head","appendChild","r","Symbol","toStringTag","value","nmd","paths","children","initPromises","initTokens","initToken","indexOf","scope","uniqueName","register","version","factory","eager","versions","activeVersion","from","scriptUrl","importScripts","location","currentScript","tagName","toUpperCase","test","replace","p","parseVersion","str","split","map","exec","apply","versionLt","b","t","rangeToString","range","pop","satisfy","exists","entry","eagerOnly","filtered","findSingletonVersionKey","getInvalidSingletonVersionMessage","requiredVersion","fail","msg","warn","console","scopeName","promise","useFallback","fallback","failAsNotExist","loadSingletonVersion","installedModules","moduleToHandlerMapping","chunkMapping","startedInstallModules","consumes","onFactory","onError","error","installedChunks","j","installedChunkData","reject","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file