Toggle navigation
Toggle navigation
This project
Loading...
Sign in
卢阳
/
front_backend_zImage
Go to a project
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
ly0303521
2026-01-06 18:17:26 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
3b1dfdc0705c29e355fe9601616a44e6a80f8b75
3b1dfdc0
1 parent
c0865656
添加白名单功能
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
2081 additions
and
14 deletions
backend/main.py
test_z_image_client_2.py
z-image-generator/App.tsx
z-image-generator/components/AuthModal.tsx
z-image-generator/components/WhitelistModal.tsx
z-image-generator/package-lock.json
z-image-generator/services/authService.ts
backend/main.py
View file @
3b1dfdc
...
...
@@ -4,7 +4,7 @@ import os
import
secrets
import
time
from
pathlib
import
Path
from
threading
import
Lock
from
threading
import
Lock
,
RLock
from
typing
import
List
,
Literal
,
Optional
import
httpx
...
...
@@ -20,6 +20,7 @@ Z_IMAGE_BASE_URL = os.getenv("Z_IMAGE_BASE_URL", "http://106.120.52.146:39009").
REQUEST_TIMEOUT_SECONDS
=
float
(
os
.
getenv
(
"REQUEST_TIMEOUT_SECONDS"
,
"120"
))
GALLERY_DATA_PATH
=
Path
(
os
.
getenv
(
"GALLERY_DATA_PATH"
,
Path
(
__file__
)
.
with_name
(
"gallery_data.json"
)))
GALLERY_MAX_ITEMS
=
int
(
os
.
getenv
(
"GALLERY_MAX_ITEMS"
,
"500"
))
WHITELIST_PATH
=
Path
(
os
.
getenv
(
"WHITELIST_PATH"
,
Path
(
__file__
)
.
with_name
(
"whitelist.txt"
)))
class
ImageGenerationPayload
(
BaseModel
):
...
...
@@ -67,6 +68,55 @@ class GalleryImage(BaseModel):
ImageGenerationResponse
.
model_rebuild
()
class
WhitelistStore
:
"""Simple text file backed whitelist."""
def
__init__
(
self
,
path
:
Path
)
->
None
:
self
.
path
=
path
self
.
lock
=
RLock
()
if
not
self
.
path
.
exists
():
# Default admin ID if file doesn't exist
self
.
_write
([
"86427531"
])
def
_read
(
self
)
->
List
[
str
]:
if
not
self
.
path
.
exists
():
return
[]
try
:
with
self
.
path
.
open
(
"r"
,
encoding
=
"utf-8"
)
as
f
:
lines
=
f
.
read
()
.
splitlines
()
return
[
line
.
strip
()
for
line
in
lines
if
line
.
strip
()]
except
OSError
:
return
[]
def
_write
(
self
,
ids
:
List
[
str
])
->
None
:
with
self
.
lock
:
try
:
with
self
.
path
.
open
(
"w"
,
encoding
=
"utf-8"
)
as
f
:
f
.
write
(
"
\n
"
.
join
(
ids
))
except
OSError
as
exc
:
print
(
f
"[WARN] Failed to write whitelist: {exc}"
)
def
is_allowed
(
self
,
user_id
:
str
)
->
bool
:
allowed
=
self
.
_read
()
return
user_id
in
allowed
def
add_users
(
self
,
user_ids
:
List
[
str
])
->
None
:
with
self
.
lock
:
current
=
set
(
self
.
_read
())
current
.
update
(
user_ids
)
self
.
_write
(
sorted
(
list
(
current
)))
def
remove_user
(
self
,
user_id
:
str
)
->
None
:
with
self
.
lock
:
current
=
self
.
_read
()
if
user_id
in
current
:
current
=
[
uid
for
uid
in
current
if
uid
!=
user_id
]
self
.
_write
(
current
)
def
get_all
(
self
)
->
List
[
str
]:
return
self
.
_read
()
class
GalleryStore
:
"""Simple JSON file backed store for generated images."""
...
...
@@ -157,6 +207,7 @@ class GalleryStore:
gallery_store
=
GalleryStore
(
GALLERY_DATA_PATH
,
GALLERY_MAX_ITEMS
)
whitelist_store
=
WhitelistStore
(
WHITELIST_PATH
)
app
=
FastAPI
(
title
=
"Z-Image Proxy"
,
version
=
"1.0.0"
)
...
...
@@ -186,6 +237,30 @@ async def health() -> dict:
return
{
"status"
:
"ok"
}
@app.post
(
"/auth/login"
)
async
def
login
(
user_id
:
str
=
Query
(
...
,
alias
=
"userId"
))
->
dict
:
if
whitelist_store
.
is_allowed
(
user_id
):
return
{
"status"
:
"ok"
,
"userId"
:
user_id
}
raise
HTTPException
(
status_code
=
403
,
detail
=
"User not whitelisted"
)
@app.get
(
"/admin/whitelist"
)
async
def
get_whitelist
()
->
dict
:
return
{
"whitelist"
:
whitelist_store
.
get_all
()}
@app.post
(
"/admin/whitelist"
)
async
def
add_whitelist
(
user_ids
:
List
[
str
])
->
dict
:
whitelist_store
.
add_users
(
user_ids
)
return
{
"status"
:
"ok"
,
"whitelist"
:
whitelist_store
.
get_all
()}
@app.delete
(
"/admin/whitelist/{user_id}"
)
async
def
remove_whitelist
(
user_id
:
str
)
->
dict
:
whitelist_store
.
remove_user
(
user_id
)
return
{
"status"
:
"ok"
,
"whitelist"
:
whitelist_store
.
get_all
()}
@app.post
(
"/likes/{image_id}"
)
async
def
toggle_like
(
image_id
:
str
,
...
...
test_z_image_client_2.py
View file @
3b1dfdc
z-image-generator/App.tsx
View file @
3b1dfdc
...
...
@@ -9,7 +9,8 @@ import HistoryBar from './components/HistoryBar';
import DetailModal from './components/DetailModal';
import AdminModal from './components/AdminModal';
import AuthModal from './components/AuthModal';
import { Loader2, Trash2, User as UserIcon, Save, Settings, Sparkles } from 'lucide-react';
import WhitelistModal from './components/WhitelistModal';
import { Loader2, Trash2, User as UserIcon, Save, Settings, Sparkles, Users } from 'lucide-react';
const STORAGE_KEY_DATA = 'z-image-gallery-data-v2';
const STORAGE_KEY_USER = 'z-image-user-profile';
...
...
@@ -19,6 +20,7 @@ const App: React.FC = () => {
// --- State: User ---
const [currentUser, setCurrentUser] = useState<UserProfile | null>(null);
const [isAuthModalOpen, setIsAuthModalOpen] = useState(false);
const [isWhitelistModalOpen, setIsWhitelistModalOpen] = useState(false);
// --- State: Data ---
const [images, setImages] = useState<ImageItem[]>(() => {
...
...
@@ -266,6 +268,7 @@ export const SHOWCASE_IMAGES: ImageItem[] = ${JSON.stringify(exportData, null, 2
{isAdmin && (
<div className="flex gap-2">
<button onClick={handleExportShowcase} className="hidden md:flex items-center gap-2 px-4 py-2 bg-purple-600 text-white rounded-full hover:bg-purple-700 transition-colors text-sm font-medium shadow-sm"><Save size={16} /><span>导出库</span></button>
<button onClick={() => setIsWhitelistModalOpen(true)} className="hidden md:flex items-center justify-center p-2 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 transition-colors" title="白名单管理"><Users size={20} /></button>
<button onClick={handleResetData} className="p-2 md:p-3 rounded-full hover:bg-red-50 text-gray-300 hover:text-red-500 transition-colors"><Trash2 size={20} /></button>
<button onClick={handleOpenCreateModal} className="p-2 md:p-3 rounded-full bg-black text-white hover:bg-gray-800 transition-colors shadow-sm"><Settings size={20} /></button>
</div>
...
...
@@ -305,6 +308,7 @@ export const SHOWCASE_IMAGES: ImageItem[] = ${JSON.stringify(exportData, null, 2
)}
<AdminModal isOpen={isAdminModalOpen} onClose={() => setIsAdminModalOpen(false)} onSave={handleSaveImage} onDelete={handleDeleteImage} initialData={editingImage} />
<WhitelistModal isOpen={isWhitelistModalOpen} onClose={() => setIsWhitelistModalOpen(false)} />
</div>
);
};
...
...
z-image-generator/components/AuthModal.tsx
View file @
3b1dfdc
import React, { useState } from 'react';
import { User, Lock } from 'lucide-react';
import { User, Lock, Loader2 } from 'lucide-react';
import { login } from '../services/authService';
interface AuthModalProps {
isOpen: boolean;
...
...
@@ -9,18 +10,32 @@ interface AuthModalProps {
const AuthModal: React.FC<AuthModalProps> = ({ isOpen, onLogin }) => {
const [inputId, setInputId] = useState('');
const [error, setError] = useState('');
const [isLoading, setIsLoading] = useState(false);
if (!isOpen) return null;
const handleSubmit = (e: React.FormEvent) => {
const handleSubmit =
async
(e: React.FormEvent) => {
e.preventDefault();
// Validate 8-digit requirement
const regex = /^\d{8}$/;
if (!regex.test(inputId)) {
setError('工号必须是8位数字');
if (!inputId.trim()) {
setError('请输入工号');
return;
}
onLogin(inputId);
setIsLoading(true);
setError('');
try {
const success = await login(inputId.trim());
if (success) {
onLogin(inputId.trim());
} else {
setError('验证失败:工号未在白名单中');
}
} catch (e) {
setError('服务器连接失败,请稍后重试');
} finally {
setIsLoading(false);
}
};
return (
...
...
@@ -37,7 +52,7 @@ const AuthModal: React.FC<AuthModalProps> = ({ isOpen, onLogin }) => {
欢迎来到 艺云-DESIGN
</h2>
<p className="text-gray-500 mb-8">
请输入您的
8位
工号以访问平台功能
请输入您的工号以访问平台功能
</p>
<form onSubmit={handleSubmit} className="space-y-4">
...
...
@@ -50,9 +65,9 @@ const AuthModal: React.FC<AuthModalProps> = ({ isOpen, onLogin }) => {
setInputId(e.target.value);
setError('');
}}
placeholder="请输入
8位工号 (例如: 10023456)
"
placeholder="请输入
工号
"
className="w-full pl-10 pr-4 py-3 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl focus:ring-2 focus:ring-black dark:focus:ring-white outline-none transition-all font-mono"
maxLength={8
}
disabled={isLoading
}
/>
</div>
...
...
@@ -62,9 +77,11 @@ const AuthModal: React.FC<AuthModalProps> = ({ isOpen, onLogin }) => {
<button
type="submit"
className="w-full py-3 bg-black dark:bg-white text-white dark:text-black rounded-xl font-bold hover:opacity-90 transition-opacity"
disabled={isLoading}
className="w-full py-3 bg-black dark:bg-white text-white dark:text-black rounded-xl font-bold hover:opacity-90 transition-opacity flex items-center justify-center gap-2"
>
进入系统
{isLoading && <Loader2 className="animate-spin" size={20} />}
{isLoading ? '验证中...' : '进入系统'}
</button>
</form>
</div>
...
...
z-image-generator/components/WhitelistModal.tsx
0 → 100644
View file @
3b1dfdc
import React, { useState, useEffect } from 'react';
import { X, Plus, RefreshCw, Trash2 } from 'lucide-react';
import { getWhitelist, addWhitelist, removeWhitelist } from '../services/authService';
interface WhitelistModalProps {
isOpen: boolean;
onClose: () => void;
}
const WhitelistModal: React.FC<WhitelistModalProps> = ({ isOpen, onClose }) => {
const [whitelist, setWhitelist] = useState<string[]>([]);
const [newIds, setNewIds] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
if (isOpen) {
loadWhitelist();
}
}, [isOpen]);
const loadWhitelist = async () => {
setIsLoading(true);
try {
const data = await getWhitelist();
setWhitelist(data);
setError(null);
} catch (e) {
setError('无法获取白名单');
} finally {
setIsLoading(false);
}
};
const handleAdd = async () => {
if (!newIds.trim()) return;
// Split by newlines, commas, or spaces
const idsToAdd = newIds
.split(/[\n, ]+/)
.map(s => s.trim())
.filter(s => s.length > 0);
if (idsToAdd.length === 0) return;
setIsLoading(true);
try {
const updated = await addWhitelist(idsToAdd);
setWhitelist(updated);
setNewIds('');
setError(null);
} catch (e) {
setError('添加失败');
} finally {
setIsLoading(false);
}
};
const handleDelete = async (id: string) => {
if (!confirm(`确定要移除用户 ${id} 吗?`)) return;
setIsLoading(true);
try {
const updated = await removeWhitelist(id);
setWhitelist(updated);
setError(null);
} catch (e) {
setError('移除失败');
} finally {
setIsLoading(false);
}
};
if (!isOpen) return null;
return (
<div className="fixed inset-0 z-[110] flex items-center justify-center p-4">
<div className="absolute inset-0 bg-black/80 backdrop-blur-sm" onClick={onClose} />
<div className="relative bg-white dark:bg-gray-900 w-full max-w-2xl rounded-2xl shadow-2xl overflow-hidden flex flex-col max-h-[80vh]">
<div className="flex justify-between items-center p-6 border-b border-gray-100 dark:border-gray-800">
<h2 className="text-xl font-bold text-gray-800 dark:text-white flex items-center gap-2">
用户白名单管理
<span className="text-sm font-normal text-gray-500 bg-gray-100 dark:bg-gray-800 px-2 py-0.5 rounded-full">
{whitelist.length} 人
</span>
</h2>
<button onClick={onClose} className="p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-full">
<X size={20} />
</button>
</div>
<div className="flex-1 overflow-hidden flex flex-col p-6 gap-6">
{/* Add Section */}
<div className="space-y-3">
<label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
批量添加 (每行一个,或用逗号/空格分隔)
</label>
<div className="flex gap-3">
<textarea
value={newIds}
onChange={(e) => setNewIds(e.target.value)}
placeholder="例如:\n1001\n1002\n1003"
className="flex-1 p-3 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl focus:ring-2 focus:ring-black dark:focus:ring-white outline-none min-h-[100px] font-mono text-sm resize-none"
/>
</div>
<button
onClick={handleAdd}
disabled={isLoading || !newIds.trim()}
className="w-full py-2 bg-black dark:bg-white text-white dark:text-black rounded-lg hover:opacity-90 transition-opacity font-medium disabled:opacity-50 flex items-center justify-center gap-2"
>
<Plus size={18} />
添加至白名单
</button>
</div>
{/* List Section */}
<div className="flex-1 overflow-y-auto border border-gray-100 dark:border-gray-800 rounded-xl bg-gray-50 dark:bg-gray-800/50 p-4">
<div className="flex justify-between items-center mb-3">
<h3 className="font-medium text-gray-700 dark:text-gray-300 text-sm">已授权用户</h3>
<button onClick={loadWhitelist} className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 p-1">
<RefreshCw size={14} className={isLoading ? "animate-spin" : ""} />
</button>
</div>
{error ? (
<div className="text-red-500 text-center py-4 text-sm">{error}</div>
) : (
<div className="grid grid-cols-2 md:grid-cols-3 gap-2">
{whitelist.map(id => (
<div key={id} className="bg-white dark:bg-gray-800 px-3 py-2 rounded border border-gray-100 dark:border-gray-700 flex justify-between items-center group">
<span className="font-mono text-sm">{id}</span>
<button
onClick={() => handleDelete(id)}
className="text-gray-400 hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity p-1"
title="移除用户"
>
<Trash2 size={14} />
</button>
</div>
))}
</div>
)}
</div>
</div>
</div>
</div>
);
};
export default WhitelistModal;
\ No newline at end of file
...
...
z-image-generator/package-lock.json
0 → 100644
View file @
3b1dfdc
{
"name"
:
"z-image-generator"
,
"version"
:
"0.0.0"
,
"lockfileVersion"
:
3
,
"requires"
:
true
,
"packages"
:
{
""
:
{
"name"
:
"z-image-generator"
,
"version"
:
"0.0.0"
,
"dependencies"
:
{
"lucide-react"
:
"^0.561.0"
,
"react"
:
"^19.2.3"
,
"react-dom"
:
"^19.2.3"
},
"devDependencies"
:
{
"@types/node"
:
"^22.14.0"
,
"@vitejs/plugin-react"
:
"^5.0.0"
,
"typescript"
:
"~5.8.2"
,
"vite"
:
"^6.2.0"
}
},
"node_modules/@babel/code-frame"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz"
,
"integrity"
:
"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/helper-validator-identifier"
:
"^7.27.1"
,
"js-tokens"
:
"^4.0.0"
,
"picocolors"
:
"^1.1.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/compat-data"
:
{
"version"
:
"7.28.5"
,
"resolved"
:
"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"
,
"integrity"
:
"sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/core"
:
{
"version"
:
"7.28.5"
,
"resolved"
:
"https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"
,
"integrity"
:
"sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"peer"
:
true
,
"dependencies"
:
{
"@babel/code-frame"
:
"^7.27.1"
,
"@babel/generator"
:
"^7.28.5"
,
"@babel/helper-compilation-targets"
:
"^7.27.2"
,
"@babel/helper-module-transforms"
:
"^7.28.3"
,
"@babel/helpers"
:
"^7.28.4"
,
"@babel/parser"
:
"^7.28.5"
,
"@babel/template"
:
"^7.27.2"
,
"@babel/traverse"
:
"^7.28.5"
,
"@babel/types"
:
"^7.28.5"
,
"@jridgewell/remapping"
:
"^2.3.5"
,
"convert-source-map"
:
"^2.0.0"
,
"debug"
:
"^4.1.0"
,
"gensync"
:
"^1.0.0-beta.2"
,
"json5"
:
"^2.2.3"
,
"semver"
:
"^6.3.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
},
"funding"
:
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/babel"
}
},
"node_modules/@babel/generator"
:
{
"version"
:
"7.28.5"
,
"resolved"
:
"https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz"
,
"integrity"
:
"sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/parser"
:
"^7.28.5"
,
"@babel/types"
:
"^7.28.5"
,
"@jridgewell/gen-mapping"
:
"^0.3.12"
,
"@jridgewell/trace-mapping"
:
"^0.3.28"
,
"jsesc"
:
"^3.0.2"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets"
:
{
"version"
:
"7.27.2"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz"
,
"integrity"
:
"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/compat-data"
:
"^7.27.2"
,
"@babel/helper-validator-option"
:
"^7.27.1"
,
"browserslist"
:
"^4.24.0"
,
"lru-cache"
:
"^5.1.1"
,
"semver"
:
"^6.3.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helper-globals"
:
{
"version"
:
"7.28.0"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz"
,
"integrity"
:
"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz"
,
"integrity"
:
"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/traverse"
:
"^7.27.1"
,
"@babel/types"
:
"^7.27.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms"
:
{
"version"
:
"7.28.3"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz"
,
"integrity"
:
"sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/helper-module-imports"
:
"^7.27.1"
,
"@babel/helper-validator-identifier"
:
"^7.27.1"
,
"@babel/traverse"
:
"^7.28.3"
},
"engines"
:
{
"node"
:
">=6.9.0"
},
"peerDependencies"
:
{
"@babel/core"
:
"^7.0.0"
}
},
"node_modules/@babel/helper-plugin-utils"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz"
,
"integrity"
:
"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
,
"integrity"
:
"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier"
:
{
"version"
:
"7.28.5"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"
,
"integrity"
:
"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"
,
"integrity"
:
"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/helpers"
:
{
"version"
:
"7.28.4"
,
"resolved"
:
"https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz"
,
"integrity"
:
"sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/template"
:
"^7.27.2"
,
"@babel/types"
:
"^7.28.4"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/parser"
:
{
"version"
:
"7.28.5"
,
"resolved"
:
"https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz"
,
"integrity"
:
"sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/types"
:
"^7.28.5"
},
"bin"
:
{
"parser"
:
"bin/babel-parser.js"
},
"engines"
:
{
"node"
:
">=6.0.0"
}
},
"node_modules/@babel/plugin-transform-react-jsx-self"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz"
,
"integrity"
:
"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/helper-plugin-utils"
:
"^7.27.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
},
"peerDependencies"
:
{
"@babel/core"
:
"^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-react-jsx-source"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz"
,
"integrity"
:
"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/helper-plugin-utils"
:
"^7.27.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
},
"peerDependencies"
:
{
"@babel/core"
:
"^7.0.0-0"
}
},
"node_modules/@babel/template"
:
{
"version"
:
"7.27.2"
,
"resolved"
:
"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz"
,
"integrity"
:
"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/code-frame"
:
"^7.27.1"
,
"@babel/parser"
:
"^7.27.2"
,
"@babel/types"
:
"^7.27.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/traverse"
:
{
"version"
:
"7.28.5"
,
"resolved"
:
"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz"
,
"integrity"
:
"sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/code-frame"
:
"^7.27.1"
,
"@babel/generator"
:
"^7.28.5"
,
"@babel/helper-globals"
:
"^7.28.0"
,
"@babel/parser"
:
"^7.28.5"
,
"@babel/template"
:
"^7.27.2"
,
"@babel/types"
:
"^7.28.5"
,
"debug"
:
"^4.3.1"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/types"
:
{
"version"
:
"7.28.5"
,
"resolved"
:
"https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz"
,
"integrity"
:
"sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/helper-string-parser"
:
"^7.27.1"
,
"@babel/helper-validator-identifier"
:
"^7.28.5"
},
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@esbuild/aix-ppc64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz"
,
"integrity"
:
"sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="
,
"cpu"
:
[
"ppc64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"aix"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/android-arm"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz"
,
"integrity"
:
"sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="
,
"cpu"
:
[
"arm"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"android"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/android-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"android"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/android-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"android"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/darwin-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"darwin"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/darwin-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"darwin"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/freebsd-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"freebsd"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/freebsd-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"freebsd"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-arm"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz"
,
"integrity"
:
"sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="
,
"cpu"
:
[
"arm"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-ia32"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz"
,
"integrity"
:
"sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="
,
"cpu"
:
[
"ia32"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-loong64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz"
,
"integrity"
:
"sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="
,
"cpu"
:
[
"loong64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-mips64el"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz"
,
"integrity"
:
"sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="
,
"cpu"
:
[
"mips64el"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-ppc64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz"
,
"integrity"
:
"sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="
,
"cpu"
:
[
"ppc64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-riscv64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz"
,
"integrity"
:
"sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="
,
"cpu"
:
[
"riscv64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-s390x"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz"
,
"integrity"
:
"sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="
,
"cpu"
:
[
"s390x"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/linux-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/netbsd-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"netbsd"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/netbsd-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"netbsd"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/openbsd-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"openbsd"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/openbsd-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"openbsd"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/openharmony-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"openharmony"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/sunos-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"sunos"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/win32-arm64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz"
,
"integrity"
:
"sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"win32"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/win32-ia32"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz"
,
"integrity"
:
"sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="
,
"cpu"
:
[
"ia32"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"win32"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@esbuild/win32-x64"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz"
,
"integrity"
:
"sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"win32"
],
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@jridgewell/gen-mapping"
:
{
"version"
:
"0.3.13"
,
"resolved"
:
"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
,
"integrity"
:
"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@jridgewell/sourcemap-codec"
:
"^1.5.0"
,
"@jridgewell/trace-mapping"
:
"^0.3.24"
}
},
"node_modules/@jridgewell/remapping"
:
{
"version"
:
"2.3.5"
,
"resolved"
:
"https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"
,
"integrity"
:
"sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@jridgewell/gen-mapping"
:
"^0.3.5"
,
"@jridgewell/trace-mapping"
:
"^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri"
:
{
"version"
:
"3.1.2"
,
"resolved"
:
"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
,
"integrity"
:
"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec"
:
{
"version"
:
"1.5.5"
,
"resolved"
:
"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
,
"integrity"
:
"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/@jridgewell/trace-mapping"
:
{
"version"
:
"0.3.31"
,
"resolved"
:
"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
,
"integrity"
:
"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@jridgewell/resolve-uri"
:
"^3.1.0"
,
"@jridgewell/sourcemap-codec"
:
"^1.4.14"
}
},
"node_modules/@rolldown/pluginutils"
:
{
"version"
:
"1.0.0-beta.53"
,
"resolved"
:
"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz"
,
"integrity"
:
"sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz"
,
"integrity"
:
"sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng=="
,
"cpu"
:
[
"arm"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"android"
]
},
"node_modules/@rollup/rollup-android-arm64"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz"
,
"integrity"
:
"sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"android"
]
},
"node_modules/@rollup/rollup-darwin-arm64"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz"
,
"integrity"
:
"sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"darwin"
]
},
"node_modules/@rollup/rollup-darwin-x64"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz"
,
"integrity"
:
"sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"darwin"
]
},
"node_modules/@rollup/rollup-freebsd-arm64"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz"
,
"integrity"
:
"sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"freebsd"
]
},
"node_modules/@rollup/rollup-freebsd-x64"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz"
,
"integrity"
:
"sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"freebsd"
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz"
,
"integrity"
:
"sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ=="
,
"cpu"
:
[
"arm"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz"
,
"integrity"
:
"sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA=="
,
"cpu"
:
[
"arm"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz"
,
"integrity"
:
"sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-musl"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz"
,
"integrity"
:
"sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz"
,
"integrity"
:
"sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw=="
,
"cpu"
:
[
"loong64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz"
,
"integrity"
:
"sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA=="
,
"cpu"
:
[
"ppc64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz"
,
"integrity"
:
"sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ=="
,
"cpu"
:
[
"riscv64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz"
,
"integrity"
:
"sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A=="
,
"cpu"
:
[
"riscv64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz"
,
"integrity"
:
"sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ=="
,
"cpu"
:
[
"s390x"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz"
,
"integrity"
:
"sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-musl"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz"
,
"integrity"
:
"sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"linux"
]
},
"node_modules/@rollup/rollup-openharmony-arm64"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz"
,
"integrity"
:
"sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"openharmony"
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz"
,
"integrity"
:
"sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw=="
,
"cpu"
:
[
"arm64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"win32"
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz"
,
"integrity"
:
"sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ=="
,
"cpu"
:
[
"ia32"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-gnu"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz"
,
"integrity"
:
"sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz"
,
"integrity"
:
"sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg=="
,
"cpu"
:
[
"x64"
],
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"win32"
]
},
"node_modules/@types/babel__core"
:
{
"version"
:
"7.20.5"
,
"resolved"
:
"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
,
"integrity"
:
"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/parser"
:
"^7.20.7"
,
"@babel/types"
:
"^7.20.7"
,
"@types/babel__generator"
:
"*"
,
"@types/babel__template"
:
"*"
,
"@types/babel__traverse"
:
"*"
}
},
"node_modules/@types/babel__generator"
:
{
"version"
:
"7.27.0"
,
"resolved"
:
"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz"
,
"integrity"
:
"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/types"
:
"^7.0.0"
}
},
"node_modules/@types/babel__template"
:
{
"version"
:
"7.4.4"
,
"resolved"
:
"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz"
,
"integrity"
:
"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/parser"
:
"^7.1.0"
,
"@babel/types"
:
"^7.0.0"
}
},
"node_modules/@types/babel__traverse"
:
{
"version"
:
"7.28.0"
,
"resolved"
:
"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz"
,
"integrity"
:
"sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/types"
:
"^7.28.2"
}
},
"node_modules/@types/estree"
:
{
"version"
:
"1.0.8"
,
"resolved"
:
"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
,
"integrity"
:
"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/@types/node"
:
{
"version"
:
"22.19.3"
,
"resolved"
:
"https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz"
,
"integrity"
:
"sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"peer"
:
true
,
"dependencies"
:
{
"undici-types"
:
"~6.21.0"
}
},
"node_modules/@vitejs/plugin-react"
:
{
"version"
:
"5.1.2"
,
"resolved"
:
"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz"
,
"integrity"
:
"sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/core"
:
"^7.28.5"
,
"@babel/plugin-transform-react-jsx-self"
:
"^7.27.1"
,
"@babel/plugin-transform-react-jsx-source"
:
"^7.27.1"
,
"@rolldown/pluginutils"
:
"1.0.0-beta.53"
,
"@types/babel__core"
:
"^7.20.5"
,
"react-refresh"
:
"^0.18.0"
},
"engines"
:
{
"node"
:
"^20.19.0 || >=22.12.0"
},
"peerDependencies"
:
{
"vite"
:
"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
"node_modules/baseline-browser-mapping"
:
{
"version"
:
"2.9.11"
,
"resolved"
:
"https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz"
,
"integrity"
:
"sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ=="
,
"dev"
:
true
,
"license"
:
"Apache-2.0"
,
"bin"
:
{
"baseline-browser-mapping"
:
"dist/cli.js"
}
},
"node_modules/browserslist"
:
{
"version"
:
"4.28.1"
,
"resolved"
:
"https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"
,
"integrity"
:
"sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/browserslist"
},
{
"type"
:
"tidelift"
,
"url"
:
"https://tidelift.com/funding/github/npm/browserslist"
},
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/ai"
}
],
"license"
:
"MIT"
,
"peer"
:
true
,
"dependencies"
:
{
"baseline-browser-mapping"
:
"^2.9.0"
,
"caniuse-lite"
:
"^1.0.30001759"
,
"electron-to-chromium"
:
"^1.5.263"
,
"node-releases"
:
"^2.0.27"
,
"update-browserslist-db"
:
"^1.2.0"
},
"bin"
:
{
"browserslist"
:
"cli.js"
},
"engines"
:
{
"node"
:
"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/caniuse-lite"
:
{
"version"
:
"1.0.30001761"
,
"resolved"
:
"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz"
,
"integrity"
:
"sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/browserslist"
},
{
"type"
:
"tidelift"
,
"url"
:
"https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/ai"
}
],
"license"
:
"CC-BY-4.0"
},
"node_modules/convert-source-map"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
,
"integrity"
:
"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/debug"
:
{
"version"
:
"4.4.3"
,
"resolved"
:
"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
,
"integrity"
:
"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ms"
:
"^2.1.3"
},
"engines"
:
{
"node"
:
">=6.0"
},
"peerDependenciesMeta"
:
{
"supports-color"
:
{
"optional"
:
true
}
}
},
"node_modules/electron-to-chromium"
:
{
"version"
:
"1.5.267"
,
"resolved"
:
"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz"
,
"integrity"
:
"sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="
,
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/esbuild"
:
{
"version"
:
"0.25.12"
,
"resolved"
:
"https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz"
,
"integrity"
:
"sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="
,
"dev"
:
true
,
"hasInstallScript"
:
true
,
"license"
:
"MIT"
,
"bin"
:
{
"esbuild"
:
"bin/esbuild"
},
"engines"
:
{
"node"
:
">=18"
},
"optionalDependencies"
:
{
"@esbuild/aix-ppc64"
:
"0.25.12"
,
"@esbuild/android-arm"
:
"0.25.12"
,
"@esbuild/android-arm64"
:
"0.25.12"
,
"@esbuild/android-x64"
:
"0.25.12"
,
"@esbuild/darwin-arm64"
:
"0.25.12"
,
"@esbuild/darwin-x64"
:
"0.25.12"
,
"@esbuild/freebsd-arm64"
:
"0.25.12"
,
"@esbuild/freebsd-x64"
:
"0.25.12"
,
"@esbuild/linux-arm"
:
"0.25.12"
,
"@esbuild/linux-arm64"
:
"0.25.12"
,
"@esbuild/linux-ia32"
:
"0.25.12"
,
"@esbuild/linux-loong64"
:
"0.25.12"
,
"@esbuild/linux-mips64el"
:
"0.25.12"
,
"@esbuild/linux-ppc64"
:
"0.25.12"
,
"@esbuild/linux-riscv64"
:
"0.25.12"
,
"@esbuild/linux-s390x"
:
"0.25.12"
,
"@esbuild/linux-x64"
:
"0.25.12"
,
"@esbuild/netbsd-arm64"
:
"0.25.12"
,
"@esbuild/netbsd-x64"
:
"0.25.12"
,
"@esbuild/openbsd-arm64"
:
"0.25.12"
,
"@esbuild/openbsd-x64"
:
"0.25.12"
,
"@esbuild/openharmony-arm64"
:
"0.25.12"
,
"@esbuild/sunos-x64"
:
"0.25.12"
,
"@esbuild/win32-arm64"
:
"0.25.12"
,
"@esbuild/win32-ia32"
:
"0.25.12"
,
"@esbuild/win32-x64"
:
"0.25.12"
}
},
"node_modules/escalade"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
,
"integrity"
:
"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6"
}
},
"node_modules/fdir"
:
{
"version"
:
"6.5.0"
,
"resolved"
:
"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
,
"integrity"
:
"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=12.0.0"
},
"peerDependencies"
:
{
"picomatch"
:
"^3 || ^4"
},
"peerDependenciesMeta"
:
{
"picomatch"
:
{
"optional"
:
true
}
}
},
"node_modules/fsevents"
:
{
"version"
:
"2.3.3"
,
"resolved"
:
"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
,
"integrity"
:
"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="
,
"dev"
:
true
,
"hasInstallScript"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"os"
:
[
"darwin"
],
"engines"
:
{
"node"
:
"^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/gensync"
:
{
"version"
:
"1.0.0-beta.2"
,
"resolved"
:
"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
,
"integrity"
:
"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/js-tokens"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
,
"integrity"
:
"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/jsesc"
:
{
"version"
:
"3.1.0"
,
"resolved"
:
"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"
,
"integrity"
:
"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"bin"
:
{
"jsesc"
:
"bin/jsesc"
},
"engines"
:
{
"node"
:
">=6"
}
},
"node_modules/json5"
:
{
"version"
:
"2.2.3"
,
"resolved"
:
"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
,
"integrity"
:
"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"bin"
:
{
"json5"
:
"lib/cli.js"
},
"engines"
:
{
"node"
:
">=6"
}
},
"node_modules/lru-cache"
:
{
"version"
:
"5.1.1"
,
"resolved"
:
"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
,
"integrity"
:
"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"yallist"
:
"^3.0.2"
}
},
"node_modules/lucide-react"
:
{
"version"
:
"0.561.0"
,
"resolved"
:
"https://registry.npmjs.org/lucide-react/-/lucide-react-0.561.0.tgz"
,
"integrity"
:
"sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A=="
,
"license"
:
"ISC"
,
"peerDependencies"
:
{
"react"
:
"^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
,
"integrity"
:
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/nanoid"
:
{
"version"
:
"3.3.11"
,
"resolved"
:
"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
,
"integrity"
:
"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/ai"
}
],
"license"
:
"MIT"
,
"bin"
:
{
"nanoid"
:
"bin/nanoid.cjs"
},
"engines"
:
{
"node"
:
"^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/node-releases"
:
{
"version"
:
"2.0.27"
,
"resolved"
:
"https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz"
,
"integrity"
:
"sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/picocolors"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
,
"integrity"
:
"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
,
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/picomatch"
:
{
"version"
:
"4.0.3"
,
"resolved"
:
"https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
,
"integrity"
:
"sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"peer"
:
true
,
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/postcss"
:
{
"version"
:
"8.5.6"
,
"resolved"
:
"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
,
"integrity"
:
"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/postcss/"
},
{
"type"
:
"tidelift"
,
"url"
:
"https://tidelift.com/funding/github/npm/postcss"
},
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/ai"
}
],
"license"
:
"MIT"
,
"dependencies"
:
{
"nanoid"
:
"^3.3.11"
,
"picocolors"
:
"^1.1.1"
,
"source-map-js"
:
"^1.2.1"
},
"engines"
:
{
"node"
:
"^10 || ^12 || >=14"
}
},
"node_modules/react"
:
{
"version"
:
"19.2.3"
,
"resolved"
:
"https://registry.npmjs.org/react/-/react-19.2.3.tgz"
,
"integrity"
:
"sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="
,
"license"
:
"MIT"
,
"peer"
:
true
,
"engines"
:
{
"node"
:
">=0.10.0"
}
},
"node_modules/react-dom"
:
{
"version"
:
"19.2.3"
,
"resolved"
:
"https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz"
,
"integrity"
:
"sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"scheduler"
:
"^0.27.0"
},
"peerDependencies"
:
{
"react"
:
"^19.2.3"
}
},
"node_modules/react-refresh"
:
{
"version"
:
"0.18.0"
,
"resolved"
:
"https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz"
,
"integrity"
:
"sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=0.10.0"
}
},
"node_modules/rollup"
:
{
"version"
:
"4.54.0"
,
"resolved"
:
"https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz"
,
"integrity"
:
"sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@types/estree"
:
"1.0.8"
},
"bin"
:
{
"rollup"
:
"dist/bin/rollup"
},
"engines"
:
{
"node"
:
">=18.0.0"
,
"npm"
:
">=8.0.0"
},
"optionalDependencies"
:
{
"@rollup/rollup-android-arm-eabi"
:
"4.54.0"
,
"@rollup/rollup-android-arm64"
:
"4.54.0"
,
"@rollup/rollup-darwin-arm64"
:
"4.54.0"
,
"@rollup/rollup-darwin-x64"
:
"4.54.0"
,
"@rollup/rollup-freebsd-arm64"
:
"4.54.0"
,
"@rollup/rollup-freebsd-x64"
:
"4.54.0"
,
"@rollup/rollup-linux-arm-gnueabihf"
:
"4.54.0"
,
"@rollup/rollup-linux-arm-musleabihf"
:
"4.54.0"
,
"@rollup/rollup-linux-arm64-gnu"
:
"4.54.0"
,
"@rollup/rollup-linux-arm64-musl"
:
"4.54.0"
,
"@rollup/rollup-linux-loong64-gnu"
:
"4.54.0"
,
"@rollup/rollup-linux-ppc64-gnu"
:
"4.54.0"
,
"@rollup/rollup-linux-riscv64-gnu"
:
"4.54.0"
,
"@rollup/rollup-linux-riscv64-musl"
:
"4.54.0"
,
"@rollup/rollup-linux-s390x-gnu"
:
"4.54.0"
,
"@rollup/rollup-linux-x64-gnu"
:
"4.54.0"
,
"@rollup/rollup-linux-x64-musl"
:
"4.54.0"
,
"@rollup/rollup-openharmony-arm64"
:
"4.54.0"
,
"@rollup/rollup-win32-arm64-msvc"
:
"4.54.0"
,
"@rollup/rollup-win32-ia32-msvc"
:
"4.54.0"
,
"@rollup/rollup-win32-x64-gnu"
:
"4.54.0"
,
"@rollup/rollup-win32-x64-msvc"
:
"4.54.0"
,
"fsevents"
:
"~2.3.2"
}
},
"node_modules/scheduler"
:
{
"version"
:
"0.27.0"
,
"resolved"
:
"https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
,
"integrity"
:
"sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="
,
"license"
:
"MIT"
},
"node_modules/semver"
:
{
"version"
:
"6.3.1"
,
"resolved"
:
"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
,
"integrity"
:
"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"bin"
:
{
"semver"
:
"bin/semver.js"
}
},
"node_modules/source-map-js"
:
{
"version"
:
"1.2.1"
,
"resolved"
:
"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
,
"integrity"
:
"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
,
"dev"
:
true
,
"license"
:
"BSD-3-Clause"
,
"engines"
:
{
"node"
:
">=0.10.0"
}
},
"node_modules/tinyglobby"
:
{
"version"
:
"0.2.15"
,
"resolved"
:
"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz"
,
"integrity"
:
"sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"fdir"
:
"^6.5.0"
,
"picomatch"
:
"^4.0.3"
},
"engines"
:
{
"node"
:
">=12.0.0"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/SuperchupuDev"
}
},
"node_modules/typescript"
:
{
"version"
:
"5.8.3"
,
"resolved"
:
"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
,
"integrity"
:
"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="
,
"dev"
:
true
,
"license"
:
"Apache-2.0"
,
"bin"
:
{
"tsc"
:
"bin/tsc"
,
"tsserver"
:
"bin/tsserver"
},
"engines"
:
{
"node"
:
">=14.17"
}
},
"node_modules/undici-types"
:
{
"version"
:
"6.21.0"
,
"resolved"
:
"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz"
,
"integrity"
:
"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/update-browserslist-db"
:
{
"version"
:
"1.2.3"
,
"resolved"
:
"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz"
,
"integrity"
:
"sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/browserslist"
},
{
"type"
:
"tidelift"
,
"url"
:
"https://tidelift.com/funding/github/npm/browserslist"
},
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/ai"
}
],
"license"
:
"MIT"
,
"dependencies"
:
{
"escalade"
:
"^3.2.0"
,
"picocolors"
:
"^1.1.1"
},
"bin"
:
{
"update-browserslist-db"
:
"cli.js"
},
"peerDependencies"
:
{
"browserslist"
:
">= 4.21.0"
}
},
"node_modules/vite"
:
{
"version"
:
"6.4.1"
,
"resolved"
:
"https://registry.npmjs.org/vite/-/vite-6.4.1.tgz"
,
"integrity"
:
"sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"peer"
:
true
,
"dependencies"
:
{
"esbuild"
:
"^0.25.0"
,
"fdir"
:
"^6.4.4"
,
"picomatch"
:
"^4.0.2"
,
"postcss"
:
"^8.5.3"
,
"rollup"
:
"^4.34.9"
,
"tinyglobby"
:
"^0.2.13"
},
"bin"
:
{
"vite"
:
"bin/vite.js"
},
"engines"
:
{
"node"
:
"^18.0.0 || ^20.0.0 || >=22.0.0"
},
"funding"
:
{
"url"
:
"https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies"
:
{
"fsevents"
:
"~2.3.3"
},
"peerDependencies"
:
{
"@types/node"
:
"^18.0.0 || ^20.0.0 || >=22.0.0"
,
"jiti"
:
">=1.21.0"
,
"less"
:
"*"
,
"lightningcss"
:
"^1.21.0"
,
"sass"
:
"*"
,
"sass-embedded"
:
"*"
,
"stylus"
:
"*"
,
"sugarss"
:
"*"
,
"terser"
:
"^5.16.0"
,
"tsx"
:
"^4.8.1"
,
"yaml"
:
"^2.4.2"
},
"peerDependenciesMeta"
:
{
"@types/node"
:
{
"optional"
:
true
},
"jiti"
:
{
"optional"
:
true
},
"less"
:
{
"optional"
:
true
},
"lightningcss"
:
{
"optional"
:
true
},
"sass"
:
{
"optional"
:
true
},
"sass-embedded"
:
{
"optional"
:
true
},
"stylus"
:
{
"optional"
:
true
},
"sugarss"
:
{
"optional"
:
true
},
"terser"
:
{
"optional"
:
true
},
"tsx"
:
{
"optional"
:
true
},
"yaml"
:
{
"optional"
:
true
}
}
},
"node_modules/yallist"
:
{
"version"
:
"3.1.1"
,
"resolved"
:
"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
,
"integrity"
:
"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
,
"dev"
:
true
,
"license"
:
"ISC"
}
}
}
...
...
z-image-generator/services/authService.ts
0 → 100644
View file @
3b1dfdc
import
{
API_BASE_URL
}
from
'../constants'
;
export
const
login
=
async
(
userId
:
string
)
:
Promise
<
boolean
>
=>
{
try
{
const
response
=
await
fetch
(
`
$
{
API_BASE_URL
}
/auth/
login
?
userId
=
$
{
userId
}
`
,
{
method
:
'POST'
,
});
if
(
response
.
status
===
200
)
{
return
true
;
}
return
false
;
}
catch
(
error
)
{
console
.
error
(
"Login error:"
,
error
);
return
false
;
}
};
export
const
getWhitelist
=
async
():
Promise
<
string
[]
>
=>
{
const
response
=
await
fetch
(
`
$
{
API_BASE_URL
}
/admin/
whitelist
`
);
if
(
!
response
.
ok
)
throw
new
Error
(
'Failed to fetch whitelist'
);
const
data
=
await
response
.
json
();
return
data
.
whitelist
;
};
export
const
addWhitelist
=
async
(
userIds
:
string
[]):
Promise
<
string
[]
>
=>
{
const
response
=
await
fetch
(
`
$
{
API_BASE_URL
}
/admin/
whitelist
`
,
{
method
:
'POST'
,
headers
:
{
'Content-Type'
:
'application/json'
},
body
:
JSON
.
stringify
(
userIds
),
});
if
(
!
response
.
ok
)
throw
new
Error
(
'Failed to add to whitelist'
);
const
data
=
await
response
.
json
();
return
data
.
whitelist
;
};
export
const
removeWhitelist
=
async
(
userId
:
string
):
Promise
<
string
[]
>
=>
{
const
response
=
await
fetch
(
`
$
{
API_BASE_URL
}
/admin/
whitelist
/
$
{
userId
}
`
,
{
method
:
'DELETE'
,
});
if
(
!
response
.
ok
)
throw
new
Error
(
'Failed to remove from whitelist'
);
const
data
=
await
response
.
json
();
return
data
.
whitelist
;
};
...
...
Please
register
or
login
to post a comment