From cb12290ecc77cf7b7841f1fdc129204885048df4 Mon Sep 17 00:00:00 2001 From: LIRUI <298977887@qq.com> Date: Fri, 7 Mar 2025 02:22:25 +0800 Subject: [PATCH] first commit --- .env | 11 + .gitignore | 29 + README.md | 54 + electron-builder.js | 20 + electron.tsconfig.json | 14 + electron/main.ts | 294 ++ electron/preload.ts | 8 + eslint.config.js | 28 + index.html | 13 + package.json | 52 + pnpm-lock.yaml | 4335 ++++++++++++++++++++++ postcss.config.js | 6 + public/Snowboy-wakeup.pmdl | Bin 0 -> 11899 bytes public/test-audio.mp3 | Bin 0 -> 40752 bytes public/vite.svg | 1 + src/App.css | 42 + src/App.tsx | 99 + src/assets/react.svg | 1 + src/components/AnalogClock.tsx | 47 + src/components/CalendarGrid.tsx | 23 + src/components/NewsSection.tsx | 90 + src/components/VoiceAssistant copy 2.tsx | 407 ++ src/components/VoiceAssistant copy.tsx | 239 ++ src/components/VoiceAssistant.tsx | 340 ++ src/components/WeatherIcons.tsx | 53 + src/components/WeatherSection.tsx | 134 + src/index.css | 68 + src/main.tsx | 11 + src/styles/globals.css | 24 + src/types/magic-mirror.d.ts | 88 + src/utils/calendar.ts | 18 + src/vite-env.d.ts | 1 + tailwind.config.js | 18 + tsconfig.app.json | 26 + tsconfig.json | 8 + tsconfig.node.json | 30 + tsconfig.vite.json | 4 + vite.config.ts | 23 + 38 files changed, 6659 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 README.md create mode 100644 electron-builder.js create mode 100644 electron.tsconfig.json create mode 100644 electron/main.ts create mode 100644 electron/preload.ts create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.js create mode 100644 public/Snowboy-wakeup.pmdl create mode 100644 public/test-audio.mp3 create mode 100644 public/vite.svg create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/components/AnalogClock.tsx create mode 100644 src/components/CalendarGrid.tsx create mode 100644 src/components/NewsSection.tsx create mode 100644 src/components/VoiceAssistant copy 2.tsx create mode 100644 src/components/VoiceAssistant copy.tsx create mode 100644 src/components/VoiceAssistant.tsx create mode 100644 src/components/WeatherIcons.tsx create mode 100644 src/components/WeatherSection.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/styles/globals.css create mode 100644 src/types/magic-mirror.d.ts create mode 100644 src/utils/calendar.ts create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 tsconfig.vite.json create mode 100644 vite.config.ts diff --git a/.env b/.env new file mode 100644 index 0000000..6ebde26 --- /dev/null +++ b/.env @@ -0,0 +1,11 @@ +# 聚合数据API +JUHE_NEWS_KEY=edbc3b96f022b59141961e2137f69b4a + +# 彩云天气API +CAIYUN_API_KEY=29-CwtZrOXU1b3Cx + +# 和风天气API +QWEATHER_API_KEY=ecd25018448140f1a8d23675c235e5b7 + +# vite api配置 +VITE_API_BASE=http://localhost:${API_PORT} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f127a48 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# 排除dist、dist-electron、node_modules目录 +/dist +/dist-electron +/node_modules \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..40ede56 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/electron-builder.js b/electron-builder.js new file mode 100644 index 0000000..153b841 --- /dev/null +++ b/electron-builder.js @@ -0,0 +1,20 @@ +const { build } = require('vite') + +async function main() { + await build({ + configFile: 'vite.config.ts', + build: { + outDir: 'dist' + } + }) + + require('esbuild').buildSync({ + entryPoints: ['electron/main.ts'], + bundle: true, + platform: 'node', + outfile: 'dist-electron/main.js', + external: ['electron'] + }) +} + +main() \ No newline at end of file diff --git a/electron.tsconfig.json b/electron.tsconfig.json new file mode 100644 index 0000000..a53e440 --- /dev/null +++ b/electron.tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "CommonJS", + "rootDir": "electron", + "outDir": "dist-electron", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "types": ["node"], + "noEmit": false + }, + "include": ["electron/**/*.ts"] + } \ No newline at end of file diff --git a/electron/main.ts b/electron/main.ts new file mode 100644 index 0000000..41ded29 --- /dev/null +++ b/electron/main.ts @@ -0,0 +1,294 @@ +// electron/main.ts +import { app, BrowserWindow, Menu, globalShortcut, net, ipcMain } from 'electron'; +import path from 'path'; +import http from 'http'; +import { URL } from 'url'; +//import { apiRoutes } from './api'; // 导入API路由配置 +import dotenv from 'dotenv'; +dotenv.config({ path: path.join(__dirname, '../.env') }); // 根据实际路径调整 + +// 确保在news.ts中能读取到 +console.log('JUHE_KEY:', process.env.JUHE_NEWS_KEY?.substring(0, 3) + '***'); // 打印前3位验证 +console.log('CAIYUN_KEY:', process.env.CAIYUN_API_KEY?.substring(0, 3) + '***'); // 打印前3位验证 + +dotenv.config({ path: path.join(__dirname, '../.env') }); + +// 环境配置 +const isDev = process.env.NODE_ENV === 'development'; + +// 注册 IPC 处理器 +function registerIpcHandlers() { + // 天气接口(需要修改) + ipcMain.handle('get-weather', async (_, { lon, lat }) => { + console.log('[IPC] 开始获取天气数据', { lon, lat }); + + // 检查缓存有效性 + const now = Date.now(); + if (now - apiCache.weather.timestamp < apiCache.weather.ttl) { + console.log('[Cache] 返回缓存的天气数据'); + return apiCache.weather.data; + } + + try { + const apiKey = process.env.CAIYUN_API_KEY!; + const apiUrl = `https://api.caiyunapp.com/v2.6/${apiKey}/${lon},${lat}/weather`; + + const response = await net.fetch(apiUrl); + const jsonData = await response.json(); + + if (jsonData.status !== 'ok') { + throw new Error(jsonData.message || '天气数据获取失败'); + } + + // 详细数据格式化 + const formattedData = { + realtime: formatRealtime(jsonData.result.realtime), + forecast: formatDailyForecast(jsonData.result.daily) + }; + + console.log('[IPC] 格式化天气数据:', formattedData); + // 更新缓存 + apiCache.weather.data = formattedData; + apiCache.weather.timestamp = now; + + return formattedData; + } catch (error: any) { + console.error('[IPC] 天气请求失败:', error); + return { + error: true, + message: error.message + }; + } + }); + + // 实时天气格式化 + const formatRealtime = (data: any) => ({ + temperature: data.temperature.toFixed(1), + humidity: (data.humidity * 100).toFixed(1) + '%', + wind: { + speed: (data.wind.speed * 3.6).toFixed(1) + 'km/h', + direction: getWindDirection(data.wind.direction) + }, + airQuality: { + aqi: data.air_quality.aqi.chn, + description: data.air_quality.description.chn + }, + skycon: data.skycon, + apparentTemperature: data.apparent_temperature.toFixed(1) + }); + + // 天气预报格式化 + const formatDailyForecast = (data: any) => ({ + temperature: data.temperature.map((item: any) => ({ + date: item.date, + max: item.max, + min: item.min + })), + skycon: data.skycon, + precipitation: data.precipitation + }); + + // 风向转换 + const getWindDirection = (degrees: number) => { + const directions = ['北风', '东北风', '东风', '东南风', '南风', '西南风', '西风', '西北风']; + return directions[Math.round(degrees % 360 / 45) % 8]; + }; + + // 新闻接口 + ipcMain.handle('get-news', async () => { + console.log('[IPC] 开始获取新闻数据'); + const now = Date.now(); + + if (now - apiCache.news.timestamp < apiCache.news.ttl) { + console.log('[Cache] 返回缓存的新闻数据'); + return apiCache.news.data; + } + + try { + const apiKey = process.env.JUHE_NEWS_KEY!; + const response = await net.fetch( + `https://v.juhe.cn/toutiao/index?type=top&key=${apiKey}` + ); + const json = await response.json(); + console.log('[IPC] 新闻响应:', json); // 添加原始响应日志 + const formatted = formatNews(json.result?.data || []); + // 更新缓存 + apiCache.news.data = formatted; + apiCache.news.timestamp = now; + return formatted; + //return formatNews(json.result?.data || []); + } catch (error) { + console.error('[IPC] 新闻请求失败:', error); + throw error; + } + }); +} + +const formatNews = (items: any[]) => items.map(item => ({ + uniquekey: item.uniquekey, + title: item.title, + date: item.date, + category: item.category || "头条新闻", + author_name: item.author_name || "未知作者", + url: item.url, + thumbnail_pic_s: item.thumbnail_pic_s, + is_content: item.is_content +})); + + +// 添加缓存对象 +const apiCache = { + weather: { + data: null as any, + timestamp: 0, + //ttl: 1800000 // 30分钟缓存 + //6小时缓存 + ttl: 21600000 + }, + news: { + data: null as any, + timestamp: 0, + //ttl: 3600000 // 1小时缓存 + //2小时缓存 + ttl: 7200000 + } +}; + + + + + + + + + +// 禁用默认菜单(提升安全性和专业性) +Menu.setApplicationMenu(null); + +/** + * 创建主窗口 + */ +async function createWindow() { + const mainWindow = new BrowserWindow({ + width: 1200, + height: 800, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + contextIsolation: true, // 启用上下文隔离(安全必需) + nodeIntegration: false, // 禁用Node集成(安全要求) + webSecurity: !isDev, // 生产环境启用安全策略 + sandbox: true // 启用沙箱模式 + }, + show: false // 先隐藏窗口直到内容加载完成 + }); + + // 优化加载体验 + mainWindow.once('ready-to-show', () => { + mainWindow.show(); + if (isDev) { + //mainWindow.webContents.openDevTools({ mode: 'detach' }); // 打开开发者工具 + console.log('Developer tools opened in detached mode'); + } + }); + + // 新增权限处理代码(必须在loadURL之前) + const ses = mainWindow.webContents.session; + + // 自动处理权限请求 + ses.setPermissionRequestHandler((webContents, permission, callback) => { + const allowedPermissions = new Set(['media', 'microphone', 'audioCapture']); + callback(allowedPermissions.has(permission)); + }); + + // 自动授予设备权限 + // 替换原来的setDevicePermissionHandler + ses.setPermissionRequestHandler((webContents, permission, callback) => { + // 统一允许所有媒体相关权限 + if (['microphone', 'audioCapture', 'media'].includes(permission)) { + return callback(true); + } + callback(false); + }); + + // 加载内容 + const loadURL = isDev + ? 'http://localhost:5173' + : `file://${path.join(__dirname, '../dist/index.html')}`; + + console.log(`Loading URL: ${loadURL}`); + await mainWindow.loadURL(loadURL); + + registerGlobalShortcuts(mainWindow); + return mainWindow; +} + +/** + * 统一响应格式(带安全头) + */ +function sendResponse( + res: http.ServerResponse, + status: number, + data: unknown, + headers: Record = {} +) { + const securityHeaders = { + 'Content-Security-Policy': "default-src 'self'", + 'X-Content-Type-Options': 'nosniff', + 'X-Frame-Options': 'DENY' + }; + + const responseHeaders = { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + ...securityHeaders, + ...headers + }; + + res.writeHead(status, responseHeaders); + res.end(JSON.stringify(data)); +} + +/** + * 注册全局快捷键 + */ +function registerGlobalShortcuts(win: BrowserWindow) { + const shortcut = process.platform === 'darwin' ? 'Command+Q' : 'Ctrl+Q'; + + const ret = globalShortcut.register(shortcut, () => { + console.log('Gracefully shutting down...'); + win.destroy(); + app.quit(); + }); + + if (!ret) { + console.error('Failed to register shortcut'); + } +} + +/** + * 应用启动流程 + */ +app.whenReady() + .then(() => { + // 注册 IPC 处理器的代码 + registerIpcHandlers(); + console.log('Creating browser window...'); + return createWindow(); + }) + .catch((error) => { + console.error('App initialization failed:', error); + app.quit(); + }); + +/** + * 生命周期管理 + */ +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('will-quit', () => { + globalShortcut.unregisterAll(); +}); \ No newline at end of file diff --git a/electron/preload.ts b/electron/preload.ts new file mode 100644 index 0000000..cf74f56 --- /dev/null +++ b/electron/preload.ts @@ -0,0 +1,8 @@ +//electron\preload.ts +import { contextBridge, ipcRenderer } from 'electron'; + +contextBridge.exposeInMainWorld('electronAPI', { + getWeather: (params: { lon: number; lat: number }) => + ipcRenderer.invoke('get-weather', params), + getNews: () => ipcRenderer.invoke('get-news') +}); \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/index.html b/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..ee8aa7d --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "my-vite-app", + "private": true, + "version": "0.0.0", + "main": "dist-electron/main.js", + "scripts": { + "build:rpi": "vite build --emptyOutDir && tsc -p electron.tsconfig.json", + "electron:start-pi": "cross-env NODE_ENV=production electron --arch=arm64 dist-electron/main.js", + "dev": "concurrently -k \"vite\" \"npm run dev:electron\"", + "dev:electron": "concurrently -k \"npm run watch:electron\" \"npm run start:electron\"", + "watch:electron": "cross-env NODE_ENV=development tsc -p electron.tsconfig.json --watch --preserveWatchOutput", + "start:electron": "cross-env NODE_ENV=development electron dist-electron/main.js", + "vite": "vite", + "build": "vite build && tsc -p electron.tsconfig.json", + "electron:start": "cross-env NODE_ENV=production electron dist-electron/main.js" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/icons-material": "^6.4.5", + "@mui/material": "^6.4.5", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-icons": "^5.5.0", + "swr": "^2.3.2" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/node": "^22.13.8", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "concurrently": "^9.1.2", + "cross-env": "^7.0.3", + "dotenv": "^16.4.7", + "electron": "33.2.0", + "electron-devtools-installer": "^4.0.0", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "nan": "^2.22.2", + "node-gyp": "^11.1.0", + "nodemon": "^3.1.9", + "postcss": "^8.5.3", + "tailwindcss": "3.4.17", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..b4a6606 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4335 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@emotion/react': + specifier: ^11.14.0 + version: 11.14.0(@types/react@19.0.10)(react@19.0.0) + '@emotion/styled': + specifier: ^11.14.0 + version: 11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0) + '@mui/icons-material': + specifier: ^6.4.5 + version: 6.4.6(@mui/material@6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.10)(react@19.0.0) + '@mui/material': + specifier: ^6.4.5 + version: 6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-icons: + specifier: ^5.5.0 + version: 5.5.0(react@19.0.0) + swr: + specifier: ^2.3.2 + version: 2.3.2(react@19.0.0) + devDependencies: + '@eslint/js': + specifier: ^9.21.0 + version: 9.21.0 + '@types/node': + specifier: ^22.13.8 + version: 22.13.8 + '@types/react': + specifier: ^19.0.10 + version: 19.0.10 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.0.4(@types/react@19.0.10) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.0(@types/node@22.13.8)(jiti@1.21.7)(yaml@2.7.0)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.3) + concurrently: + specifier: ^9.1.2 + version: 9.1.2 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + electron: + specifier: 33.2.0 + version: 33.2.0 + electron-devtools-installer: + specifier: ^4.0.0 + version: 4.0.0 + eslint: + specifier: ^9.21.0 + version: 9.21.0(jiti@1.21.7) + eslint-plugin-react-hooks: + specifier: ^5.1.0 + version: 5.2.0(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react-refresh: + specifier: ^0.4.19 + version: 0.4.19(eslint@9.21.0(jiti@1.21.7)) + globals: + specifier: ^15.15.0 + version: 15.15.0 + nan: + specifier: ^2.22.2 + version: 2.22.2 + node-gyp: + specifier: ^11.1.0 + version: 11.1.0 + nodemon: + specifier: ^3.1.9 + version: 3.1.9 + postcss: + specifier: ^8.5.3 + version: 8.5.3 + tailwindcss: + specifier: 3.4.17 + version: 3.4.17 + typescript: + specifier: ~5.7.2 + version: 5.7.3 + typescript-eslint: + specifier: ^8.24.1 + version: 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + vite: + specifier: ^6.2.0 + version: 6.2.0(@types/node@22.13.8)(jiti@1.21.7)(yaml@2.7.0) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.9': + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.9': + resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.14.0': + resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mui/core-downloads-tracker@6.4.6': + resolution: {integrity: sha512-rho5Q4IscbrVmK9rCrLTJmjLjfH6m/NcqKr/mchvck0EIXlyYUB9+Z0oVmkt/+Mben43LMRYBH8q/Uzxj/c4Vw==} + + '@mui/icons-material@6.4.6': + resolution: {integrity: sha512-rGJBvIQQbQAlyKYljHQ8wAQS/K2/uYwvemcpygnAmCizmCI4zSF9HQPuiG8Ql4YLZ6V/uKjA3WHIYmF/8sV+pQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@mui/material': ^6.4.6 + '@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 + + '@mui/material@6.4.6': + resolution: {integrity: sha512-6UyAju+DBOdMogfYmLiT3Nu7RgliorimNBny1pN/acOjc+THNFVE7hlxLyn3RDONoZJNDi/8vO4AQQr6dLAXqA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material-pigment-css': ^6.4.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 + + '@mui/private-theming@6.4.6': + resolution: {integrity: sha512-T5FxdPzCELuOrhpA2g4Pi6241HAxRwZudzAuL9vBvniuB5YU82HCmrARw32AuCiyTfWzbrYGGpZ4zyeqqp9RvQ==} + engines: {node: '>=14.0.0'} + 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 + + '@mui/styled-engine@6.4.6': + resolution: {integrity: sha512-vSWYc9ZLX46be5gP+FCzWVn5rvDr4cXC5JBZwSIkYk9xbC7GeV+0kCvB8Q6XLFQJy+a62bbqtmdwS4Ghi9NBlQ==} + engines: {node: '>=14.0.0'} + 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 + + '@mui/system@6.4.6': + resolution: {integrity: sha512-FQjWwPec7pMTtB/jw5f9eyLynKFZ6/Ej9vhm5kGdtmts1z5b7Vyn3Rz6kasfYm1j2TfrfGnSXRvvtwVWxjpz6g==} + engines: {node: '>=14.0.0'} + 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 + + '@mui/types@7.2.21': + resolution: {integrity: sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@6.4.6': + resolution: {integrity: sha512-43nZeE1pJF2anGafNydUcYFPtHwAqiBiauRtaMvurdrZI3YrUjHkAu43RBsxef7OFtJMXGiHFvq43kb7lig0sA==} + engines: {node: '>=14.0.0'} + 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 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@rollup/rollup-android-arm-eabi@4.34.9': + resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.9': + resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.9': + resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.9': + resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.9': + resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.9': + resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.9': + resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.34.9': + resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.34.9': + resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.34.9': + resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.9': + resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': + resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.34.9': + resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-s390x-gnu@4.34.9': + resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.34.9': + resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.34.9': + resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.34.9': + resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.9': + resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.9': + resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/node@20.17.22': + resolution: {integrity: sha512-9RV2zST+0s3EhfrMZIhrz2bhuhBwxgkbHEwP2gtGWPjBzVQjifMzJ9exw7aDZhR1wbpj8zBrfp3bo8oJcGiUUw==} + + '@types/node@22.13.8': + resolution: {integrity: sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' + + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + abbrev@3.0.0: + resolution: {integrity: sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==} + engines: {node: ^18.17.0 || >=20.5.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + engines: {node: '>=18'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-devtools-installer@4.0.0: + resolution: {integrity: sha512-9Tntu/jtfSn0n6N/ZI6IdvRqXpDyLQiDuuIbsBI+dL+1Ef7C8J2JwByw58P3TJiNeuqyV3ZkphpNWuZK5iSY2w==} + + electron-to-chromium@1.5.109: + resolution: {integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==} + + electron@33.2.0: + resolution: {integrity: sha512-PVw1ICAQDPsnnsmpNFX/b1i/49h67pbSPxuIENd9K9WpGO1tsRaQt+K2bmXqTuoMJsbzIc75Ce8zqtuwBPqawA==} + engines: {node: '>= 12.20.55'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.19: + resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nan@2.22.2: + resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-gyp@11.1.0: + resolution: {integrity: sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} + engines: {node: '>=10'} + hasBin: true + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-icons@5.5.0: + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} + peerDependencies: + react: '*' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@19.0.0: + resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + rollup@4.34.9: + resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swr@2.3.2: + resolution: {integrity: sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + typescript-eslint@8.25.0: + resolution: {integrity: sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unzip-crx-3@0.2.0: + resolution: {integrity: sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@6.2.0: + resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaku@0.16.7: + resolution: {integrity: sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.9': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helpers': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + convert-source-map: 2.0.0 + debug: 4.4.0(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.9': + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.9': + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/parser@7.26.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime@7.26.9': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/traverse@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.0(supports-color@5.5.0) + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.9 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + 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 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/utils': 1.4.2 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': + dependencies: + react: 19.0.0 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.25.0': + optional: true + + '@esbuild/android-arm64@0.25.0': + optional: true + + '@esbuild/android-arm@0.25.0': + optional: true + + '@esbuild/android-x64@0.25.0': + optional: true + + '@esbuild/darwin-arm64@0.25.0': + optional: true + + '@esbuild/darwin-x64@0.25.0': + optional: true + + '@esbuild/freebsd-arm64@0.25.0': + optional: true + + '@esbuild/freebsd-x64@0.25.0': + optional: true + + '@esbuild/linux-arm64@0.25.0': + optional: true + + '@esbuild/linux-arm@0.25.0': + optional: true + + '@esbuild/linux-ia32@0.25.0': + optional: true + + '@esbuild/linux-loong64@0.25.0': + optional: true + + '@esbuild/linux-mips64el@0.25.0': + optional: true + + '@esbuild/linux-ppc64@0.25.0': + optional: true + + '@esbuild/linux-riscv64@0.25.0': + optional: true + + '@esbuild/linux-s390x@0.25.0': + optional: true + + '@esbuild/linux-x64@0.25.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.0': + optional: true + + '@esbuild/netbsd-x64@0.25.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.0': + optional: true + + '@esbuild/openbsd-x64@0.25.0': + optional: true + + '@esbuild/sunos-x64@0.25.0': + optional: true + + '@esbuild/win32-arm64@0.25.0': + optional: true + + '@esbuild/win32-ia32@0.25.0': + optional: true + + '@esbuild/win32-x64@0.25.0': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': + dependencies: + eslint: 9.21.0(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.2': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.0': + dependencies: + ajv: 6.12.6 + debug: 4.4.0(supports-color@5.5.0) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.21.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.7': + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mui/core-downloads-tracker@6.4.6': {} + + '@mui/icons-material@6.4.6(@mui/material@6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@mui/material': 6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@mui/material@6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@mui/core-downloads-tracker': 6.4.6 + '@mui/system': 6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0) + '@mui/types': 7.2.21(@types/react@19.0.10) + '@mui/utils': 6.4.6(@types/react@19.0.10)(react@19.0.0) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.12(@types/react@19.0.10) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-is: 19.0.0 + react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0) + '@types/react': 19.0.10 + + '@mui/private-theming@6.4.6(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@mui/utils': 6.4.6(@types/react@19.0.10)(react@19.0.0) + prop-types: 15.8.1 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@mui/styled-engine@6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.0.0 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0) + + '@mui/system@6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@mui/private-theming': 6.4.6(@types/react@19.0.10)(react@19.0.0) + '@mui/styled-engine': 6.4.6(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0))(react@19.0.0) + '@mui/types': 7.2.21(@types/react@19.0.10) + '@mui/utils': 6.4.6(@types/react@19.0.10)(react@19.0.0) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.0.0 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(@types/react@19.0.10)(react@19.0.0) + '@types/react': 19.0.10 + + '@mui/types@7.2.21(@types/react@19.0.10)': + optionalDependencies: + '@types/react': 19.0.10 + + '@mui/utils@6.4.6(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.9 + '@mui/types': 7.2.21(@types/react@19.0.10) + '@types/prop-types': 15.7.14 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.0.0 + react-is: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@popperjs/core@2.11.8': {} + + '@rollup/rollup-android-arm-eabi@4.34.9': + optional: true + + '@rollup/rollup-android-arm64@4.34.9': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.9': + optional: true + + '@rollup/rollup-darwin-x64@4.34.9': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.9': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.9': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.9': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.9': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.9': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.9': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.9': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.9': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.9': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.9': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.9 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.9 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.13.8 + '@types/responselike': 1.0.3 + + '@types/estree@1.0.6': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.13.8 + + '@types/node@20.17.22': + dependencies: + undici-types: 6.19.8 + + '@types/node@22.13.8': + dependencies: + undici-types: 6.20.0 + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.14': {} + + '@types/react-dom@19.0.4(@types/react@19.0.10)': + dependencies: + '@types/react': 19.0.10 + + '@types/react-transition-group@4.4.12(@types/react@19.0.10)': + dependencies: + '@types/react': 19.0.10 + + '@types/react@19.0.10': + dependencies: + csstype: 3.1.3 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.13.8 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.13.8 + optional: true + + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0(supports-color@5.5.0) + eslint: 9.21.0(jiti@1.21.7) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.25.0': + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + debug: 4.4.0(supports-color@5.5.0) + eslint: 9.21.0(jiti@1.21.7) + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.25.0': {} + + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0(supports-color@5.5.0) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.25.0': + dependencies: + '@typescript-eslint/types': 8.25.0 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-react@4.3.4(vite@6.2.0(@types/node@22.13.8)(jiti@1.21.7)(yaml@2.7.0))': + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.2.0(@types/node@22.13.8)(jiti@1.21.7)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + + abbrev@3.0.0: {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@7.1.3: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + autoprefixer@10.4.20(postcss@8.5.3): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001701 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.9 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001701 + electron-to-chromium: 1.5.109 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + buffer-crc32@0.2.13: {} + + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + tar: 7.4.3 + unique-filename: 4.0.0 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001701: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + concurrently@9.1.2: + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.4.0(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-is@0.1.4: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + dequal@2.0.3: {} + + detect-node@2.1.0: + optional: true + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.26.9 + csstype: 3.1.3 + + dotenv@16.4.7: {} + + eastasianwidth@0.2.0: {} + + electron-devtools-installer@4.0.0: + dependencies: + unzip-crx-3: 0.2.0 + + electron-to-chromium@1.5.109: {} + + electron@33.2.0: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 20.17.22 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + err-code@2.0.3: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: + optional: true + + es-errors@1.3.0: + optional: true + + es6-error@4.1.1: + optional: true + + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@5.2.0(eslint@9.21.0(jiti@1.21.7)): + dependencies: + eslint: 9.21.0(jiti@1.21.7) + + eslint-plugin-react-refresh@0.4.19(eslint@9.21.0(jiti@1.21.7)): + dependencies: + eslint: 9.21.0(jiti@1.21.7) + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.21.0(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + exponential-backoff@3.1.2: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.0(supports-color@5.5.0) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.1 + serialize-error: 7.0.1 + optional: true + + globals@11.12.0: {} + + globals@14.0.0: {} + + globals@15.15.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + gopd@1.2.0: + optional: true + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + http-cache-semantics@4.1.1: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + ignore-by-default@1.0.1: {} + + ignore@5.3.2: {} + + immediate@3.0.6: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.1.1 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.0.1 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@7.1.2: {} + + minizlib@3.0.1: + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@3.0.1: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nan@2.22.2: {} + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + negotiator@1.0.0: {} + + node-gyp@11.1.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.1 + tar: 7.4.3 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + + node-releases@2.0.19: {} + + nodemon@3.1.9: + dependencies: + chokidar: 3.6.0 + debug: 4.4.0(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.7.1 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + nopt@8.1.0: + dependencies: + abbrev: 3.0.0 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@6.1.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-cancelable@2.1.1: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@7.0.3: {} + + package-json-from-dist@1.0.1: {} + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + postcss-import@15.1.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.5.3): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + + postcss-load-config@4.0.2(postcss@8.5.3): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.5.3 + + postcss-nested@6.2.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + proc-log@5.0.0: {} + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + pstree.remy@1.1.8: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + + react-icons@5.5.0(react@19.0.0): + dependencies: + react: 19.0.0 + + react-is@16.13.1: {} + + react-is@19.0.0: {} + + react-refresh@0.14.2: {} + + react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@babel/runtime': 7.26.9 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + react@19.0.0: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + regenerator-runtime@0.14.1: {} + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + retry@0.12.0: {} + + reusify@1.1.0: {} + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + rollup@4.34.9: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.9 + '@rollup/rollup-android-arm64': 4.34.9 + '@rollup/rollup-darwin-arm64': 4.34.9 + '@rollup/rollup-darwin-x64': 4.34.9 + '@rollup/rollup-freebsd-arm64': 4.34.9 + '@rollup/rollup-freebsd-x64': 4.34.9 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 + '@rollup/rollup-linux-arm-musleabihf': 4.34.9 + '@rollup/rollup-linux-arm64-gnu': 4.34.9 + '@rollup/rollup-linux-arm64-musl': 4.34.9 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 + '@rollup/rollup-linux-riscv64-gnu': 4.34.9 + '@rollup/rollup-linux-s390x-gnu': 4.34.9 + '@rollup/rollup-linux-x64-gnu': 4.34.9 + '@rollup/rollup-linux-x64-musl': 4.34.9 + '@rollup/rollup-win32-arm64-msvc': 4.34.9 + '@rollup/rollup-win32-ia32-msvc': 4.34.9 + '@rollup/rollup-win32-x64-msvc': 4.34.9 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.1.2: {} + + safer-buffer@2.1.2: + optional: true + + scheduler@0.25.0: {} + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.1: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + setimmediate@1.0.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + signal-exit@4.1.0: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.1 + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@5.5.0) + socks: 2.8.4 + transitivePeerDependencies: + - supports-color + + socks@2.8.4: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + source-map-js@1.2.1: {} + + source-map@0.5.7: {} + + sprintf-js@1.1.3: {} + + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-json-comments@3.1.1: {} + + stylis@4.2.0: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + sumchecker@3.0.1: + dependencies: + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swr@2.3.2(react@19.0.0): + dependencies: + dequal: 2.0.3 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + touch@3.1.1: {} + + tree-kill@1.2.2: {} + + ts-api-utils@2.0.1(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + ts-interface-checker@0.1.13: {} + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.13.1: + optional: true + + typescript-eslint@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + typescript@5.7.3: {} + + undefsafe@2.0.5: {} + + undici-types@6.19.8: {} + + undici-types@6.20.0: {} + + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + + universalify@0.1.2: {} + + unzip-crx-3@0.2.0: + dependencies: + jszip: 3.10.1 + mkdirp: 0.5.6 + yaku: 0.16.7 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-sync-external-store@1.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + + util-deprecate@1.0.2: {} + + vite@6.2.0(@types/node@22.13.8)(jiti@1.21.7)(yaml@2.7.0): + dependencies: + esbuild: 0.25.0 + postcss: 8.5.3 + rollup: 4.34.9 + optionalDependencies: + '@types/node': 22.13.8 + fsevents: 2.3.3 + jiti: 1.21.7 + yaml: 2.7.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@5.0.0: + dependencies: + isexe: 3.1.1 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yaku@0.16.7: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml@1.10.2: {} + + yaml@2.7.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/Snowboy-wakeup.pmdl b/public/Snowboy-wakeup.pmdl new file mode 100644 index 0000000000000000000000000000000000000000..3aec8476677f67ede415c9b5c641ea9f6a7c7389 GIT binary patch literal 11899 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 MhoixVoon#_0HO$w-~a#s literal 0 HcmV?d00001 diff --git a/public/test-audio.mp3 b/public/test-audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5b9488c3e8dda0e49b4a8365ba58ae4603b77b20 GIT binary patch literal 40752 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 BJwX5f literal 0 HcmV?d00001 diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..b1acb3d --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,99 @@ +//src\App.tsx +import { useState, useEffect, useMemo } from "react"; +import AnalogClock from "./components/AnalogClock"; +import CalendarGrid from "./components/CalendarGrid"; +import WeatherSection from "./components/WeatherSection"; +import NewsSection from "./components/NewsSection"; +import { generateCalendarDays } from "./utils/calendar"; +import { NewsItem } from "./types/magic-mirror"; +import VoiceAssistant from "./components/VoiceAssistant"; +import useSWR from "swr"; + +const MagicMirror = () => { + const [time, setTime] = useState(new Date()); + const calendarDays = useMemo(() => generateCalendarDays(), []); + + // 新闻数据 + const { data } = useSWR( + "news", + async () => { + try { + return await window.electronAPI.getNews(); + } catch (error) { + console.error("新闻加载失败:", error); + throw error; + } + }, + { + refreshInterval: 600000, + onErrorRetry: (error) => { + if (error.message.includes("500")) return; // 服务器错误不重试 + }, + } + ); + + // 天气数据 + + // 更新时间 + useEffect(() => { + const timer = setInterval(() => setTime(new Date()), 1000); + return () => clearInterval(timer); + }, []); + + // 生成问候语 + const greeting = useMemo(() => { + const hours = time.getHours(); + if (hours < 5) return "夜深了"; + if (hours < 12) return "早上好"; + if (hours < 18) return "下午好"; + return "晚上好"; + }, [time]); + + return ( +
+ {/* 时间模块 */} +
+
+
+ {time.toLocaleDateString("zh-CN", { weekday: "long" })} +
+
+ {time.toLocaleDateString("zh-CN", { + year: "numeric", + month: "long", + day: "numeric", + })} +
+
+
+ {time.toLocaleTimeString("zh-CN", { + hour: "2-digit", + minute: "2-digit", + hour12: false, + })} +
+
+ {time.getSeconds().toString().padStart(2, "0")} +
+
+
+ +
+ + {/* 日历模块 */} +
+
+ {time.toLocaleDateString("zh-CN", { month: "long", year: "numeric" })} +
+ +
+ + {/* 其他模块 */} + + + +
+ ); +}; + +export default MagicMirror; diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/AnalogClock.tsx b/src/components/AnalogClock.tsx new file mode 100644 index 0000000..aba3fe0 --- /dev/null +++ b/src/components/AnalogClock.tsx @@ -0,0 +1,47 @@ +import { FC } from "react" + +interface AnalogClockProps { + time: Date +} + +const AnalogClock: FC = ({ time }) => { + const hours = time.getHours() % 12 + const minutes = time.getMinutes() + const seconds = time.getSeconds() + + return ( +
+ {/* 刻度 */} + {Array.from({ length: 60 }).map((_, i) => ( +
+ ))} + + {/* 指针 */} +
+
+
+ + {/* 中心点 */} +
+
+ ) +} + +export default AnalogClock \ No newline at end of file diff --git a/src/components/CalendarGrid.tsx b/src/components/CalendarGrid.tsx new file mode 100644 index 0000000..4a9db5e --- /dev/null +++ b/src/components/CalendarGrid.tsx @@ -0,0 +1,23 @@ +import { FC } from "react" +import { CalendarDay } from "../types/magic-mirror" + +interface CalendarGridProps { + days: CalendarDay[] +} + +const CalendarGrid: FC = ({ days }) => ( +
+ {days.map((day, index) => ( +
+ {!day.isEmpty && day.day} +
+ ))} +
+) + +export default CalendarGrid \ No newline at end of file diff --git a/src/components/NewsSection.tsx b/src/components/NewsSection.tsx new file mode 100644 index 0000000..6750b78 --- /dev/null +++ b/src/components/NewsSection.tsx @@ -0,0 +1,90 @@ +//src\components\NewsSection.tsx +import { FC, useState, useEffect } from "react" +import { NewsItem } from "../types/magic-mirror" + +const SCROLL_INTERVAL = 8000 //表示每8秒滚动一次 + +const NewsSection: FC<{ items: NewsItem[] }> = ({ items }) => { + const [activeIndex, setActiveIndex] = useState(0) + const [isHovered, setIsHovered] = useState(false) + + useEffect(() => { + if (items.length <= 1) return + + const timer = setInterval(() => { + if (!isHovered) setActiveIndex(prev => (prev + 1) % items.length) + }, SCROLL_INTERVAL) + + return () => clearInterval(timer) + }, [items.length, isHovered]) + + if (items.length === 0) { + return ( +
+
正在加载最新新闻...
+
+ ) + } + + return ( +
+ ) +} + +const formatNewsDate = (datetime?: string) => { + if (!datetime) return ""; + const [datePart] = datetime.split(" "); + const [_year, month, day] = datePart.split("-"); // 正确拆分年月日 + return `${parseInt(month)}月${parseInt(day)}日`; +} + +const formatNewsTime = (datetime?: string) => { + if (!datetime) return "" + const timePart = datetime.split(" ")[1] || "" + const [hours, minutes] = timePart.split(":") + return `${hours}时${minutes}分` +} + +export default NewsSection \ No newline at end of file diff --git a/src/components/VoiceAssistant copy 2.tsx b/src/components/VoiceAssistant copy 2.tsx new file mode 100644 index 0000000..db1fe36 --- /dev/null +++ b/src/components/VoiceAssistant copy 2.tsx @@ -0,0 +1,407 @@ +import { useState, useRef, useCallback } from "react"; + +// 新增音频源类型,playback表示音频播放,mic表示麦克风 +type AudioSourceType = "mic" | "playback"; + +interface ProcessState { + recording: boolean; + transcribing: boolean; + generating: boolean; + synthesizing: boolean; + error?: string; +} + +interface VoiceAssistantProps { + greeting: string; +} + +const ANALYSER_FFT_SIZE = 128; +const VOLUME_SENSITIVITY = 1.5; +const SMOOTHING_FACTOR = 0.7; +const BAR_COUNT = 12; + +const VoiceAssistant = ({ greeting }: VoiceAssistantProps) => { + const [isListening, setIsListening] = useState(false); + const [processState, setProcessState] = useState({ + recording: false, + transcribing: false, + generating: false, + synthesizing: false, + }); + const [asrText, setAsrText] = useState(""); + const [answerText, setAnswerText] = useState(""); + const mediaRecorder = useRef(null); + const audioChunks = useRef([]); + const audioElement = useRef(null); + + const barsRef = useRef(null); + + const mediaStreamRef = useRef(null); + const audioContextRef = useRef(null); + const analyserRef = useRef(null); + const animationFrameRef = useRef(null); + + const dataArrayRef = useRef(null); + const lastValuesRef = useRef(new Array(BAR_COUNT).fill(10)); + const [audioSourceType, setAudioSourceType] = + useState("mic"); + + const updateState = (newState: Partial) => { + setProcessState((prev) => ({ ...prev, ...newState })); + }; + + const cleanupAudio = useCallback(async () => { + mediaStreamRef.current?.getTracks().forEach((track) => track.stop()); + if (audioContextRef.current?.state !== "closed") { + await audioContextRef.current?.close(); + } + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + animationFrameRef.current = null; + } + }, []); + const initializeAudioContext = useCallback(() => { + const AudioContextClass = + window.AudioContext || (window as any).webkitAudioContext; + audioContextRef.current = new AudioContextClass(); + analyserRef.current = audioContextRef.current.createAnalyser(); + analyserRef.current.fftSize = ANALYSER_FFT_SIZE; + analyserRef.current.smoothingTimeConstant = SMOOTHING_FACTOR; + dataArrayRef.current = new Uint8Array( + analyserRef.current.frequencyBinCount + ); + }, []); + + const startRecording = async () => { + try { + const stream = await navigator.mediaDevices.getUserMedia({ + audio: { sampleRate: 16000, channelCount: 1, sampleSize: 16 }, + }); + + mediaRecorder.current = new MediaRecorder(stream); + audioChunks.current = []; + + mediaRecorder.current.ondataavailable = (e) => { + audioChunks.current.push(e.data); + }; + + mediaRecorder.current.start(500); + updateState({ recording: true, error: undefined }); + } catch (err) { + updateState({ error: "麦克风访问失败,请检查权限设置" }); + } + }; + + // 新增切换音频源的函数 + const stopRecording = async () => { + // 如果当前没有录音器,则返回 + if (!mediaRecorder.current) return; + // 停止录音器 + mediaRecorder.current.stop(); + // 更新状态为未录音 + updateState({ recording: false }); + // 等待录音器停止录音 + mediaRecorder.current.onstop = async () => { + try { + // 停止录音器 + const audioBlob = new Blob(audioChunks.current, { type: "audio/wav" }); + await processAudio(audioBlob); + } finally { + audioChunks.current = []; + } + }; + }; + + + const processAudio = async (audioBlob: Blob) => { + const formData = new FormData(); + formData.append("audio", audioBlob, "recording.wav"); + + try { + updateState({ transcribing: true }); + // 发送请求到后端 + const asrResponse = await fetch("http://localhost:5000/asr", { + method: "POST", + body: formData, + }); + // 如果请求失败,则抛出错误 + if (!asrResponse.ok) throw new Error("语音识别失败"); + // 获取后端返回的文本 + const asrData = await asrResponse.json(); + setAsrText(asrData.asr_text); + updateState({ transcribing: false, generating: true }); + + // 发送请求到后端,生成回答 + const generateResponse = await fetch("http://localhost:5000/generate", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ asr_text: asrData.asr_text }), + }); + + if (!generateResponse.ok) throw new Error("生成回答失败"); + + const generateData = await generateResponse.json(); + setAnswerText(generateData.answer_text); + updateState({ generating: false, synthesizing: true }); + + // 播放合成的音频,增加可视化效果 + if (audioElement.current) { + startVisualization(); + // 播放合成的音频 + audioElement.current.src = `http://localhost:5000${generateData.audio_url}`; + // 播放音频 + audioElement.current.play() + .catch((err) => { + console.error("播放失败:", err); + updateState({ error: "音频播放失败" }); + }); + } + } catch (err) { + updateState({ error: err instanceof Error ? err.message : "未知错误" }); + } finally { + updateState({ + transcribing: false, + generating: false, + synthesizing: false, + }); + } + }; + + const getStatusText = () => { + if (processState.error) return processState.error; + if (processState.recording) return "录音中... 🎤"; + if (processState.transcribing) return "语音识别中... 🔍"; + if (processState.generating) return "生成回答中... 💡"; + if (processState.synthesizing) return "语音合成中... 🎵"; + return "点击开始对话"; + }; + + const startVisualization = useCallback(() => { + if (!analyserRef.current || !dataArrayRef.current || !barsRef.current) { + console.warn("可视化组件未就绪"); + return; + } + + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + animationFrameRef.current = null; + } + + const bufferLength = analyserRef.current.frequencyBinCount; + const updateBars = () => { + try { + analyserRef.current!.getByteFrequencyData(dataArrayRef.current!); + + const bars = barsRef.current!.children; + for (let i = 0; i < bars.length; i++) { + const bar = bars[i] as HTMLElement; + const dataIndex = Math.floor((i / BAR_COUNT) * (bufferLength / 2)); + const rawValue = + (dataArrayRef.current![dataIndex] / 255) * 100 * VOLUME_SENSITIVITY; + + const smoothValue = Math.min( + 100, + Math.max(10, rawValue * 0.6 + lastValuesRef.current[i] * 0.4) + ); + lastValuesRef.current[i] = smoothValue; + + bar.style.cssText = ` + height: ${smoothValue}%; + transform: scaleY(${0.8 + (smoothValue / 100) * 0.6}); + transition: ${i === 0 ? "none" : "height 50ms linear"}; + `; + } + + animationFrameRef.current = requestAnimationFrame(updateBars); + } catch (err) { + console.error("可视化更新失败:", err); + } + }; + + animationFrameRef.current = requestAnimationFrame(updateBars); + }, [analyserRef, dataArrayRef, barsRef]); + + // 切换监听状态 + const toggleListening = useCallback(async () => { + if (isListening) { // 如果正在监听 + await cleanupAudio(); // 清理现有音频 + } else { // 否则 + try { // 尝试 + await cleanupAudio(); // 清理现有音频 + initializeAudioContext(); // 初始化音频上下文 + + if (audioSourceType === "mic") { // 如果音频源类型是麦克风 + const stream = await navigator.mediaDevices.getUserMedia({ // 获取用户媒体 + audio: { noiseSuppression: true, echoCancellation: true }, // 音频配置 + }); // 等待获取用户媒体 + mediaStreamRef.current = stream; // 设置媒体流 + const source = // 创建音频源 + audioContextRef.current!.createMediaStreamSource(stream); // 创建音频源 + source.connect(analyserRef.current!); // 连接到分析器 + } else { + const audio = new Audio("/test-audio.mp3"); // 创建音频元素 + const source = // 创建音频源 + audioContextRef.current!.createMediaElementSource(audio); // 创建音频源 + source.connect(analyserRef.current!); // 连接到分析器 + audio.play(); // 播放音频 + } + + analyserRef.current!.connect(audioContextRef.current!.destination); // 连接到目标 + startVisualization(); // 开始可视化 + } catch (err) { + console.error("初始化失败:", err); + updateState({ error: "音频初始化失败" }); + } + } + setIsListening((prev) => !prev); + }, [ + isListening, + audioSourceType, + cleanupAudio, + initializeAudioContext, + startVisualization, + ]); + + // 示例音频播放 + const handlePlaySample = async () => { + try { + await cleanupAudio(); // 清理现有音频 + initializeAudioContext(); // 初始化音频上下文 + + const audio = new Audio("/test-audio.mp3"); // 创建音频元素 + const source = audioContextRef.current!.createMediaElementSource(audio); // 创建音频源 + source.connect(analyserRef.current!); // 连接到分析器 + analyserRef.current!.connect(audioContextRef.current!.destination); // 连接到目标 + + await audio.play(); // 播放音频 + startVisualization(); // 开始可视化 + + audio.onended = () => { + setIsListening(false); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + animationFrameRef.current = null; + } + }; + } catch (err) { + console.error("播放示例失败:", err); + updateState({ error: "示例播放失败" }); + } + }; + + return ( +
+ {/* 问候语 */} +

{greeting}

+ {/* 较小较细的字体显示{asrText || "等待语音输入..."}*/} +

{asrText || "等待中..."}

+ {/*较小较细的字体显示{answerText || "等待生成回答..."}*/} +

+ {answerText || "AI助手待命中"} +

+ + {/* 音频源切换 */} +
+ + +
+ {/* 示例播放按钮 */} + {audioSourceType === "playback" && ( + + )} + + {/* 优化后的音频波形可视化 */} +
+ +
+ + {/* 底部状态信息 */} +
+

支持唤醒词:"魔镜魔镜"

+
+
+ {/* 呼吸圆点指示器 */} +
+ {/* 扩散波纹效果 */} + {isListening && ( +
+ )} +
+ {getStatusText()} +
+ + {/* 音频播放 */} +
+
+ ); +}; + +export default VoiceAssistant; diff --git a/src/components/VoiceAssistant copy.tsx b/src/components/VoiceAssistant copy.tsx new file mode 100644 index 0000000..28bf4e9 --- /dev/null +++ b/src/components/VoiceAssistant copy.tsx @@ -0,0 +1,239 @@ +import { useState, useEffect, useRef, useCallback } from "react"; + +interface VoiceAssistantProps { + greeting: string; +} + +// 性能优化配置 +const ANALYSER_FFT_SIZE = 128; // 降低FFT大小提升性能 +const VOLUME_SENSITIVITY = 1.5; +const SMOOTHING_FACTOR = 0.7; // 增加平滑系数减少突变 +const BAR_COUNT = 12; // 固定柱状图数量 + +const VoiceAssistant = ({ greeting }: VoiceAssistantProps) => { + // 状态管理 + const [isListening, setIsListening] = useState(false); + const [error, setError] = useState(null); + + // DOM元素引用 + const barsRef = useRef(null); + + // 音频处理相关引用 + const mediaStreamRef = useRef(null); + const audioContextRef = useRef(null); + const analyserRef = useRef(null); + const animationFrameRef = useRef(null); + + // 重用数据数组减少内存分配 + const dataArrayRef = useRef(null); + const lastValuesRef = useRef(new Array(BAR_COUNT).fill(10)); + + // 初始化音频处理(使用useCallback避免重复创建) + const initAudioPipeline = useCallback(async () => { + try { + mediaStreamRef.current = await navigator.mediaDevices.getUserMedia({ + audio: { + noiseSuppression: true, + echoCancellation: true, + autoGainControl: false, + }, + }); + + const AudioContextClass = + window.AudioContext || (window as any).webkitAudioContext; + audioContextRef.current = new AudioContextClass({ + latencyHint: "balanced", // 平衡延迟和性能 + }); + + analyserRef.current = audioContextRef.current.createAnalyser(); + analyserRef.current.fftSize = ANALYSER_FFT_SIZE; + analyserRef.current.smoothingTimeConstant = SMOOTHING_FACTOR; + + // 初始化数据数组 + dataArrayRef.current = new Uint8Array( + analyserRef.current.frequencyBinCount + ); + + const source = audioContextRef.current.createMediaStreamSource( + mediaStreamRef.current + ); + source.connect(analyserRef.current); + + startVisualization(); + } catch (err) { + console.error("音频初始化失败:", err); + setIsListening(false); + } + }, []); + + // 优化后的可视化逻辑(直接操作DOM) + const startVisualization = useCallback(() => { + if (!analyserRef.current || !dataArrayRef.current) { + console.error('Audio analyzer not initialized'); + return; + } + + // 获取频率数据缓冲区长度 + const bufferLength = analyserRef.current.frequencyBinCount; + + // 初始化时创建数据数组(安全校验) + if (!dataArrayRef.current || dataArrayRef.current.length !== bufferLength) { + dataArrayRef.current = new Uint8Array(bufferLength); + } + + // 定义动画帧回调 + const updateBars = () => { + // 1. 获取最新频率数据 + analyserRef.current!.getByteFrequencyData(dataArrayRef.current!); + + // 2. 性能优化:批量DOM操作 + const bars = barsRef.current?.children; + if (!bars) return; + + // 3. 使用现代循环代替Array.from提升性能 + for (let i = 0; i < bars.length; i++) { + const bar = bars[i] as HTMLElement; + + // 4. 优化数据采样策略(前1/2频谱) + const dataIndex = Math.floor((i / BAR_COUNT) * (bufferLength / 2)); + const rawValue = (dataArrayRef.current![dataIndex] / 255) * 100 * VOLUME_SENSITIVITY; + + // 5. 应用指数平滑滤波 + const smoothValue = Math.min(100, Math.max(10, + rawValue * 0.6 + lastValuesRef.current[i] * 0.4 + )); + lastValuesRef.current[i] = smoothValue; + + // 6. 复合样式更新(减少重排) + bar.style.cssText = ` + height: ${smoothValue}%; + transform: scaleY(${0.8 + (smoothValue / 100) * 0.6}); + animation-delay: ${i * 0.1}s; + `; + } + + // 7. 使用绑定this的requestAnimationFrame + animationFrameRef.current = requestAnimationFrame(updateBars.bind(this)); + }; + + // 8. 启动动画前取消已有帧 + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + animationFrameRef.current = requestAnimationFrame(updateBars); + + // 9. 返回清理函数 + return () => { + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + }; + }, []); // 10. 移除不必要的依赖项 + + // 切换监听状态 + const toggleListening = useCallback(async () => { + if (isListening) { + mediaStreamRef.current?.getTracks().forEach((track) => track.stop()); + audioContextRef.current?.close(); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + } else { + await initAudioPipeline(); + } + setIsListening((prev) => !prev); + }, [isListening, initAudioPipeline]); + + // 清理资源 + useEffect(() => { + return () => { + if (isListening) { + mediaStreamRef.current?.getTracks().forEach((track) => track.stop()); + audioContextRef.current?.close(); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + } + }; + }, [isListening]); + + return ( +
+ {/* 问候语 */} +

