From 25de9638dda2c46d68c06a00f4768d609dd059bc Mon Sep 17 00:00:00 2001 From: Fabio Date: Tue, 23 Dec 2025 16:48:22 +0100 Subject: [PATCH] first commit --- .gitignore | 1 + README.md | 36 + backend/apps.json | 226 +++ backend/apps.json.orig | 30 + backend/apps1.json | 161 ++ backend/i.js | 87 + backend/package-lock.json | 1330 ++++++++++++++ backend/package.json | 15 + backend/server.js | 32 + backend/server.js.old | 23 + backend/updatelink.js | 122 ++ frontend/dist/assets/index-COhNAj5f.js | 40 + frontend/dist/assets/index-DQwn-aJw.css | 1 + frontend/dist/icons/error.png | Bin 0 -> 1843 bytes frontend/dist/index.html | 13 + frontend/index.html | 12 + frontend/not-applicable.jpg | Bin 0 -> 49360 bytes frontend/package-lock.json | 2101 +++++++++++++++++++++++ frontend/package.json | 22 + frontend/public/icons/error.png | Bin 0 -> 1843 bytes frontend/src/App.css | 74 + frontend/src/App.jsx | 30 + frontend/src/App.jsx.old | 48 + frontend/src/App.jsx.old1 | 45 + frontend/src/App.jsx.old2 | 45 + frontend/src/errore.png | Bin 0 -> 1843 bytes frontend/src/index.css | 3 + frontend/src/main.jsx | 10 + frontend/tailwind.config.js | 25 + frontend/vite.config.js | 9 + 30 files changed, 4541 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 backend/apps.json create mode 100644 backend/apps.json.orig create mode 100644 backend/apps1.json create mode 100644 backend/i.js create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/server.js create mode 100644 backend/server.js.old create mode 100644 backend/updatelink.js create mode 100644 frontend/dist/assets/index-COhNAj5f.js create mode 100644 frontend/dist/assets/index-DQwn-aJw.css create mode 100644 frontend/dist/icons/error.png create mode 100644 frontend/dist/index.html create mode 100644 frontend/index.html create mode 100644 frontend/not-applicable.jpg create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/icons/error.png create mode 100644 frontend/src/App.css create mode 100644 frontend/src/App.jsx create mode 100644 frontend/src/App.jsx.old create mode 100644 frontend/src/App.jsx.old1 create mode 100644 frontend/src/App.jsx.old2 create mode 100644 frontend/src/errore.png create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.jsx create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ef4480 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Dashboard per tutte le mie applicazioni + +entrare in frontend: installare e fare la build + +```sh +cd /frontend +npm ci install +npm run build +cd .. +``` + +entrare nella backend e installare +```sh +cd /backend +npm ci install +``` + +editare il file app.json con host e port + +vedi esempio apps1.json + +facendo partire il server il file diventerà come apps.json + +infine far partire il server + +```sh +npm start +``` + +se si vogliono fare delle prove di creazione del file apps.json si può copiare apps1.json + +```sh +cp apps1.json apps.json +``` + + diff --git a/backend/apps.json b/backend/apps.json new file mode 100644 index 0000000..d80d9dd --- /dev/null +++ b/backend/apps.json @@ -0,0 +1,226 @@ +[ + { + "host": "192.168.1.4", + "port": 3100, + "name": "Forgejo: Beyo..", + "icon": "http://192.168.1.4:3100/assets/img/favicon.svg", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 9000, + "name": "Portainer", + "icon": "http://192.168.1.4:9000/63a301f0574f1a696ce6.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 5557, + "name": "no_name", + "icon": "./default.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 2222, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 5558, + "name": "@Joxit", + "icon": "./default.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8123, + "name": "Home Assistant", + "icon": "http://192.168.1.4:8123/static/icons/favicon.ico", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 3333, + "name": "PairDrop", + "icon": "http://192.168.1.4:3333/images/favicon-96x96.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8889, + "name": "assets", + "icon": "http://192.168.1.4:8889/filebrowser/static/img/icons/favicon-32x32.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 4444, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 32400, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 13378, + "name": "Audiobookshelf", + "icon": "http://192.168.1.4:13378/audiobookshelf/favicon.ico", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8083, + "name": "Calibre-Web |..", + "icon": "http://192.168.1.4:8083/static/favicon.ico", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 3222, + "name": "Gitea: Git wi..", + "icon": "http://192.168.1.4:3222/assets/img/favicon.svg", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8111, + "name": "gpx.studio", + "icon": "http://192.168.1.4:8111/android-icon-192x192.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 17777, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8112, + "name": "Favycon", + "icon": "http://192.168.1.4:8112/favicon-192x192.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8113, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8115, + "name": "TileServer GL..", + "icon": "./default.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8116, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 4533, + "name": "Navidrome", + "icon": "http://192.168.1.4:4533/android-chrome-192x192.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 2342, + "name": "PhotoPrism", + "icon": "http://192.168.1.4:2342/static/icons/app/1024.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8888, + "name": "Photoview", + "icon": "http://192.168.1.4:8888/photoview-logo.svg", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 3000, + "name": "hass-addon-fe", + "icon": "http://192.168.1.4:3000/favicon.ico", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 3300, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8006, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8200, + "name": "Online Markdo..", + "icon": "http://192.168.1.4:8200/apple-touch-icon.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 51929, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 9900, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 6080, + "name": "noVNC", + "icon": "http://192.168.1.4:6080/app/images/icons/novnc-ios-180.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8840, + "name": "WatchYourLAN", + "icon": "http://192.168.1.4:8840/fs/public/favicon.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 4000, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 2322, + "name": "no_name", + "icon": "/icons/error.png", + "controllato": true + } +] \ No newline at end of file diff --git a/backend/apps.json.orig b/backend/apps.json.orig new file mode 100644 index 0000000..8e4febe --- /dev/null +++ b/backend/apps.json.orig @@ -0,0 +1,30 @@ +[ + { + "name": "Portainer", + "host": "192.168.1.3", + "port": 9000, + "icon": "http://192.168.1.3:9000/b1f2baef7b5736909c25.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 8112, + "name": "Favycon", + "icon": "http://192.168.1.4:8112/favicon-192x192.png", + "controllato": true + }, + { + "host": "192.168.1.4", + "port": 3100, + "name": "Forgejo", + "icon": "http://192.168.1.4:3100/assets/img/favicon.svg", + "controllato": true + }, + { + "host": "192.168.1.3", + "port": 8081, + "name": "mongoDB", + "icon": "/icons/error.png", + "controllato": true + } +] diff --git a/backend/apps1.json b/backend/apps1.json new file mode 100644 index 0000000..ad151cb --- /dev/null +++ b/backend/apps1.json @@ -0,0 +1,161 @@ +[ + { + "host": "192.168.1.4", + "port": 3100 + }, + + { + "host": "192.168.1.4", + "port": 9000 + }, + + { + "host": "192.168.1.4", + "port": 5557 + }, + + { + "host": "192.168.1.4", + "port": 2222 + }, + + { + "host": "192.168.1.4", + "port": 5558 + }, + + { + "host": "192.168.1.4", + "port": 8123 + }, + + { + "host": "192.168.1.4", + "port": 3333 + }, + + { + "host": "192.168.1.4", + "port": 8889 + }, + + { + "host": "192.168.1.4", + "port": 4444 + }, + + { + "host": "192.168.1.4", + "port": 32400 + }, + + { + "host": "192.168.1.4", + "port": 13378 + }, + + { + "host": "192.168.1.4", + "port": 8083 + }, + + { + "host": "192.168.1.4", + "port": 3222 + }, + + { + "host": "192.168.1.4", + "port": 8111 + }, + + { + "host": "192.168.1.4", + "port": 17777 + }, + + { + "host": "192.168.1.4", + "port": 8112 + }, + + { + "host": "192.168.1.4", + "port": 8113 + }, + + { + "host": "192.168.1.4", + "port": 8115 + }, + + { + "host": "192.168.1.4", + "port": 8116 + }, + + { + "host": "192.168.1.4", + "port": 4533 + }, + + { + "host": "192.168.1.4", + "port": 2342 + }, + + { + "host": "192.168.1.4", + "port": 8888 + }, + + { + "host": "192.168.1.4", + "port": 3000 + }, + + { + "host": "192.168.1.4", + "port": 3300 + }, + + { + "host": "192.168.1.4", + "port": 8006 + }, + + { + "host": "192.168.1.4", + "port": 8200 + }, + + { + "host": "192.168.1.4", + "port": 51929 + }, + + { + "host": "192.168.1.4", + "port": 9900 + }, + + { + "host": "192.168.1.4", + "port": 6080 + }, + + { + "host": "192.168.1.4", + "port": 8840 + }, + + { + "host": "192.168.1.4", + "port": 4000 + }, + + { + "host": "192.168.1.4", + "port": 2322 + } +] \ No newline at end of file diff --git a/backend/i.js b/backend/i.js new file mode 100644 index 0000000..5ccf835 --- /dev/null +++ b/backend/i.js @@ -0,0 +1,87 @@ +// checkApps.js +import fs from "fs"; +import path from "path"; +import * as cheerio from "cheerio"; +import axios from "axios"; + +const appsFile = path.join(process.cwd(), "apps.json"); + + +function getShortName($) { + return ( + $('meta[property="og:site_name"]').attr('content') || + $('meta[name="application-name"]').attr('content') || + $('meta[property="og:title"]').attr('content') || + $("title").text().trim() || + null + ); +} + + + +async function findBestIconAndName(baseUrl) { + try { + const res = await axios.get(baseUrl, { timeout: 2000 }); + const $ = cheerio.load(res.data); + + //let appName = $("title").text().trim() || null; + let appName = getShortName($) || null; + const icons = []; + $("link[rel*='icon']").each((_, el) => { + const href = $(el).attr("href"); + const sizes = $(el).attr("sizes") || ""; + if (href) icons.push({ href, sizes }); + }); + + icons.sort((a, b) => { + const sizeA = parseInt(a.sizes.split("x")[0]) || 0; + const sizeB = parseInt(b.sizes.split("x")[0]) || 0; + return sizeB - sizeA; + }); + + let chosenIcon; + if (icons.length > 0) { + chosenIcon = new URL(icons[0].href, baseUrl).href; + } else { + chosenIcon = "./default.png"; + } + + // Se non c’è nome, metti "no_name" + return { name: appName || "no_name", icon: chosenIcon }; + } catch { + return { name: "no_name", icon: "/icons/error.png" }; + } +} + +async function main() { + const apps = JSON.parse(fs.readFileSync(appsFile, "utf-8")); + + for (const app of apps) { + if (app.controllato) { + console.log(`Skip ${app.name} (${app.host}:${app.port}) già controllato`); + continue; + } + + const baseUrl = `http://${app.host}:${app.port}`; + console.log(`Controllo ${baseUrl}...`); + + const result = await findBestIconAndName(baseUrl); + + // Aggiorna nome (anche se "no_name") + app.name = result.name; + + // Aggiorna icona + app.icon = result.icon; + + // Flag di controllo + app.controllato = true; + } + + fs.writeFileSync(appsFile, JSON.stringify(apps, null, 2)); + console.log("apps.json aggiornato ✅"); +} + +main().catch((err) => { + console.error("Errore:", err); + process.exit(1); +}); diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..5664a36 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1330 @@ +{ + "name": "dashboard-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dashboard-backend", + "version": "1.0.0", + "dependencies": { + "axios": "^1.13.2", + "cheerio": "^1.1.2", + "express": "^4.19.2" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "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/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "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.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/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/serve-static/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..81251ce --- /dev/null +++ b/backend/package.json @@ -0,0 +1,15 @@ +{ + "name": "dashboard-backend", + "version": "1.0.0", + "description": "Express server per servire apps.json e frontend build", + "main": "server.js", + "type": "module", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "axios": "^1.13.2", + "cheerio": "^1.1.2", + "express": "^4.19.2" + } +} diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..23cc74c --- /dev/null +++ b/backend/server.js @@ -0,0 +1,32 @@ +import express from "express"; +import path from "path"; +import fs from "fs"; +import { fileURLToPath } from "url"; +import updateLink from "./updatelink.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const app = express(); +const PORT = 4000; + +updateLink().catch((err) => { + console.error("Errore:", err); +}); + +// Serve lista app da apps.json +app.get("/apps", (req, res) => { + const apps = JSON.parse(fs.readFileSync(path.join(__dirname, "apps.json"))); + res.json(apps); +}); + +// Serve frontend build +app.use(express.static(path.join(__dirname, "../frontend/dist"))); + +app.get("*", (req, res) => { + res.sendFile(path.join(__dirname, "../frontend/dist/index.html")); +}); + +app.listen(PORT, () => { + console.log(`Dashboard running on http://localhost:${PORT}`); +}); diff --git a/backend/server.js.old b/backend/server.js.old new file mode 100644 index 0000000..02f7f22 --- /dev/null +++ b/backend/server.js.old @@ -0,0 +1,23 @@ +const express = require("express"); +const path = require("path"); +const fs = require("fs"); + +const app = express(); +const PORT = 4000; + +// Serve lista app da apps.json +app.get("/apps", (req, res) => { + const apps = JSON.parse(fs.readFileSync(path.join(__dirname, "apps.json"))); + res.json(apps); +}); + +// Serve frontend build +app.use(express.static(path.join(__dirname, "../frontend/dist"))); + +app.get("*", (req, res) => { + res.sendFile(path.join(__dirname, "../frontend/dist/index.html")); +}); + +app.listen(PORT, () => { + console.log(`Dashboard running on http://localhost:${PORT}`); +}); diff --git a/backend/updatelink.js b/backend/updatelink.js new file mode 100644 index 0000000..2cb9eac --- /dev/null +++ b/backend/updatelink.js @@ -0,0 +1,122 @@ +// updatelink.js +import fs from "fs"; +import path from "path"; +import * as cheerio from "cheerio"; +import axios from "axios"; + +const appsFile = path.join(process.cwd(), "apps.json"); + +/*function getShortName($) { + return ( + $('meta[property="og:site_name"]').attr("content") || + $('meta[name="application-name"]').attr("content") || + $('meta[property="og:title"]').attr("content") || + $("title").text().trim() || + null + ); +} +*/ +function limitText(str,n) { + if (!str) return ""; + if (str.length <= n) { + return str; + } + return str.slice(0, n-2) + ".."; +} + +function getShortName($) { + const candidates = [ +/* $('meta[property="og:site_name"]').attr("content"), + $('meta[name="application-name"]').attr("content"), + $('meta[property="og:title"]').attr("content"), + $("title").text().trim(), +*/ + $('meta[property="og:site_name"]').attr("content"), + $('meta[name="application-name"]').attr("content"), + $('meta[property="og:title"]').attr("content"), + $('meta[name="apple-mobile-web-app-title"]').attr("content"), + $('meta[name="twitter:title"]').attr("content"), + $('meta[name="twitter:site"]').attr("content"), + $("title").text().trim(), + ]; + + // Filtra solo stringhe non nulle e non vuote + const valid = candidates.filter(s => s && s.trim().length > 0); + + if (valid.length === 0) return null; + + // Ordina per lunghezza crescente e prende la prima + valid.sort((a, b) => a.length - b.length); + + return limitText(valid[0],15); +} + + +function consolelogName($) { + console.log($('meta[property="og:site_name"]').attr("content")); + console.log($('meta[name="application-name"]').attr("content")); + console.log($('meta[property="og:title"]').attr("content")); + console.log($('meta[name="apple-mobile-web-app-title"]').attr("content")); + console.log($('meta[name="twitter:title"]').attr("content")); + console.log($('meta[name="twitter:site"]').attr("content")); + console.log($("title").text().trim()); +} + +async function findBestIconAndName(baseUrl) { + try { + const res = await axios.get(baseUrl, { timeout: 2000 }); + const $ = cheerio.load(res.data); + + let appName = getShortName($) || null; + consolelogName($); + const icons = []; + $("link[rel*='icon']").each((_, el) => { + const href = $(el).attr("href"); + const sizes = $(el).attr("sizes") || ""; + if (href) icons.push({ href, sizes }); + }); + + icons.sort((a, b) => { + const sizeA = parseInt(a.sizes.split("x")[0]) || 0; + const sizeB = parseInt(b.sizes.split("x")[0]) || 0; + return sizeB - sizeA; + }); + + let chosenIcon; + if (icons.length > 0) { + chosenIcon = new URL(icons[0].href, baseUrl).href; + } else { + chosenIcon = "./default.png"; + } + + return { name: appName || "no_name", icon: chosenIcon }; + } catch { + return { name: "no_name", icon: "/icons/error.png" }; + } +} + +/** + * Funzione principale che aggiorna apps.json + */ +export default async function updateLink() { + const apps = JSON.parse(fs.readFileSync(appsFile, "utf-8")); + + for (const app of apps) { + if (app.controllato) { + console.log(`Skip ${app.name} (${app.host}:${app.port}) già controllato`); + continue; + } + + const baseUrl = `http://${app.host}:${app.port}`; + console.log(`Controllo ${baseUrl}...`); + + const result = await findBestIconAndName(baseUrl); + + app.name = result.name; + app.icon = result.icon; + app.controllato = true; + } + + fs.writeFileSync(appsFile, JSON.stringify(apps, null, 2)); + console.log("apps.json aggiornato ✅"); +} diff --git a/frontend/dist/assets/index-COhNAj5f.js b/frontend/dist/assets/index-COhNAj5f.js new file mode 100644 index 0000000..5097845 --- /dev/null +++ b/frontend/dist/assets/index-COhNAj5f.js @@ -0,0 +1,40 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const u of l)if(u.type==="childList")for(const o of u.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(l){const u={};return l.integrity&&(u.integrity=l.integrity),l.referrerPolicy&&(u.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?u.credentials="include":l.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function r(l){if(l.ep)return;l.ep=!0;const u=n(l);fetch(l.href,u)}})();function nf(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Hi={exports:{}},el={},Wi={exports:{}},L={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Xn=Symbol.for("react.element"),rf=Symbol.for("react.portal"),lf=Symbol.for("react.fragment"),uf=Symbol.for("react.strict_mode"),of=Symbol.for("react.profiler"),sf=Symbol.for("react.provider"),af=Symbol.for("react.context"),ff=Symbol.for("react.forward_ref"),cf=Symbol.for("react.suspense"),df=Symbol.for("react.memo"),pf=Symbol.for("react.lazy"),Do=Symbol.iterator;function mf(e){return e===null||typeof e!="object"?null:(e=Do&&e[Do]||e["@@iterator"],typeof e=="function"?e:null)}var Qi={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Ki=Object.assign,Yi={};function rn(e,t,n){this.props=e,this.context=t,this.refs=Yi,this.updater=n||Qi}rn.prototype.isReactComponent={};rn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};rn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Xi(){}Xi.prototype=rn.prototype;function Uu(e,t,n){this.props=e,this.context=t,this.refs=Yi,this.updater=n||Qi}var Au=Uu.prototype=new Xi;Au.constructor=Uu;Ki(Au,rn.prototype);Au.isPureReactComponent=!0;var Io=Array.isArray,Gi=Object.prototype.hasOwnProperty,Vu={current:null},Zi={key:!0,ref:!0,__self:!0,__source:!0};function Ji(e,t,n){var r,l={},u=null,o=null;if(t!=null)for(r in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(u=""+t.key),t)Gi.call(t,r)&&!Zi.hasOwnProperty(r)&&(l[r]=t[r]);var i=arguments.length-2;if(i===1)l.children=n;else if(1>>1,X=_[H];if(0>>1;Hl(gl,z))vtl(er,gl)?(_[H]=er,_[vt]=z,H=vt):(_[H]=gl,_[mt]=z,H=mt);else if(vtl(er,z))_[H]=er,_[vt]=z,H=vt;else break e}}return N}function l(_,N){var z=_.sortIndex-N.sortIndex;return z!==0?z:_.id-N.id}if(typeof performance=="object"&&typeof performance.now=="function"){var u=performance;e.unstable_now=function(){return u.now()}}else{var o=Date,i=o.now();e.unstable_now=function(){return o.now()-i}}var s=[],f=[],v=1,m=null,p=3,g=!1,w=!1,S=!1,F=typeof setTimeout=="function"?setTimeout:null,c=typeof clearTimeout=="function"?clearTimeout:null,a=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(_){for(var N=n(f);N!==null;){if(N.callback===null)r(f);else if(N.startTime<=_)r(f),N.sortIndex=N.expirationTime,t(s,N);else break;N=n(f)}}function h(_){if(S=!1,d(_),!w)if(n(s)!==null)w=!0,hl(E);else{var N=n(f);N!==null&&yl(h,N.startTime-_)}}function E(_,N){w=!1,S&&(S=!1,c(P),P=-1),g=!0;var z=p;try{for(d(N),m=n(s);m!==null&&(!(m.expirationTime>N)||_&&!xe());){var H=m.callback;if(typeof H=="function"){m.callback=null,p=m.priorityLevel;var X=H(m.expirationTime<=N);N=e.unstable_now(),typeof X=="function"?m.callback=X:m===n(s)&&r(s),d(N)}else r(s);m=n(s)}if(m!==null)var bn=!0;else{var mt=n(f);mt!==null&&yl(h,mt.startTime-N),bn=!1}return bn}finally{m=null,p=z,g=!1}}var C=!1,x=null,P=-1,B=5,T=-1;function xe(){return!(e.unstable_now()-T_||125<_?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):B=0<_?Math.floor(1e3/_):5},e.unstable_getCurrentPriorityLevel=function(){return p},e.unstable_getFirstCallbackNode=function(){return n(s)},e.unstable_next=function(_){switch(p){case 1:case 2:case 3:var N=3;break;default:N=p}var z=p;p=N;try{return _()}finally{p=z}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(_,N){switch(_){case 1:case 2:case 3:case 4:case 5:break;default:_=3}var z=p;p=_;try{return N()}finally{p=z}},e.unstable_scheduleCallback=function(_,N,z){var H=e.unstable_now();switch(typeof z=="object"&&z!==null?(z=z.delay,z=typeof z=="number"&&0H?(_.sortIndex=z,t(f,_),n(s)===null&&_===n(f)&&(S?(c(P),P=-1):S=!0,yl(h,z-H))):(_.sortIndex=X,t(s,_),w||g||(w=!0,hl(E))),_},e.unstable_shouldYield=xe,e.unstable_wrapCallback=function(_){var N=p;return function(){var z=p;p=N;try{return _.apply(this,arguments)}finally{p=z}}}})(ns);ts.exports=ns;var Pf=ts.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Nf=Tn,he=Pf;function y(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Kl=Object.prototype.hasOwnProperty,zf=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,jo={},Uo={};function Lf(e){return Kl.call(Uo,e)?!0:Kl.call(jo,e)?!1:zf.test(e)?Uo[e]=!0:(jo[e]=!0,!1)}function Tf(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Rf(e,t,n,r){if(t===null||typeof t>"u"||Tf(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function ie(e,t,n,r,l,u,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=o}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){b[e]=new ie(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];b[t]=new ie(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){b[e]=new ie(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){b[e]=new ie(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){b[e]=new ie(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){b[e]=new ie(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){b[e]=new ie(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){b[e]=new ie(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){b[e]=new ie(e,5,!1,e.toLowerCase(),null,!1,!1)});var Bu=/[\-:]([a-z])/g;function Hu(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Bu,Hu);b[t]=new ie(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Bu,Hu);b[t]=new ie(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Bu,Hu);b[t]=new ie(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){b[e]=new ie(e,1,!1,e.toLowerCase(),null,!1,!1)});b.xlinkHref=new ie("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){b[e]=new ie(e,1,!1,e.toLowerCase(),null,!0,!0)});function Wu(e,t,n,r){var l=b.hasOwnProperty(t)?b[t]:null;(l!==null?l.type!==0:r||!(2i||l[o]!==u[i]){var s=` +`+l[o].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=o&&0<=i);break}}}finally{kl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?yn(e):""}function Of(e){switch(e.tag){case 5:return yn(e.type);case 16:return yn("Lazy");case 13:return yn("Suspense");case 19:return yn("SuspenseList");case 0:case 2:case 15:return e=El(e.type,!1),e;case 11:return e=El(e.type.render,!1),e;case 1:return e=El(e.type,!0),e;default:return""}}function Zl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Mt:return"Fragment";case Ot:return"Portal";case Yl:return"Profiler";case Qu:return"StrictMode";case Xl:return"Suspense";case Gl:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case us:return(e.displayName||"Context")+".Consumer";case ls:return(e._context.displayName||"Context")+".Provider";case Ku:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Yu:return t=e.displayName||null,t!==null?t:Zl(e.type)||"Memo";case Ge:t=e._payload,e=e._init;try{return Zl(e(t))}catch{}}return null}function Mf(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Zl(t);case 8:return t===Qu?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function at(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function is(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Df(e){var t=is(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,u=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(o){r=""+o,u.call(this,o)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(o){r=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function rr(e){e._valueTracker||(e._valueTracker=Df(e))}function ss(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=is(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Tr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Jl(e,t){var n=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Vo(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=at(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function as(e,t){t=t.checked,t!=null&&Wu(e,"checked",t,!1)}function ql(e,t){as(e,t);var n=at(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?bl(e,t.type,n):t.hasOwnProperty("defaultValue")&&bl(e,t.type,at(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function $o(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function bl(e,t,n){(t!=="number"||Tr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var gn=Array.isArray;function Wt(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=lr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function On(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var kn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},If=["Webkit","ms","Moz","O"];Object.keys(kn).forEach(function(e){If.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),kn[t]=kn[e]})});function ps(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||kn.hasOwnProperty(e)&&kn[e]?(""+t).trim():t+"px"}function ms(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=ps(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Ff=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function nu(e,t){if(t){if(Ff[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(y(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(y(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(y(61))}if(t.style!=null&&typeof t.style!="object")throw Error(y(62))}}function ru(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var lu=null;function Xu(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var uu=null,Qt=null,Kt=null;function Wo(e){if(e=Jn(e)){if(typeof uu!="function")throw Error(y(280));var t=e.stateNode;t&&(t=ul(t),uu(e.stateNode,e.type,t))}}function vs(e){Qt?Kt?Kt.push(e):Kt=[e]:Qt=e}function hs(){if(Qt){var e=Qt,t=Kt;if(Kt=Qt=null,Wo(e),t)for(e=0;e>>=0,e===0?32:31-(Yf(e)/Xf|0)|0}var ur=64,or=4194304;function wn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Dr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,u=e.pingedLanes,o=n&268435455;if(o!==0){var i=o&~l;i!==0?r=wn(i):(u&=o,u!==0&&(r=wn(u)))}else o=n&~l,o!==0?r=wn(o):u!==0&&(r=wn(u));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,u=t&-t,l>=u||l===16&&(u&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Gn(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Te(t),e[t]=n}function qf(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=_n),bo=" ",ei=!1;function Fs(e,t){switch(e){case"keyup":return Pc.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function js(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Dt=!1;function zc(e,t){switch(e){case"compositionend":return js(t);case"keypress":return t.which!==32?null:(ei=!0,bo);case"textInput":return e=t.data,e===bo&&ei?null:e;default:return null}}function Lc(e,t){if(Dt)return e==="compositionend"||!no&&Fs(e,t)?(e=Ds(),kr=bu=be=null,Dt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=li(n)}}function $s(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?$s(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Bs(){for(var e=window,t=Tr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Tr(e.document)}return t}function ro(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Uc(e){var t=Bs(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&$s(n.ownerDocument.documentElement,n)){if(r!==null&&ro(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,u=Math.min(r.start,l);r=r.end===void 0?u:Math.min(r.end,l),!e.extend&&u>r&&(l=r,r=u,u=l),l=ui(n,u);var o=ui(n,r);l&&o&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),u>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,It=null,cu=null,xn=null,du=!1;function oi(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;du||It==null||It!==Tr(r)||(r=It,"selectionStart"in r&&ro(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),xn&&Un(xn,r)||(xn=r,r=jr(cu,"onSelect"),0Ut||(e.current=gu[Ut],gu[Ut]=null,Ut--)}function M(e,t){Ut++,gu[Ut]=e.current,e.current=t}var ft={},re=dt(ft),fe=dt(!1),_t=ft;function Jt(e,t){var n=e.type.contextTypes;if(!n)return ft;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},u;for(u in n)l[u]=t[u];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function ce(e){return e=e.childContextTypes,e!=null}function Ar(){I(fe),I(re)}function pi(e,t,n){if(re.current!==ft)throw Error(y(168));M(re,t),M(fe,n)}function Js(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(y(108,Mf(e)||"Unknown",l));return V({},n,r)}function Vr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||ft,_t=re.current,M(re,e),M(fe,fe.current),!0}function mi(e,t,n){var r=e.stateNode;if(!r)throw Error(y(169));n?(e=Js(e,t,_t),r.__reactInternalMemoizedMergedChildContext=e,I(fe),I(re),M(re,e)):I(fe),M(fe,n)}var Ae=null,ol=!1,Fl=!1;function qs(e){Ae===null?Ae=[e]:Ae.push(e)}function Zc(e){ol=!0,qs(e)}function pt(){if(!Fl&&Ae!==null){Fl=!0;var e=0,t=O;try{var n=Ae;for(O=1;e>=o,l-=o,Ve=1<<32-Te(t)+l|n<P?(B=x,x=null):B=x.sibling;var T=p(c,x,d[P],h);if(T===null){x===null&&(x=B);break}e&&x&&T.alternate===null&&t(c,x),a=u(T,a,P),C===null?E=T:C.sibling=T,C=T,x=B}if(P===d.length)return n(c,x),j&&ht(c,P),E;if(x===null){for(;PP?(B=x,x=null):B=x.sibling;var xe=p(c,x,T.value,h);if(xe===null){x===null&&(x=B);break}e&&x&&xe.alternate===null&&t(c,x),a=u(xe,a,P),C===null?E=xe:C.sibling=xe,C=xe,x=B}if(T.done)return n(c,x),j&&ht(c,P),E;if(x===null){for(;!T.done;P++,T=d.next())T=m(c,T.value,h),T!==null&&(a=u(T,a,P),C===null?E=T:C.sibling=T,C=T);return j&&ht(c,P),E}for(x=r(c,x);!T.done;P++,T=d.next())T=g(x,c,P,T.value,h),T!==null&&(e&&T.alternate!==null&&x.delete(T.key===null?P:T.key),a=u(T,a,P),C===null?E=T:C.sibling=T,C=T);return e&&x.forEach(function(on){return t(c,on)}),j&&ht(c,P),E}function F(c,a,d,h){if(typeof d=="object"&&d!==null&&d.type===Mt&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case nr:e:{for(var E=d.key,C=a;C!==null;){if(C.key===E){if(E=d.type,E===Mt){if(C.tag===7){n(c,C.sibling),a=l(C,d.props.children),a.return=c,c=a;break e}}else if(C.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===Ge&&yi(E)===C.type){n(c,C.sibling),a=l(C,d.props),a.ref=mn(c,C,d),a.return=c,c=a;break e}n(c,C);break}else t(c,C);C=C.sibling}d.type===Mt?(a=Et(d.props.children,c.mode,h,d.key),a.return=c,c=a):(h=Lr(d.type,d.key,d.props,null,c.mode,h),h.ref=mn(c,a,d),h.return=c,c=h)}return o(c);case Ot:e:{for(C=d.key;a!==null;){if(a.key===C)if(a.tag===4&&a.stateNode.containerInfo===d.containerInfo&&a.stateNode.implementation===d.implementation){n(c,a.sibling),a=l(a,d.children||[]),a.return=c,c=a;break e}else{n(c,a);break}else t(c,a);a=a.sibling}a=Wl(d,c.mode,h),a.return=c,c=a}return o(c);case Ge:return C=d._init,F(c,a,C(d._payload),h)}if(gn(d))return w(c,a,d,h);if(an(d))return S(c,a,d,h);pr(c,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,a!==null&&a.tag===6?(n(c,a.sibling),a=l(a,d),a.return=c,c=a):(n(c,a),a=Hl(d,c.mode,h),a.return=c,c=a),o(c)):n(c,a)}return F}var bt=na(!0),ra=na(!1),Hr=dt(null),Wr=null,$t=null,io=null;function so(){io=$t=Wr=null}function ao(e){var t=Hr.current;I(Hr),e._currentValue=t}function ku(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Xt(e,t){Wr=e,io=$t=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ae=!0),e.firstContext=null)}function _e(e){var t=e._currentValue;if(io!==e)if(e={context:e,memoizedValue:t,next:null},$t===null){if(Wr===null)throw Error(y(308));$t=e,Wr.dependencies={lanes:0,firstContext:e}}else $t=$t.next=e;return t}var wt=null;function fo(e){wt===null?wt=[e]:wt.push(e)}function la(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,fo(t)):(n.next=l.next,l.next=n),t.interleaved=n,Qe(e,r)}function Qe(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var Ze=!1;function co(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function ua(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Be(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function ut(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,R&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,Qe(e,n)}return l=r.interleaved,l===null?(t.next=t,fo(r)):(t.next=l.next,l.next=t),r.interleaved=t,Qe(e,n)}function _r(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Zu(e,n)}}function gi(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,u=null;if(n=n.firstBaseUpdate,n!==null){do{var o={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};u===null?l=u=o:u=u.next=o,n=n.next}while(n!==null);u===null?l=u=t:u=u.next=t}else l=u=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:u,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Qr(e,t,n,r){var l=e.updateQueue;Ze=!1;var u=l.firstBaseUpdate,o=l.lastBaseUpdate,i=l.shared.pending;if(i!==null){l.shared.pending=null;var s=i,f=s.next;s.next=null,o===null?u=f:o.next=f,o=s;var v=e.alternate;v!==null&&(v=v.updateQueue,i=v.lastBaseUpdate,i!==o&&(i===null?v.firstBaseUpdate=f:i.next=f,v.lastBaseUpdate=s))}if(u!==null){var m=l.baseState;o=0,v=f=s=null,i=u;do{var p=i.lane,g=i.eventTime;if((r&p)===p){v!==null&&(v=v.next={eventTime:g,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var w=e,S=i;switch(p=t,g=n,S.tag){case 1:if(w=S.payload,typeof w=="function"){m=w.call(g,m,p);break e}m=w;break e;case 3:w.flags=w.flags&-65537|128;case 0:if(w=S.payload,p=typeof w=="function"?w.call(g,m,p):w,p==null)break e;m=V({},m,p);break e;case 2:Ze=!0}}i.callback!==null&&i.lane!==0&&(e.flags|=64,p=l.effects,p===null?l.effects=[i]:p.push(i))}else g={eventTime:g,lane:p,tag:i.tag,payload:i.payload,callback:i.callback,next:null},v===null?(f=v=g,s=m):v=v.next=g,o|=p;if(i=i.next,i===null){if(i=l.shared.pending,i===null)break;p=i,i=p.next,p.next=null,l.lastBaseUpdate=p,l.shared.pending=null}}while(!0);if(v===null&&(s=m),l.baseState=s,l.firstBaseUpdate=f,l.lastBaseUpdate=v,t=l.shared.interleaved,t!==null){l=t;do o|=l.lane,l=l.next;while(l!==t)}else u===null&&(l.shared.lanes=0);Pt|=o,e.lanes=o,e.memoizedState=m}}function wi(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Ul.transition;Ul.transition={};try{e(!1),t()}finally{O=n,Ul.transition=r}}function Ea(){return Ce().memoizedState}function ed(e,t,n){var r=it(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},_a(e))Ca(t,n);else if(n=la(e,t,n,r),n!==null){var l=ue();Re(n,e,r,l),xa(n,t,r)}}function td(e,t,n){var r=it(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(_a(e))Ca(t,l);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var o=t.lastRenderedState,i=u(o,n);if(l.hasEagerState=!0,l.eagerState=i,Oe(i,o)){var s=t.interleaved;s===null?(l.next=l,fo(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=la(e,t,l,r),n!==null&&(l=ue(),Re(n,e,r,l),xa(n,t,r))}}function _a(e){var t=e.alternate;return e===A||t!==null&&t===A}function Ca(e,t){Pn=Yr=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function xa(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Zu(e,n)}}var Xr={readContext:_e,useCallback:ee,useContext:ee,useEffect:ee,useImperativeHandle:ee,useInsertionEffect:ee,useLayoutEffect:ee,useMemo:ee,useReducer:ee,useRef:ee,useState:ee,useDebugValue:ee,useDeferredValue:ee,useTransition:ee,useMutableSource:ee,useSyncExternalStore:ee,useId:ee,unstable_isNewReconciler:!1},nd={readContext:_e,useCallback:function(e,t){return De().memoizedState=[e,t===void 0?null:t],e},useContext:_e,useEffect:ki,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,xr(4194308,4,ya.bind(null,t,e),n)},useLayoutEffect:function(e,t){return xr(4194308,4,e,t)},useInsertionEffect:function(e,t){return xr(4,2,e,t)},useMemo:function(e,t){var n=De();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=De();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=ed.bind(null,A,e),[r.memoizedState,e]},useRef:function(e){var t=De();return e={current:e},t.memoizedState=e},useState:Si,useDebugValue:So,useDeferredValue:function(e){return De().memoizedState=e},useTransition:function(){var e=Si(!1),t=e[0];return e=bc.bind(null,e[1]),De().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=A,l=De();if(j){if(n===void 0)throw Error(y(407));n=n()}else{if(n=t(),Z===null)throw Error(y(349));xt&30||aa(r,t,n)}l.memoizedState=n;var u={value:n,getSnapshot:t};return l.queue=u,ki(ca.bind(null,r,u,e),[e]),r.flags|=2048,Kn(9,fa.bind(null,r,u,n,t),void 0,null),n},useId:function(){var e=De(),t=Z.identifierPrefix;if(j){var n=$e,r=Ve;n=(r&~(1<<32-Te(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Wn++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=o.createElement(n,{is:r.is}):(e=o.createElement(n),n==="select"&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,n),e[Ie]=t,e[$n]=r,Ia(e,t,!1,!1),t.stateNode=e;e:{switch(o=ru(n,r),n){case"dialog":D("cancel",e),D("close",e),l=r;break;case"iframe":case"object":case"embed":D("load",e),l=r;break;case"video":case"audio":for(l=0;lnn&&(t.flags|=128,r=!0,vn(u,!1),t.lanes=4194304)}else{if(!r)if(e=Kr(o),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),vn(u,!0),u.tail===null&&u.tailMode==="hidden"&&!o.alternate&&!j)return te(t),null}else 2*W()-u.renderingStartTime>nn&&n!==1073741824&&(t.flags|=128,r=!0,vn(u,!1),t.lanes=4194304);u.isBackwards?(o.sibling=t.child,t.child=o):(n=u.last,n!==null?n.sibling=o:t.child=o,u.last=o)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=W(),t.sibling=null,n=U.current,M(U,r?n&1|2:n&1),t):(te(t),null);case 22:case 23:return Po(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?pe&1073741824&&(te(t),t.subtreeFlags&6&&(t.flags|=8192)):te(t),null;case 24:return null;case 25:return null}throw Error(y(156,t.tag))}function fd(e,t){switch(uo(t),t.tag){case 1:return ce(t.type)&&Ar(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return en(),I(fe),I(re),vo(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return mo(t),null;case 13:if(I(U),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(y(340));qt()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return I(U),null;case 4:return en(),null;case 10:return ao(t.type._context),null;case 22:case 23:return Po(),null;case 24:return null;default:return null}}var vr=!1,ne=!1,cd=typeof WeakSet=="function"?WeakSet:Set,k=null;function Bt(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){$(e,t,r)}else n.current=null}function Tu(e,t,n){try{n()}catch(r){$(e,t,r)}}var Oi=!1;function dd(e,t){if(pu=Ir,e=Bs(),ro(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,u=r.focusNode;r=r.focusOffset;try{n.nodeType,u.nodeType}catch{n=null;break e}var o=0,i=-1,s=-1,f=0,v=0,m=e,p=null;t:for(;;){for(var g;m!==n||l!==0&&m.nodeType!==3||(i=o+l),m!==u||r!==0&&m.nodeType!==3||(s=o+r),m.nodeType===3&&(o+=m.nodeValue.length),(g=m.firstChild)!==null;)p=m,m=g;for(;;){if(m===e)break t;if(p===n&&++f===l&&(i=o),p===u&&++v===r&&(s=o),(g=m.nextSibling)!==null)break;m=p,p=m.parentNode}m=g}n=i===-1||s===-1?null:{start:i,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(mu={focusedElem:e,selectionRange:n},Ir=!1,k=t;k!==null;)if(t=k,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,k=e;else for(;k!==null;){t=k;try{var w=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var S=w.memoizedProps,F=w.memoizedState,c=t.stateNode,a=c.getSnapshotBeforeUpdate(t.elementType===t.type?S:Ne(t.type,S),F);c.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(y(163))}}catch(h){$(t,t.return,h)}if(e=t.sibling,e!==null){e.return=t.return,k=e;break}k=t.return}return w=Oi,Oi=!1,w}function Nn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var u=l.destroy;l.destroy=void 0,u!==void 0&&Tu(t,n,u)}l=l.next}while(l!==r)}}function al(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Ru(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Ua(e){var t=e.alternate;t!==null&&(e.alternate=null,Ua(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ie],delete t[$n],delete t[yu],delete t[Xc],delete t[Gc])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Aa(e){return e.tag===5||e.tag===3||e.tag===4}function Mi(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Aa(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ou(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Ur));else if(r!==4&&(e=e.child,e!==null))for(Ou(e,t,n),e=e.sibling;e!==null;)Ou(e,t,n),e=e.sibling}function Mu(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Mu(e,t,n),e=e.sibling;e!==null;)Mu(e,t,n),e=e.sibling}var J=null,ze=!1;function Xe(e,t,n){for(n=n.child;n!==null;)Va(e,t,n),n=n.sibling}function Va(e,t,n){if(Fe&&typeof Fe.onCommitFiberUnmount=="function")try{Fe.onCommitFiberUnmount(tl,n)}catch{}switch(n.tag){case 5:ne||Bt(n,t);case 6:var r=J,l=ze;J=null,Xe(e,t,n),J=r,ze=l,J!==null&&(ze?(e=J,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):J.removeChild(n.stateNode));break;case 18:J!==null&&(ze?(e=J,n=n.stateNode,e.nodeType===8?Il(e.parentNode,n):e.nodeType===1&&Il(e,n),Fn(e)):Il(J,n.stateNode));break;case 4:r=J,l=ze,J=n.stateNode.containerInfo,ze=!0,Xe(e,t,n),J=r,ze=l;break;case 0:case 11:case 14:case 15:if(!ne&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var u=l,o=u.destroy;u=u.tag,o!==void 0&&(u&2||u&4)&&Tu(n,t,o),l=l.next}while(l!==r)}Xe(e,t,n);break;case 1:if(!ne&&(Bt(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(i){$(n,t,i)}Xe(e,t,n);break;case 21:Xe(e,t,n);break;case 22:n.mode&1?(ne=(r=ne)||n.memoizedState!==null,Xe(e,t,n),ne=r):Xe(e,t,n);break;default:Xe(e,t,n)}}function Di(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new cd),t.forEach(function(r){var l=kd.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Pe(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=o),r&=~u}if(r=l,r=W()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*md(r/1960))-r,10e?16:e,et===null)var r=!1;else{if(e=et,et=null,Jr=0,R&6)throw Error(y(331));var l=R;for(R|=4,k=e.current;k!==null;){var u=k,o=u.child;if(k.flags&16){var i=u.deletions;if(i!==null){for(var s=0;sW()-Co?kt(e,0):_o|=n),de(e,t)}function Xa(e,t){t===0&&(e.mode&1?(t=or,or<<=1,!(or&130023424)&&(or=4194304)):t=1);var n=ue();e=Qe(e,t),e!==null&&(Gn(e,t,n),de(e,n))}function Sd(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Xa(e,n)}function kd(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(y(314))}r!==null&&r.delete(t),Xa(e,n)}var Ga;Ga=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||fe.current)ae=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ae=!1,sd(e,t,n);ae=!!(e.flags&131072)}else ae=!1,j&&t.flags&1048576&&bs(t,Br,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Pr(e,t),e=t.pendingProps;var l=Jt(t,re.current);Xt(t,n),l=yo(null,t,r,e,l,n);var u=go();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,ce(r)?(u=!0,Vr(t)):u=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,co(t),l.updater=sl,t.stateNode=l,l._reactInternals=t,_u(t,r,e,n),t=Pu(null,t,r,!0,u,n)):(t.tag=0,j&&u&&lo(t),le(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Pr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=_d(r),e=Ne(r,e),l){case 0:t=xu(null,t,r,e,n);break e;case 1:t=Li(null,t,r,e,n);break e;case 11:t=Ni(null,t,r,e,n);break e;case 14:t=zi(null,t,r,Ne(r.type,e),n);break e}throw Error(y(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ne(r,l),xu(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ne(r,l),Li(e,t,r,l,n);case 3:e:{if(Oa(t),e===null)throw Error(y(387));r=t.pendingProps,u=t.memoizedState,l=u.element,ua(e,t),Qr(t,r,null,n);var o=t.memoizedState;if(r=o.element,u.isDehydrated)if(u={element:r,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){l=tn(Error(y(423)),t),t=Ti(e,t,r,n,l);break e}else if(r!==l){l=tn(Error(y(424)),t),t=Ti(e,t,r,n,l);break e}else for(me=lt(t.stateNode.containerInfo.firstChild),ve=t,j=!0,Le=null,n=ra(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(qt(),r===l){t=Ke(e,t,n);break e}le(e,t,r,n)}t=t.child}return t;case 5:return oa(t),e===null&&Su(t),r=t.type,l=t.pendingProps,u=e!==null?e.memoizedProps:null,o=l.children,vu(r,l)?o=null:u!==null&&vu(r,u)&&(t.flags|=32),Ra(e,t),le(e,t,o,n),t.child;case 6:return e===null&&Su(t),null;case 13:return Ma(e,t,n);case 4:return po(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=bt(t,null,r,n):le(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ne(r,l),Ni(e,t,r,l,n);case 7:return le(e,t,t.pendingProps,n),t.child;case 8:return le(e,t,t.pendingProps.children,n),t.child;case 12:return le(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,u=t.memoizedProps,o=l.value,M(Hr,r._currentValue),r._currentValue=o,u!==null)if(Oe(u.value,o)){if(u.children===l.children&&!fe.current){t=Ke(e,t,n);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var i=u.dependencies;if(i!==null){o=u.child;for(var s=i.firstContext;s!==null;){if(s.context===r){if(u.tag===1){s=Be(-1,n&-n),s.tag=2;var f=u.updateQueue;if(f!==null){f=f.shared;var v=f.pending;v===null?s.next=s:(s.next=v.next,v.next=s),f.pending=s}}u.lanes|=n,s=u.alternate,s!==null&&(s.lanes|=n),ku(u.return,n,t),i.lanes|=n;break}s=s.next}}else if(u.tag===10)o=u.type===t.type?null:u.child;else if(u.tag===18){if(o=u.return,o===null)throw Error(y(341));o.lanes|=n,i=o.alternate,i!==null&&(i.lanes|=n),ku(o,n,t),o=u.sibling}else o=u.child;if(o!==null)o.return=u;else for(o=u;o!==null;){if(o===t){o=null;break}if(u=o.sibling,u!==null){u.return=o.return,o=u;break}o=o.return}u=o}le(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,Xt(t,n),l=_e(l),r=r(l),t.flags|=1,le(e,t,r,n),t.child;case 14:return r=t.type,l=Ne(r,t.pendingProps),l=Ne(r.type,l),zi(e,t,r,l,n);case 15:return La(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ne(r,l),Pr(e,t),t.tag=1,ce(r)?(e=!0,Vr(t)):e=!1,Xt(t,n),Pa(t,r,l),_u(t,r,l,n),Pu(null,t,r,!0,e,n);case 19:return Da(e,t,n);case 22:return Ta(e,t,n)}throw Error(y(156,t.tag))};function Za(e,t){return _s(e,t)}function Ed(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ke(e,t,n,r){return new Ed(e,t,n,r)}function zo(e){return e=e.prototype,!(!e||!e.isReactComponent)}function _d(e){if(typeof e=="function")return zo(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ku)return 11;if(e===Yu)return 14}return 2}function st(e,t){var n=e.alternate;return n===null?(n=ke(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Lr(e,t,n,r,l,u){var o=2;if(r=e,typeof e=="function")zo(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Mt:return Et(n.children,l,u,t);case Qu:o=8,l|=8;break;case Yl:return e=ke(12,n,t,l|2),e.elementType=Yl,e.lanes=u,e;case Xl:return e=ke(13,n,t,l),e.elementType=Xl,e.lanes=u,e;case Gl:return e=ke(19,n,t,l),e.elementType=Gl,e.lanes=u,e;case os:return cl(n,l,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ls:o=10;break e;case us:o=9;break e;case Ku:o=11;break e;case Yu:o=14;break e;case Ge:o=16,r=null;break e}throw Error(y(130,e==null?e:typeof e,""))}return t=ke(o,n,t,l),t.elementType=e,t.type=r,t.lanes=u,t}function Et(e,t,n,r){return e=ke(7,e,r,t),e.lanes=n,e}function cl(e,t,n,r){return e=ke(22,e,r,t),e.elementType=os,e.lanes=n,e.stateNode={isHidden:!1},e}function Hl(e,t,n){return e=ke(6,e,null,t),e.lanes=n,e}function Wl(e,t,n){return t=ke(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Cd(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Cl(0),this.expirationTimes=Cl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Cl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Lo(e,t,n,r,l,u,o,i,s){return e=new Cd(e,t,n,i,s),t===1?(t=1,u===!0&&(t|=8)):t=0,u=ke(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},co(u),e}function xd(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(ef)}catch(e){console.error(e)}}ef(),es.exports=ye;var Td=es.exports,Bi=Td;Ql.createRoot=Bi.createRoot,Ql.hydrateRoot=Bi.hydrateRoot;function Rd(){const[e,t]=Tn.useState([]);return Tn.useEffect(()=>{fetch("/apps").then(n=>n.json()).then(n=>t(Array.isArray(n)?n:[])).catch(()=>t([]))},[]),Rt.jsx("div",{className:"app-grid",children:e.map(n=>Rt.jsxs("div",{className:"app-card",onClick:()=>window.open(`http://${n.host}:${n.port}`,"_blank"),children:[Rt.jsx("img",{src:n.icon,alt:n.name,className:"app-icon"}),Rt.jsx("div",{className:"app-name",children:n.name})]},n.name))})}Ql.createRoot(document.getElementById("root")).render(Rt.jsx(wf.StrictMode,{children:Rt.jsx(Rd,{})})); diff --git a/frontend/dist/assets/index-DQwn-aJw.css b/frontend/dist/assets/index-DQwn-aJw.css new file mode 100644 index 0000000..8d26912 --- /dev/null +++ b/frontend/dist/assets/index-DQwn-aJw.css @@ -0,0 +1 @@ +.app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:24px;padding:12px}.app-card{display:flex;flex-direction:column;align-items:center;cursor:pointer;padding:16px;border-radius:16px;background-color:#f5f5f5;transition:background-color .2s ease}.app-card:hover{background-color:#e0e0e0}.app-icon{width:160px;height:160px;object-fit:contain;margin-bottom:12px}@media (min-width: 1024px){.app-icon{width:70px;height:70px}}.app-name{font-weight:600;font-size:2rem;text-align:center}@media (min-width: 1024px){.app-name{font-size:1rem}}@tailwind base;@tailwind components;@tailwind utilities; diff --git a/frontend/dist/icons/error.png b/frontend/dist/icons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..b292d3a1abdf81c8705c5ba928d8339a6b0caf41 GIT binary patch literal 1843 zcmV-32h8}1P)|W2n5cVvb5YUqJT;a*E#LBwFMQ3 zM4$zvr3K3!rIAAA5?Yjtr8A145dn*YvI|0}##i-)1m(pCE*g}m5lxIh;Gv@UnQxkE z-JUZ$yK{DDnK}RDOE$YR=koo|e&;f0PAH_Lq@<*zq@<*zq@<*zq@<*zq@<*zq@*NJ zI6S@=$)E@C{qfD$KOw>UQac4!>*7-V~tMIqmT44n2w@ejGr+N~Ak>_cQUf1|YI>U>44rVDIHBwkKlJ1?DW&&;2$>QQG}4Q% z6Q`Pflb3j(KI{Q0rT2k)_n!EmpdYyDI&o2alTvaYDQ$jon=r(TLWmhH5H+qq)M$s8 z34S!1Z2%zJ)C;2KCtf=SJO%(!vki{y?U_*k9nLo{c;#zgNr2hcmBl zw5<@f`uO|syHp)?y=4~+%q#4c=78J?{C;RxhW-I2WE_C#{)wZXf%c=jU02Ad?OVD+ znC3gnRs;_K+RnyrtfYHC@+a#T+(4<-PrF*vwtb=m;@vVVv5PfJvWa5x{X?%xqi07C~B z!O!n)PYZyisv1XSK-*olG?)OW#$bNY9O(f5I%dGQQBxh4;jxjW@Mo(LOaN44@NxY* zsQ^CRRF_o#Xn0Rx0gN7AVojK20hk+ko}0#u$+KYkr02N5l|^O;7XZ~5)Xu7q0^rKN z*B~b+pPR;sx>`7~ZY}pWoTXphyUqUqCXeM$j5?Po+ydA-e=+xdToA+=I4;6HGOUDq z4K4!u9soL76SPnf9H#*6oZEFluOR^>UjxA3*3Md(bck}|45#5GQJC^QfEz7uz}OKb z(g8f1L%%5%Swj|pAp;BH=HVv)1Av$b2Uf0f4WMPsYH7~zw8Jm0 z2?l^WQA5~yIt5Vt*P$n9^xbS!efS35ULcYddx+qESa03c?< zj>;EP0mKWU1y8Z@i6UPSVL* z0Jt!Q&cRln%ofAjtH zKv0Y-0Hy+<05Amr6aep?0SZ9yj4A-8UjgusD!|wC6#(Gj8k~Tm!KF1sYo~29TW=d15+z z*090R3mmvBBd>o%YW{m_mUHt<2>>3!h=-DT?Npki;p5G3_VC|9L&F#IO2^NXo-e+3 zg%6gb0YKqlq6d8YEBb~gwbJL|PmX_f-OmM?U^ z1;D%~ygMt^srb@erj`781%nB2>R1nlbya z6COOE(AqdqSyE;VHF={QzBO|vuhL~5)0G9oMaU+L8mBVi{Gc9L2KIK|)wyvgK{&Fv zCmz$41(gR+Eoz*~xby!9;<#CWCq?05MSecE68>{|yH(eiaWG>sUr9+xNl8gbNl8gb hNl8gbNhx$U=pWVyDb-cY_mltt002ovPDHLkV1hWYQ%wK> literal 0 HcmV?d00001 diff --git a/frontend/dist/index.html b/frontend/dist/index.html new file mode 100644 index 0000000..4bf325c --- /dev/null +++ b/frontend/dist/index.html @@ -0,0 +1,13 @@ + + + + + + LAN Dashboard + + + + +
+ + diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..e5bc940 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + LAN Dashboard + + +
+ + + diff --git a/frontend/not-applicable.jpg b/frontend/not-applicable.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8c5fa9daec8512faabebe28444bcd70233b03d4 GIT binary patch literal 49360 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 r5GWWboOkC|2s1FKS9>VB=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "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/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.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/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/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/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/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.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.6.tgz", + "integrity": "sha512-QaYtTHlr8kDFN5mE1wbvVARRKH7Fdw1ZuOjBJcFdVpfNfRYKF3QLT4rt+WaB6CKJvpqxRsmEo0kpYinhH5GeHg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.6.tgz", + "integrity": "sha512-R4DaYF3dgCQCUAkr4wW1w26GHXcf5rCmBRHVBuuvJvaGLmZdD8EjatP80Nz5JCw0KxORAzwftnHzXVnjR8HnFw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/core-downloads-tracker": "^7.3.6", + "@mui/system": "^7.3.6", + "@mui/types": "^7.4.9", + "@mui/utils": "^7.3.6", + "@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.2.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": "^7.3.6", + "@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/private-theming": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.6.tgz", + "integrity": "sha512-Ws9wZpqM+FlnbZXaY/7yvyvWQo1+02Tbx50mVdNmzWEi51C51y56KAbaDCYyulOOBL6BJxuaqG8rNNuj7ivVyw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.6", + "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": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.6.tgz", + "integrity": "sha512-+wiYbtvj+zyUkmDB+ysH6zRjuQIJ+CM56w0fEXV+VDNdvOuSywG+/8kpjddvvlfMLsaWdQe5oTuYGBcodmqGzQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@emotion/cache": "^11.14.0", + "@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": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.6.tgz", + "integrity": "sha512-8fehAazkHNP1imMrdD2m2hbA9sl7Ur6jfuNweh5o4l9YPty4iaZzRXqYvBCWQNwFaSHmMEj2KPbyXGp7Bt73Rg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/private-theming": "^7.3.6", + "@mui/styled-engine": "^7.3.6", + "@mui/types": "^7.4.9", + "@mui/utils": "^7.3.6", + "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/types": { + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.9.tgz", + "integrity": "sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.6.tgz", + "integrity": "sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/types": "^7.4.9", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.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/@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/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "dev": true, + "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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "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/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", + "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz", + "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001759", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", + "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/electron-to-chromium": { + "version": "1.5.266", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", + "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "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", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "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/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-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-is": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.1.tgz", + "integrity": "sha512-L7BnWgRbMwzMAubQcS7sXdPdNLmKlucPlopgAzx7FtYbksWZgEWiuYM5x9T6UqS2Ne0rsgQTq5kY2SGqpzUkYA==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "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/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" + } + }, + "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": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/tailwindcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.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", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..43a7741 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,22 @@ +{ + "name": "dashboard-frontend", + "version": "1.0.0", + "description": "React + Vite dashboard per visualizzare app locali", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@mui/material": "^7.3.6", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.0.0", + "autoprefixer": "^10.4.22", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.17", + "vite": "^5.0.0" + } +} diff --git a/frontend/public/icons/error.png b/frontend/public/icons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..b292d3a1abdf81c8705c5ba928d8339a6b0caf41 GIT binary patch literal 1843 zcmV-32h8}1P)|W2n5cVvb5YUqJT;a*E#LBwFMQ3 zM4$zvr3K3!rIAAA5?Yjtr8A145dn*YvI|0}##i-)1m(pCE*g}m5lxIh;Gv@UnQxkE z-JUZ$yK{DDnK}RDOE$YR=koo|e&;f0PAH_Lq@<*zq@<*zq@<*zq@<*zq@<*zq@*NJ zI6S@=$)E@C{qfD$KOw>UQac4!>*7-V~tMIqmT44n2w@ejGr+N~Ak>_cQUf1|YI>U>44rVDIHBwkKlJ1?DW&&;2$>QQG}4Q% z6Q`Pflb3j(KI{Q0rT2k)_n!EmpdYyDI&o2alTvaYDQ$jon=r(TLWmhH5H+qq)M$s8 z34S!1Z2%zJ)C;2KCtf=SJO%(!vki{y?U_*k9nLo{c;#zgNr2hcmBl zw5<@f`uO|syHp)?y=4~+%q#4c=78J?{C;RxhW-I2WE_C#{)wZXf%c=jU02Ad?OVD+ znC3gnRs;_K+RnyrtfYHC@+a#T+(4<-PrF*vwtb=m;@vVVv5PfJvWa5x{X?%xqi07C~B z!O!n)PYZyisv1XSK-*olG?)OW#$bNY9O(f5I%dGQQBxh4;jxjW@Mo(LOaN44@NxY* zsQ^CRRF_o#Xn0Rx0gN7AVojK20hk+ko}0#u$+KYkr02N5l|^O;7XZ~5)Xu7q0^rKN z*B~b+pPR;sx>`7~ZY}pWoTXphyUqUqCXeM$j5?Po+ydA-e=+xdToA+=I4;6HGOUDq z4K4!u9soL76SPnf9H#*6oZEFluOR^>UjxA3*3Md(bck}|45#5GQJC^QfEz7uz}OKb z(g8f1L%%5%Swj|pAp;BH=HVv)1Av$b2Uf0f4WMPsYH7~zw8Jm0 z2?l^WQA5~yIt5Vt*P$n9^xbS!efS35ULcYddx+qESa03c?< zj>;EP0mKWU1y8Z@i6UPSVL* z0Jt!Q&cRln%ofAjtH zKv0Y-0Hy+<05Amr6aep?0SZ9yj4A-8UjgusD!|wC6#(Gj8k~Tm!KF1sYo~29TW=d15+z z*090R3mmvBBd>o%YW{m_mUHt<2>>3!h=-DT?Npki;p5G3_VC|9L&F#IO2^NXo-e+3 zg%6gb0YKqlq6d8YEBb~gwbJL|PmX_f-OmM?U^ z1;D%~ygMt^srb@erj`781%nB2>R1nlbya z6COOE(AqdqSyE;VHF={QzBO|vuhL~5)0G9oMaU+L8mBVi{Gc9L2KIK|)wyvgK{&Fv zCmz$41(gR+Eoz*~xby!9;<#CWCq?05MSecE68>{|yH(eiaWG>sUr9+xNl8gbNl8gb hNl8gbNhx$U=pWVyDb-cY_mltt002ovPDHLkV1hWYQ%wK> literal 0 HcmV?d00001 diff --git a/frontend/src/App.css b/frontend/src/App.css new file mode 100644 index 0000000..e9c2edf --- /dev/null +++ b/frontend/src/App.css @@ -0,0 +1,74 @@ +/* Griglia adattiva */ +.app-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 24px; + padding: 12px; +} + +/*@media (min-width: 1200px) { + .app-grid { + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + gap: 24px; + padding: 32px; + } +*/ +/* Card stile folder */ +.app-card { + display: flex; + flex-direction: column; + align-items: center; + cursor: pointer; + padding: 16px; + border-radius: 16px; + background-color: #f5f5f5; + transition: background-color 0.2s ease; +} + +.app-card:hover { + background-color: #e0e0e0; +} + +/* Icone raddoppiate +.app-icon { + width: 160px; + height: 160px; + object-fit: contain; + margin-bottom: 12px; +} +*/ +.app-icon { + width: 160px; + height: 160px; + object-fit: contain; + margin-bottom: 12px; +} + +@media (min-width: 1024px) { + .app-icon { + width: 70px; + height: 70px; + } +} + + +/* Nome raddoppiato e bold +.app-name { + font-weight: 600; + font-size: 2rem; + text-align: center; +} +*/ + +.app-name { + font-weight: 600; + font-size: 2rem; /* circa 32px */ + text-align: center; +} + +@media (min-width: 1024px) { + .app-name { + font-size: 1rem; /* circa 19px */ + } +} + diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx new file mode 100644 index 0000000..8f080e1 --- /dev/null +++ b/frontend/src/App.jsx @@ -0,0 +1,30 @@ +import React, { useEffect, useState } from "react"; +import "./App.css"; // importiamo lo stile CSS + +function AppGrid() { + const [apps, setApps] = useState([]); + + useEffect(() => { + fetch("/apps") + .then(res => res.json()) + .then(data => setApps(Array.isArray(data) ? data : [])) + .catch(() => setApps([])); + }, []); + + return ( +
+ {apps.map(app => ( +
window.open(`http://${app.host}:${app.port}`, "_blank")} + > + {app.name} +
{app.name}
+
+ ))} +
+ ); +} + +export default AppGrid; diff --git a/frontend/src/App.jsx.old b/frontend/src/App.jsx.old new file mode 100644 index 0000000..689dc02 --- /dev/null +++ b/frontend/src/App.jsx.old @@ -0,0 +1,48 @@ +import React, { useEffect, useState } from "react"; + +function AppGrid() { + const [apps, setApps] = useState([]); + + useEffect(() => { + fetch("/apps") + .then(res => res.json()) + .then(data => setApps(data)); + }, []); + + return ( +
+ {apps.map(app => ( +
window.open(`http://${app.host}:${app.port}`, "_blank")} + > + {/* Se app.icon è un URL o un path locale */} + {app.name} +
{app.name}
+
+ {app.host}:{app.port} +
+
+ ))} +
+ ); +} + +export default AppGrid; diff --git a/frontend/src/App.jsx.old1 b/frontend/src/App.jsx.old1 new file mode 100644 index 0000000..e26e061 --- /dev/null +++ b/frontend/src/App.jsx.old1 @@ -0,0 +1,45 @@ +import React, { useEffect, useState } from "react"; + +function AppGrid() { + const [apps, setApps] = useState([]); + + useEffect(() => { + fetch("/apps") + .then(res => res.json()) + .then(data => setApps(data)); + }, []); + + return ( +
+ {apps.map(app => ( +
window.open(`http://${app.host}:${app.port}`, "_blank")} + > + {/* Icona grande il doppio */} + {app.name} + {/* Nome sotto l'icona */} +
{app.name}
+
+ ))} +
+ ); +} + +export default AppGrid; diff --git a/frontend/src/App.jsx.old2 b/frontend/src/App.jsx.old2 new file mode 100644 index 0000000..e26e061 --- /dev/null +++ b/frontend/src/App.jsx.old2 @@ -0,0 +1,45 @@ +import React, { useEffect, useState } from "react"; + +function AppGrid() { + const [apps, setApps] = useState([]); + + useEffect(() => { + fetch("/apps") + .then(res => res.json()) + .then(data => setApps(data)); + }, []); + + return ( +
+ {apps.map(app => ( +
window.open(`http://${app.host}:${app.port}`, "_blank")} + > + {/* Icona grande il doppio */} + {app.name} + {/* Nome sotto l'icona */} +
{app.name}
+
+ ))} +
+ ); +} + +export default AppGrid; diff --git a/frontend/src/errore.png b/frontend/src/errore.png new file mode 100644 index 0000000000000000000000000000000000000000..b292d3a1abdf81c8705c5ba928d8339a6b0caf41 GIT binary patch literal 1843 zcmV-32h8}1P)|W2n5cVvb5YUqJT;a*E#LBwFMQ3 zM4$zvr3K3!rIAAA5?Yjtr8A145dn*YvI|0}##i-)1m(pCE*g}m5lxIh;Gv@UnQxkE z-JUZ$yK{DDnK}RDOE$YR=koo|e&;f0PAH_Lq@<*zq@<*zq@<*zq@<*zq@<*zq@*NJ zI6S@=$)E@C{qfD$KOw>UQac4!>*7-V~tMIqmT44n2w@ejGr+N~Ak>_cQUf1|YI>U>44rVDIHBwkKlJ1?DW&&;2$>QQG}4Q% z6Q`Pflb3j(KI{Q0rT2k)_n!EmpdYyDI&o2alTvaYDQ$jon=r(TLWmhH5H+qq)M$s8 z34S!1Z2%zJ)C;2KCtf=SJO%(!vki{y?U_*k9nLo{c;#zgNr2hcmBl zw5<@f`uO|syHp)?y=4~+%q#4c=78J?{C;RxhW-I2WE_C#{)wZXf%c=jU02Ad?OVD+ znC3gnRs;_K+RnyrtfYHC@+a#T+(4<-PrF*vwtb=m;@vVVv5PfJvWa5x{X?%xqi07C~B z!O!n)PYZyisv1XSK-*olG?)OW#$bNY9O(f5I%dGQQBxh4;jxjW@Mo(LOaN44@NxY* zsQ^CRRF_o#Xn0Rx0gN7AVojK20hk+ko}0#u$+KYkr02N5l|^O;7XZ~5)Xu7q0^rKN z*B~b+pPR;sx>`7~ZY}pWoTXphyUqUqCXeM$j5?Po+ydA-e=+xdToA+=I4;6HGOUDq z4K4!u9soL76SPnf9H#*6oZEFluOR^>UjxA3*3Md(bck}|45#5GQJC^QfEz7uz}OKb z(g8f1L%%5%Swj|pAp;BH=HVv)1Av$b2Uf0f4WMPsYH7~zw8Jm0 z2?l^WQA5~yIt5Vt*P$n9^xbS!efS35ULcYddx+qESa03c?< zj>;EP0mKWU1y8Z@i6UPSVL* z0Jt!Q&cRln%ofAjtH zKv0Y-0Hy+<05Amr6aep?0SZ9yj4A-8UjgusD!|wC6#(Gj8k~Tm!KF1sYo~29TW=d15+z z*090R3mmvBBd>o%YW{m_mUHt<2>>3!h=-DT?Npki;p5G3_VC|9L&F#IO2^NXo-e+3 zg%6gb0YKqlq6d8YEBb~gwbJL|PmX_f-OmM?U^ z1;D%~ygMt^srb@erj`781%nB2>R1nlbya z6COOE(AqdqSyE;VHF={QzBO|vuhL~5)0G9oMaU+L8mBVi{Gc9L2KIK|)wyvgK{&Fv zCmz$41(gR+Eoz*~xby!9;<#CWCq?05MSecE68>{|yH(eiaWG>sUr9+xNl8gbNl8gb hNl8gbNhx$U=pWVyDb-cY_mltt002ovPDHLkV1hWYQ%wK> literal 0 HcmV?d00001 diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx new file mode 100644 index 0000000..e90731f --- /dev/null +++ b/frontend/src/main.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import AppGrid from "./App.jsx"; +import "./index.css"; // importa Tailwind + +ReactDOM.createRoot(document.getElementById("root")).render( + + + +); diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..99ce970 --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,25 @@ +// tailwind.config.js +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}" + ], + theme: { + extend: { + screens: { + xs: "480px", // breakpoint extra per smartphone piccoli + sm: "640px", // tablet piccoli + md: "768px", // tablet medi + lg: "1024px", // laptop + xl: "1280px", // desktop grandi + }, + spacing: { + 18: "4.5rem", // utile per padding/margin extra + }, + colors: { + brand: "#1e40af", // blu personalizzato per titoli o hover + }, + }, + }, + plugins: [], +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..ccaaf1b --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,9 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], + build: { + outDir: "dist" + } +});