{greeting}

+ + {/* 优化后的音频波形可视化 */} +
+ +
+ + {/* 底部状态信息 */} +
+

支持唤醒词:"魔镜魔镜"

+
+
+ {/* 呼吸圆点指示器 */} +
+ {/* 扩散波纹效果 */} + {isListening && ( +
+ )} +
+ 音频状态: {isListening ? "监听中" : "待机"} +
+
+ + {/* 错误提示 */} + {error && ( +
+ {error} + +
+ )} +
+ ); +}; + +export default VoiceAssistant; diff --git a/src/components/VoiceAssistant.tsx b/src/components/VoiceAssistant.tsx new file mode 100644 index 0000000..be0da5b --- /dev/null +++ b/src/components/VoiceAssistant.tsx @@ -0,0 +1,340 @@ +import { useState, useRef, useCallback } from "react"; + +interface ProcessState { + recording: boolean; + transcribing: boolean; + generating: boolean; + synthesizing: boolean; + error?: string; + thinking: boolean; + speaking: boolean; +} + +interface VoiceAssistantProps { + greeting: string; +} + +const ANALYSER_FFT_SIZE = 128; +const VOLUME_SENSITIVITY = 1.5; +const SMOOTHING_FACTOR = 0.7; +const BAR_COUNT = 12; + +const VoiceAssistant = ({ greeting }: VoiceAssistantProps) => { + const [isListening, setIsListening] = useState(false); + const [processState, setProcessState] = useState({ + recording: false, + transcribing: false, + generating: false, + synthesizing: false, + error: undefined, + thinking: false, + speaking: false, + }); + const [asrText, setAsrText] = useState(""); + const [answerText, setAnswerText] = useState(""); + const mediaRecorder = useRef(null); + const audioChunks = useRef([]); + const audioElement = useRef(null); + const barsRef = useRef(null); + const mediaStreamRef = useRef(null); + const audioContextRef = useRef(null); + const analyserRef = useRef(null); + const animationFrameRef = useRef(null); + const dataArrayRef = useRef(null); + const lastValuesRef = useRef(new Array(BAR_COUNT).fill(10)); + const updateState = (newState: Partial) => { + setProcessState((prev) => ({ ...prev, ...newState })); + }; + + const cleanupAudio = useCallback(async () => { + mediaStreamRef.current?.getTracks().forEach((track) => track.stop()); + if (audioContextRef.current?.state !== "closed") { + await audioContextRef.current?.close(); + } + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + animationFrameRef.current = null; + } + }, []); + const initializeAudioContext = useCallback(() => { + const AudioContextClass = + window.AudioContext || (window as any).webkitAudioContext; + audioContextRef.current = new AudioContextClass(); + analyserRef.current = audioContextRef.current.createAnalyser(); + analyserRef.current.fftSize = ANALYSER_FFT_SIZE; + analyserRef.current.smoothingTimeConstant = SMOOTHING_FACTOR; + dataArrayRef.current = new Uint8Array( + analyserRef.current.frequencyBinCount + ); + }, []); + + const startRecording = async () => { + try { + const stream = await navigator.mediaDevices.getUserMedia({ + audio: { sampleRate: 16000, channelCount: 1, sampleSize: 16 }, + }); + + mediaRecorder.current = new MediaRecorder(stream); + audioChunks.current = []; + + mediaRecorder.current.ondataavailable = (e) => { + audioChunks.current.push(e.data); + }; + + mediaRecorder.current.start(500); + updateState({ recording: true, error: undefined }); + } catch (err) { + updateState({ error: "麦克风访问失败,请检查权限设置" }); + } + }; + + const stopRecording = async () => { + if (!mediaRecorder.current) return; + mediaRecorder.current.stop(); + // 更新状态为未录音 + updateState({ recording: false }); + mediaRecorder.current.onstop = async () => { + try { + const audioBlob = new Blob(audioChunks.current, { type: "audio/wav" }); + await processAudio(audioBlob); + } finally { + audioChunks.current = []; + } + }; + }; + + const processAudio = async (audioBlob: Blob) => { + // 处理音频的函数 + const formData = new FormData(); + formData.append("audio", audioBlob, "recording.wav"); + try { + updateState({ transcribing: true }); // 设置转录状态为true + // 发送请求到后端 + const asrResponse = await fetch("http://localhost:5000/asr", { + method: "POST", + body: formData, + }); + // 如果请求失败,则抛出错误 + if (!asrResponse.ok) throw new Error("语音识别失败"); + // 获取后端返回的文本 + const asrData = await asrResponse.json(); + setAsrText(asrData.asr_text); + updateState({ transcribing: false, thinking: true }); + + // 发送请求到后端,生成回答 + const generateResponse = await fetch("http://localhost:5000/generate", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ asr_text: asrData.asr_text }), + }); + + if (!generateResponse.ok) throw new Error("生成回答失败"); + + const generateData = await generateResponse.json(); //获取生成的回答,设置为answerText + setAnswerText(generateData.answer_text); + updateState({ thinking: false, synthesizing: true }); + + // 播放合成的音频,增加可视化效果 + if (audioElement.current) { + //设置说话状态 + updateState({ synthesizing: false, speaking: true }); // 替代setIsSpeaking(true) + initializeAudioContext(); // 初始化音频上下文 + // 播放合成的音频 + //audioElement.current.src = `http://localhost:5000${generateData.audio_url}`; + const audio = new Audio( + `http://localhost:5000${generateData.audio_url}` + ); // 创建音频元素 + const source = audioContextRef.current!.createMediaElementSource(audio); // 创建音频源 + source.connect(analyserRef.current!); // 连接到分析器 + analyserRef.current!.connect(audioContextRef.current!.destination); // 连接到目标 + //播放结束设置说话状态为false + audio.onended = () => { + updateState({ speaking: false }); // 替代setIsSpeaking(false) + }; + try { + await audio.play(); // 播放音频 + startVisualization(); // 开始可视化效果 + } catch (err) { + console.error("播放失败:", err); + updateState({ error: "音频播放失败" }); + } + } + } catch (err) { + updateState({ error: err instanceof Error ? err.message : "未知错误" }); + } finally { + updateState({ + transcribing: false, + generating: false, + synthesizing: false, + }); + } + }; + + const getStatusText = () => { + if (processState.error) return processState.error; + if (processState.recording) return "请说... 🎤"; //录音 + if (processState.transcribing) return "识别音频中... 🔍"; //语音转文字 + if (processState.thinking) return "正在思考中... 💡"; // 等待AI回复 + if (processState.generating) return "生成回答中... 💡"; // AI以文字形式回复中//未使用 + if (processState.synthesizing) return "整理话语中... 🎶"; //收到AI回复,正在合成语音//未使用 + if (processState.speaking) return "说话中... 🗣📢"; // 播放合成后的语音 + return "对话未开始🎙️"; + }; + + const startVisualization = useCallback(() => { + if (!analyserRef.current || !dataArrayRef.current || !barsRef.current) { + console.warn("可视化组件未就绪"); + return; + } + + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + animationFrameRef.current = null; + } + + const bufferLength = analyserRef.current.frequencyBinCount; + const updateBars = () => { + try { + analyserRef.current!.getByteFrequencyData(dataArrayRef.current!); + + const bars = barsRef.current!.children; + for (let i = 0; i < bars.length; i++) { + const bar = bars[i] as HTMLElement; + const dataIndex = Math.floor((i / BAR_COUNT) * (bufferLength / 2)); + const rawValue = + (dataArrayRef.current![dataIndex] / 255) * 100 * VOLUME_SENSITIVITY; + + const smoothValue = Math.min( + 100, + Math.max(10, rawValue * 0.6 + lastValuesRef.current[i] * 0.4) + ); + lastValuesRef.current[i] = smoothValue; + + bar.style.cssText = ` + height: ${smoothValue}%; + transform: scaleY(${0.8 + (smoothValue / 100) * 0.6}); + transition: ${i === 0 ? "none" : "height 50ms linear"}; + `; + } + + animationFrameRef.current = requestAnimationFrame(updateBars); + } catch (err) { + console.error("可视化更新失败:", err); + } + }; + + animationFrameRef.current = requestAnimationFrame(updateBars); + }, [analyserRef, dataArrayRef, barsRef]); + + // 切换监听状态 + const toggleListening = useCallback(async () => { + if (isListening) { + // 如果正在监听 + await cleanupAudio(); // 清理现有音频 + } else { + // 否则 + try { + // 尝试 + await cleanupAudio(); // 清理现有音频 + initializeAudioContext(); // 初始化音频上下文 + const stream = await navigator.mediaDevices.getUserMedia({ + audio: { noiseSuppression: true, echoCancellation: true }, + }); + mediaStreamRef.current = stream; // 设置媒体流 + const source = audioContextRef.current!.createMediaStreamSource(stream); + source.connect(analyserRef.current!); // 只连接到分析器,不连接到目标 + //analyserRef.current!.connect(audioContextRef.current!.destination); // 连接到目标 + startVisualization(); // 开始可视化 + } catch (err) { + console.error("初始化失败:", err); + updateState({ error: "音频初始化失败" }); + } + } + setIsListening((prev) => !prev); + }, [isListening, cleanupAudio, initializeAudioContext, startVisualization]); + + return ( +
+ {/* 问候语 */} +

{greeting}

+ {/* 较小较细的字体显示{asrText || "等待语音输入..."}*/} +

{asrText || "等待中..."}

+ {/*较小较细的字体显示{answerText || "等待生成回答..."}*/} +

+ {answerText || "AI助手待命中"} +

+ + {/* 音频波形可视化 */} +
+ +
+ + {/* 底部状态信息 */} +
+

支持唤醒词:"你好千问"

+
+
+ {/* 呼吸圆点指示器 */} +
+ {/* 扩散波纹效果 */} + {isListening && ( +
+ )} +
+ {getStatusText()} +
+ + {/* 音频播放 */} +
+
+ ); +}; + +export default VoiceAssistant; diff --git a/src/components/WeatherIcons.tsx b/src/components/WeatherIcons.tsx new file mode 100644 index 0000000..72d26a2 --- /dev/null +++ b/src/components/WeatherIcons.tsx @@ -0,0 +1,53 @@ +// src/components/WeatherIcons.tsx +import { + WiDaySunny, + WiNightClear, + WiDayCloudy, + WiNightAltCloudy, + WiCloud, + WiRain, + WiSnow, + WiStrongWind, + WiFog, + WiDust, +} from "react-icons/wi"; + +interface WeatherIconProps { + type: string; + className?: string; +} + +const WeatherIcon = ({ type, className }: WeatherIconProps) => { + const baseClass = "w-6 h-6 text-gray-100"; + + switch (type) { + case "CLEAR_DAY": + return ( + + ); + case "CLEAR_NIGHT": + return ( + + ); + case "PARTLY_CLOUDY_DAY": + return ; + case "PARTLY_CLOUDY_NIGHT": + return ; + case "CLOUDY": + return ; + case "RAIN": + return ; + case "SNOW": + return ; + case "WIND": + return ; + case "FOG": + return ; + case "HAZE": + return ; + default: + return ; + } +}; + +export default WeatherIcon; diff --git a/src/components/WeatherSection.tsx b/src/components/WeatherSection.tsx new file mode 100644 index 0000000..15a3b03 --- /dev/null +++ b/src/components/WeatherSection.tsx @@ -0,0 +1,134 @@ +// src/components/WeatherSection.tsx +import { FC } from "react"; +import useSWR from "swr"; +import CircularProgress from "@mui/material/CircularProgress"; +import { WeatherData } from "../types/magic-mirror"; +import WeatherIcon from "./WeatherIcons"; + +const WeatherSection: FC = () => { + const { data, error } = useSWR( + ["weather", 116.3974, 39.9093], + async ([, lon, lat]: [string, number, number]) => { + const result = await window.electronAPI.getWeather({ lon, lat }); + if (result.error) throw new Error(result.message); + return result; + }, + { + refreshInterval: 600000, + onErrorRetry: (error) => { + if (error.message.includes("超时")) return; + }, + } + ); + // 添加错误处理 + if (error) { + return ( +
+ 加载天气数据失败 +
+ ); + } + + // 优化加载状态 + if (!data) + return ( +
+ + 天气加载中... +
+ ); + + return ( + <> + {/* 当前天气模块 */} +
+
+
+
风速
+
+ {data.realtime.wind.speed} {data.realtime.wind.direction} +
+
+
+
空气质量
+
+ {data.realtime.airQuality.aqi} ( + {data.realtime.airQuality.description}) +
+
+
+ +
+ +
+
{data.realtime.temperature}°C
+
+ 体感 {data.realtime.apparentTemperature}°C +
+
+
+
+ + {/* 天气预报模块 */} + {data.forecast && ( +
+
+ 未来6天预报 +
+
+ {data.forecast.temperature.slice(0, 6).map((day, index) => ( +
+ {/* 日期 */} +
+ {new Date(day.date).toLocaleDateString("zh-CN", { + weekday: "short", + })} +
+ + {/* 天气图标和降水概率 */} +
+ +
+ {data.forecast.precipitation[index].probability}% +
+
+ + {/* 温度条 */} +
+
+
+
+
+ + {/* 温度数值 */} +
+ + {Math.round(day.min)}° + + + + {Math.round(day.max)}° + +
+
+ ))} +
+
+ )} + + ); +}; + +export default WeatherSection; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..08a3ac9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..5c2c391 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,11 @@ +//src\main.tsx +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/globals.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + +) \ No newline at end of file diff --git a/src/styles/globals.css b/src/styles/globals.css new file mode 100644 index 0000000..ca46d49 --- /dev/null +++ b/src/styles/globals.css @@ -0,0 +1,24 @@ +/*src\styles\globals.css*/ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* src/styles/globals.css */ +/* 基础流动效果 */ +@keyframes wave-flow { + 0%, 100% { + transform: scaleY(0.6) skewY(-3deg); + opacity: 0.4; + } + 50% { + transform: scaleY(1.5) skewY(2deg); + opacity: 1; + } +} + +.animate-audio-wave { + animation: wave-flow 1.1s cubic-bezier(0.4, 0, 0.2, 1) infinite; + transition: + opacity 0.3s ease, + transform 0.3s ease; +} diff --git a/src/types/magic-mirror.d.ts b/src/types/magic-mirror.d.ts new file mode 100644 index 0000000..ab1e762 --- /dev/null +++ b/src/types/magic-mirror.d.ts @@ -0,0 +1,88 @@ +declare global { + interface Window { + electronAPI: { + getWeather: (params: { lon: number; lat: number }) => Promise; + getNews: () => Promise; + }; + } +} +/* + SunIcon, + MoonIcon, + CloudIcon, + CloudSunIcon, + CloudMoonIcon, + UmbrellaIcon, + SnowflakeIcon, + WindIcon, + FaceSmileIcon + */ +declare module '@heroicons/react/24/solid' { + export const SunIcon: React.FC>; + export const MoonIcon: React.FC>; + export const CloudIcon: React.FC>; + export const CloudSunIcon: React.FC>; + export const CloudMoonIcon: React.FC>; + export const UmbrellaIcon: React.FC>; + export const SnowflakeIcon: React.FC>; + export const WindIcon: React.FC>; + export const FaceSmileIcon: React.FC> + +} +//src\types\magic-mirror.d.ts +export interface WeatherData { + error: any; + realtime: { + temperature: string; + humidity: string; + wind: { + speed: string; + direction: string; + }; + airQuality: { + aqi: number; + description: string; + }; + skycon: string; + apparentTemperature: string; + }; + forecast: { + temperature: Array<{ + date: string; + max: number; + min: number; + }>; + skycon: Array<{ + date: string; + value: string; + }>; + precipitation: Array<{ + date: string; + probability: number; + }>; + }; + message: string; +} + +export interface SunData { + date: string + sunrise: string + sunset: string +} + +export interface NewsItem { + uniquekey: string + title: string + date: string + category: string + author_name: string + url: string + thumbnail_pic_s?: string + is_content: string +} + +export type CalendarDay = { + day: number + isCurrent: boolean + isEmpty: boolean +} \ No newline at end of file diff --git a/src/utils/calendar.ts b/src/utils/calendar.ts new file mode 100644 index 0000000..b333861 --- /dev/null +++ b/src/utils/calendar.ts @@ -0,0 +1,18 @@ +import { CalendarDay } from "../types/magic-mirror" + +export const generateCalendarDays = (): CalendarDay[] => { + const date = new Date() + const year = date.getFullYear() + const month = date.getMonth() + const firstDay = new Date(year, month, 1).getDay() + const daysInMonth = new Date(year, month + 1, 0).getDate() + + return Array.from({ length: 42 }, (_, i) => { + const day = i - firstDay + 1 + return { + day: day > 0 && day <= daysInMonth ? day : 0, + isCurrent: day === date.getDate(), + isEmpty: day <= 0 || day > daysInMonth, + } + }) +} \ No newline at end of file diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..30978f6 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,18 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './src/**/*.{ts,tsx,js,jsx}', // 确保包含所有需要 Tailwind 处理的文件 + ], + theme: { + extend: { + colors: { + gray: { + 300: '#D1D5DB', + 400: '#9CA3AF', + 500: '#6B7280', + }, + }, + }, + }, + plugins: [], +} \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..358ca9b --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f0edb76 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.vite.json" } + ] +} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..3004369 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023", "DOM"], + "module": "CommonJS", + "moduleResolution": "Node", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "outDir": "./dist-electron", + "rootDir": "./electron", + "noEmit": false, // 必须设置为 false 才能生成 JS 文件 + "typeRoots": [ + "./node_modules/@types", + "./src/types" // 添加类型声明路径 + ], + "composite": true // 启用组合模式 + }, + "include": [ + "electron/**/*.ts", + "src/types/**/*.d.ts" // 明确包含类型声明文件 + ], + "exclude": [ + "node_modules", + "dist", + "src/**/*.tsx", // 排除渲染进程代码 + //"src/**/*.ts" // 排除渲染进程代码 + ] +} diff --git a/tsconfig.vite.json b/tsconfig.vite.json new file mode 100644 index 0000000..6074694 --- /dev/null +++ b/tsconfig.vite.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.app.json", + "include": ["vite.config.ts"] + } \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..c8cc9c0 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { builtinModules } from 'module' +import path from 'path' + +export default defineConfig({ + plugins: [react()], + build: { + outDir: 'dist', + rollupOptions: { + external: [ + ...builtinModules, + 'electron' // 排除 Electron 原生模块 + ] + } + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + '~electron': path.resolve(__dirname, './electron') + } + } +}) \ No newline at end of file