diff --git a/.github/workflows/build-go.yml b/.github/workflows/build-go.yml index d497cc3..119eae4 100644 --- a/.github/workflows/build-go.yml +++ b/.github/workflows/build-go.yml @@ -26,7 +26,7 @@ jobs: - name: Build Linux arm64 run: | - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o tgState main.go + CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build -o tgState main.go - name: Zip Linux amd64 run: | diff --git a/.gitignore b/.gitignore index bccfc20..ecc479a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,14 @@ mk.txt .idea/* .vscode/* tmp/* -.air.toml -.vercel +.air.toml +.vercel +/.env +/files.db +/tgState.zip + +__debug_bin.exe* + +node_modules/ + +.env \ No newline at end of file diff --git a/FRONTEND_README.md b/FRONTEND_README.md new file mode 100644 index 0000000..f07159d --- /dev/null +++ b/FRONTEND_README.md @@ -0,0 +1,113 @@ +# TGState 前端重构 + +使用 Vite + Vue 3 + Shadcn UI 重构的现代化前端界面。 + +## 功能特性 + +- 🎨 现代化的UI设计,基于Shadcn UI组件库 +- 📱 完全响应式设计,支持移动端 +- 🚀 使用Vite构建,开发体验更佳 +- ⚡ Vue 3 Composition API,性能更优 +- 📤 支持拖拽上传和多文件上传 +- 📊 实时上传进度显示 +- 🔄 大文件分片上传支持 +- 📋 一键复制链接功能 +- 🖼️ 图片文件支持HTML和Markdown格式复制 + +## 开发环境 + +### 前端开发 +```bash +cd frontend +npm install +npm run dev +``` + +### 后端开发 +```bash +go run main.go +``` + +### 同时启动前后端(Windows) +```bash +dev-frontend.bat +``` + +## 生产构建 + +### 构建前端并编译Go程序(Windows) +```bash +build-frontend.bat +``` + +### 构建前端并编译Go程序(Linux/Mac) +```bash +chmod +x build-frontend.sh +./build-frontend.sh +``` + +### 手动构建 +```bash +# 构建前端 +cd frontend +npm install +npm run build +cd .. + +# 构建Go程序 +go build -o tgstate +``` + +## 项目结构 + +``` +frontend/ +├── src/ +│ ├── components/ +│ │ ├── ui/ # Shadcn UI组件 +│ │ └── FileUpload.vue # 主上传组件 +│ ├── lib/ +│ │ └── utils.ts # 工具函数 +│ ├── services/ +│ │ └── api.ts # API服务 +│ ├── App.vue # 主应用组件 +│ ├── main.ts # 应用入口 +│ └── style.css # 全局样式 +├── package.json +├── vite.config.ts +├── tailwind.config.js +└── tsconfig.json +``` + +## 技术栈 + +- **Vue 3** - 渐进式JavaScript框架 +- **TypeScript** - 类型安全的JavaScript +- **Vite** - 下一代前端构建工具 +- **Tailwind CSS** - 实用优先的CSS框架 +- **Shadcn UI** - 高质量的Vue组件库 +- **Axios** - HTTP客户端 +- **Lucide Vue** - 图标库 + +## API兼容性 + +新前端完全兼容现有的Go后端API: +- `/api` - 文件上传 +- `/api/chunk` - 分片上传 +- `/api/merge` - 分片合并 +- `/d/` - 文件下载 +- `/s/` - 短链重定向 + +## 浏览器支持 + +- Chrome >= 87 +- Firefox >= 78 +- Safari >= 14 +- Edge >= 88 + +## 注意事项 + +1. 构建后的文件会输出到 `assets/dist/` 目录 +2. Go程序会优先使用构建后的前端,如果不存在则回退到原始模板 +3. 开发时前端运行在3000端口,通过代理访问后端8088端口 +4. 生产环境下前端文件会被嵌入到Go二进制文件中 \ No newline at end of file diff --git a/GISCUS_SETUP.md b/GISCUS_SETUP.md new file mode 100644 index 0000000..4ccafe7 --- /dev/null +++ b/GISCUS_SETUP.md @@ -0,0 +1,112 @@ +# Giscus 评论系统配置指南 + +Giscus 是基于 GitHub Discussions 的评论系统,功能强大且易于配置。 + +## 配置步骤 + +### 1. 准备 GitHub 仓库 +- 确保你有一个公开的 GitHub 仓库 +- 在仓库设置中启用 Discussions 功能: + - 进入仓库 → Settings → General + - 在 Features 部分勾选 "Discussions" + +### 2. 安装 Giscus GitHub App +- 访问 [Giscus GitHub App](https://github.com/apps/giscus) +- 点击 "Install" 安装到你的 GitHub 账户 +- 选择要安装的仓库(建议选择 "All repositories" 或选择特定仓库) + +### 3. 获取配置参数 +- 访问 [giscus.app](https://giscus.app/zh-CN) +- 按照页面指引填写你的仓库信息 +- 选择合适的配置选项 +- 复制生成的配置参数 + +### 4. 修改配置文件 +编辑 `frontend/src/config/giscus.ts` 文件: + +```typescript +export const giscusConfig = { + // 你的 GitHub 仓库 + repo: 'your-username/your-repo', // 例如:'octocat/Hello-World' + + // 从 giscus.app 获取的仓库 ID + repoId: 'R_kgDOH...', + + // Discussion 分类 + category: 'General', + + // 从 giscus.app 获取的分类 ID + categoryId: 'DIC_kwDOH...', + + // 其他配置可根据需要调整 + mapping: 'pathname', + strict: false, + reactionsEnabled: true, + emitMetadata: false, + inputPosition: 'top', + theme: 'light', + lang: 'zh-CN', + enabled: true, +} +``` + +### 5. 主题选项 +可选的主题包括: +- `light` - 浅色主题(默认) +- `dark` - 深色主题 +- `preferred_color_scheme` - 跟随系统主题 +- `transparent_dark` - 透明深色主题 +- `dark_dimmed` - 暗淡深色主题 +- `dark_high_contrast` - 高对比度深色主题 +- `light_high_contrast` - 高对比度浅色主题 +- `dark_protanopia` - 深色红绿色盲友好主题 +- `light_protanopia` - 浅色红绿色盲友好主题 +- `dark_tritanopia` - 深色蓝黄色盲友好主题 +- `light_tritanopia` - 浅色蓝黄色盲友好主题 + +### 6. 页面映射选项 +- `pathname` - 使用页面路径作为 discussion 标题(推荐) +- `url` - 使用页面完整 URL 作为 discussion 标题 +- `title` - 使用页面标题作为 discussion 标题 +- `og:title` - 使用页面 og:title 作为 discussion 标题 +- `specific` - 使用特定术语 +- `number` - 使用特定 discussion 编号 + +## Giscus 的优势 + +1. **基于 Discussions** - 比 Issues 更适合评论讨论 +2. **功能丰富** - 支持 reactions、回复、编辑等 +3. **无需数据库** - 所有数据存储在 GitHub +4. **SEO 友好** - 评论内容可被搜索引擎索引 +5. **多主题支持** - 包括无障碍友好主题 +6. **实时更新** - 支持实时评论更新 + +## 注意事项 + +1. **仓库必须是公开的** - Giscus 需要访问公开仓库的 Discussions +2. **启用 Discussions 功能** - 确保仓库的 Discussions 功能已启用 +3. **GitHub App 权限** - 确保 Giscus App 有权限访问你的仓库 +4. **首次加载** - 第一次访问时可能需要几秒钟加载评论系统 + +## 禁用评论系统 + +如果不需要评论功能,可以在配置文件中设置: +```typescript +enabled: false +``` + +## 故障排除 + +如果评论系统无法正常显示: +1. 检查仓库名称和 ID 是否正确 +2. 确认仓库是公开的且启用了 Discussions +3. 确认已安装 Giscus GitHub App +4. 检查分类和分类 ID 是否正确 +5. 检查浏览器控制台是否有错误信息 +6. 确认网络可以访问 giscus.app + +## 更多信息 + +- [Giscus 官网](https://giscus.app/zh-CN) +- [Giscus GitHub 仓库](https://github.com/giscus/giscus) +- [GitHub Discussions 文档](https://docs.github.com/en/discussions) \ No newline at end of file diff --git a/README.md b/README.md index 5b53e45..e409cdd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ tgState -== + +[preview.webm](https://github.com/user-attachments/assets/58c398d6-bfa0-4879-b9fe-407ca4050c68) [English](https://github.com/csznet/tgState/blob/main/README_en.md) @@ -24,8 +25,12 @@ https://tgstate.vercel.app / https://tgstate.ikun123.com/ 不限制大小demo(临时) http://tgstate-cdn.ikun123.com/ 演示图片: +
+NSFW ![tgState](https://tgstate.vercel.app/d/BQACAgUAAx0EcyK3ugACByxlOR-Nfl4esavoO4zdaYIP_k1KYQACDAsAAkf4yFVpf_awaEkS8jAE) +
+ # 参数说明 diff --git a/README_en.md b/README_en.md index e258b42..9cf56fc 100644 --- a/README_en.md +++ b/README_en.md @@ -1,5 +1,6 @@ # tgState -== + +[preview.webm](https://github.com/user-attachments/assets/58c398d6-bfa0-4879-b9fe-407ca4050c68) [中文](https://github.com/csznet/tgState/blob/main/README.md) @@ -23,8 +24,13 @@ Hosted on Vercel, resource limitations - files larger than 5MB are not supported Demo image: +
+NSFW + ![tgState](https://tgstate.vercel.app/d/BQACAgUAAx0EcyK3ugACByxlOR-Nfl4esavoO4zdaYIP_k1KYQACDAsAAkf4yFVpf_awaEkS8jAE) +
+ # Parameter Description Mandatory parameters: @@ -55,12 +61,12 @@ Fill in your bot token. ## pass -Fill in the access password. If not needed, fill in ```none``` directly. +Fill in the access password. If not needed, fill in `none` directly. ## mode -- ```p``` represents running in cloud drive mode, with no restriction on uploaded suffixes. -- ```m``` On top of the p mode, web upload is disabled, and upload can be done via private chat (if the target is an individual, only specified users can upload via private chat). +- `p` represents running in cloud drive mode, with no restriction on uploaded suffixes. +- `m` On top of the p mode, web upload is disabled, and upload can be done via private chat (if the target is an individual, only specified users can upload via private chat). ## url @@ -74,7 +80,7 @@ Customize the running port. ## Get FIleID -Replying with ```get``` to the file reference in the bot's chat can get the FileID. Access the resource by combining the built address and the obtained path. +Replying with `get` to the file reference in the bot's chat can get the FileID. Access the resource by combining the built address and the obtained path. If the url parameter is configured, the complete address will be returned directly. @@ -98,22 +104,21 @@ wget https://github.com/csznet/tgState/releases/latest/download/tgState_arm64.zi **Usage** -```./tgState parameters``` +`./tgState parameters` **Example** -```./tgState -token xxxx -target @xxxx``` +`./tgState -token xxxx -target @xxxx` **Run in the background** -```nohup ./tgState parameters &``` +`nohup ./tgState parameters &` ## Docker Pull the image -```docker pull csznet/tgstate:latest``` - +`docker pull csznet/tgstate:latest` Start @@ -137,6 +142,6 @@ Does not support files larger than 5MB and does not support Telegram in getting # API Description -POST method to the path ```/api``` +POST method to the path `/api` Form transmission, field name is image, content is binary data. diff --git a/api/vercel.go b/api/vercel.go index e97c081..c3dafbf 100644 --- a/api/vercel.go +++ b/api/vercel.go @@ -24,8 +24,8 @@ func Vercel(w http.ResponseWriter, r *http.Request) { } switch path { case "/api": - // 调用 control 包中的 UploadImageAPI 处理函数 - control.Middleware(control.UploadImageAPI)(w, r) + // 调用 control 包中的 UploadAPI 处理函数 + control.Middleware(control.UploadAPI)(w, r) case "/pwd": control.Pwd(w, r) default: diff --git a/assets/assets.go b/assets/assets.go index 7a20b2b..30577d9 100644 --- a/assets/assets.go +++ b/assets/assets.go @@ -5,4 +5,7 @@ import "embed" var ( //go:embed templates Templates embed.FS + + //go:embed dist + Dist embed.FS ) diff --git a/assets/dist/assets/index-DAOM3x7l.css b/assets/dist/assets/index-DAOM3x7l.css new file mode 100644 index 0000000..eeccf1b --- /dev/null +++ b/assets/dist/assets/index-DAOM3x7l.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--primary: 221.2 83.2% 53.3%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96%;--secondary-foreground: 222.2 84% 4.9%;--muted: 210 40% 96%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 210 40% 96%;--accent-foreground: 222.2 84% 4.9%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--ring: 221.2 83.2% 53.3%;--radius: .5rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.right-0{right:0}.top-0{top:0}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-4{margin-left:1rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.flex{display:flex}.inline-flex{display:inline-flex}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-2{height:.5rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-96{max-height:24rem}.max-h-\[80vh\]{max-height:80vh}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.flex-1{flex:1 1 0%}.scale-105{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-4{border-left-width:4px}.border-dashed{border-style:dashed}.border-blue-400{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-green-400{--tw-border-opacity: 1;border-color:rgb(74 222 128 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-transparent{border-color:transparent}.border-l-green-500{--tw-border-opacity: 1;border-left-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-l-red-500{--tw-border-opacity: 1;border-left-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-300{animation-duration:.3s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.hover\:border-blue-500:hover{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-blue-600:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5} diff --git a/assets/dist/assets/index-fwhVyLpw.js b/assets/dist/assets/index-fwhVyLpw.js new file mode 100644 index 0000000..bea253e --- /dev/null +++ b/assets/dist/assets/index-fwhVyLpw.js @@ -0,0 +1,8 @@ +import{a as Jt,d as we,u as $t,c as Kt,b as V,o as P,m as Qt,r as St,n as ye,e as Ee,f as w,g as qt,h as D,w as nt,i as X,t as N,j as K,k as q,l as ae,F as Xe,p as Ye,q as Ce,s as er,v as tr,x as rr,y as ot,z as nr}from"./vendor-D_MnsSZ4.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&n(i)}).observe(document,{childList:!0,subtree:!0});function r(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(a){if(a.ep)return;a.ep=!0;const o=r(a);fetch(a.href,o)}})();const Me=Jt.create({baseURL:"/",timeout:3e4}),or=async(e,t,r,n)=>{const a=new FormData;return a.append("file",e),t&&a.append("userFingerprint",t),r!==void 0&&a.append("shared",r.toString()),(await Me.post("/api",a,{headers:{"Content-Type":"multipart/form-data"},onUploadProgress:i=>{if(i.total&&n){const s=i.loaded/i.total*100;n(s)}}})).data},ar=async(e,t,r,n,a,o)=>{const i=new FormData;return i.append("file",e,`${n}.chunk.${t}`),i.append("chunkIndex",t.toString()),i.append("uploadId",r),i.append("fileName",n),a&&i.append("userFingerprint",a),(await Me.post("/api/chunk",i,{headers:{"Content-Type":"multipart/form-data"},onUploadProgress:l=>{if(l.total&&o){const c=l.loaded/l.total*100;o(c)}}})).data},ir=async e=>(await Me.post("/api/merge",e,{headers:{"Content-Type":"application/json"}})).data,sr=async(e,t=1,r=20)=>(await Me.get(`/api/history?fingerprint=${encodeURIComponent(e)}&page=${t}&pageSize=${r}`)).data,lr=async(e=1,t=20)=>(await Me.get(`/api/plaza?page=${e}&pageSize=${t}`)).data;function Ct(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t{const t=dr(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:i=>{const s=i.split(Qe);return s[0]===""&&s.length!==1&&s.shift(),Mt(s,t)||ur(i)},getConflictingClassGroupIds:(i,s)=>{const l=r[i]||[];return s&&n[i]?[...l,...n[i]]:l}}},Mt=(e,t)=>{var i;if(e.length===0)return t.classGroupId;const r=e[0],n=t.nextPart.get(r),a=n?Mt(e.slice(1),n):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(Qe);return(i=t.validators.find(({validator:s})=>s(o)))==null?void 0:i.classGroupId},at=/^\[(.+)\]$/,ur=e=>{if(at.test(e)){const t=at.exec(e)[1],r=t==null?void 0:t.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},dr=e=>{const{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]};return pr(Object.entries(e.classGroups),r).forEach(([o,i])=>{Ue(i,n,o,t)}),n},Ue=(e,t,r,n)=>{e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:it(t,a);o.classGroupId=r;return}if(typeof a=="function"){if(fr(a)){Ue(a(n),t,r,n);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([o,i])=>{Ue(i,it(t,o),r,n)})})},it=(e,t)=>{let r=e;return t.split(Qe).forEach(n=>{r.nextPart.has(n)||r.nextPart.set(n,{nextPart:new Map,validators:[]}),r=r.nextPart.get(n)}),r},fr=e=>e.isThemeGetter,pr=(e,t)=>t?e.map(([r,n])=>{const a=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([i,s])=>[t+i,s])):o);return[r,a]}):e,mr=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=new Map;const a=(o,i)=>{r.set(o,i),t++,t>e&&(t=0,n=r,r=new Map)};return{get(o){let i=r.get(o);if(i!==void 0)return i;if((i=n.get(o))!==void 0)return a(o,i),i},set(o,i){r.has(o)?r.set(o,i):a(o,i)}}},Ft="!",vr=e=>{const{separator:t,experimentalParseClassName:r}=e,n=t.length===1,a=t[0],o=t.length,i=s=>{const l=[];let c=0,d=0,u;for(let p=0;pd?u-d:void 0;return{modifiers:l,hasImportantModifier:y,baseClassName:S,maybePostfixModifierPosition:b}};return r?s=>r({className:s,parseClassName:i}):i},gr=e=>{if(e.length<=1)return e;const t=[];let r=[];return e.forEach(n=>{n[0]==="["?(t.push(...r.sort(),n),r=[]):r.push(n)}),t.push(...r.sort()),t},hr=e=>({cache:mr(e.cacheSize),parseClassName:vr(e),...cr(e)}),br=/\s+/,yr=(e,t)=>{const{parseClassName:r,getClassGroupId:n,getConflictingClassGroupIds:a}=t,o=[],i=e.trim().split(br);let s="";for(let l=i.length-1;l>=0;l-=1){const c=i[l],{modifiers:d,hasImportantModifier:u,baseClassName:g,maybePostfixModifierPosition:y}=r(c);let S=!!y,b=n(S?g.substring(0,y):g);if(!b){if(!S){s=c+(s.length>0?" "+s:s);continue}if(b=n(g),!b){s=c+(s.length>0?" "+s:s);continue}S=!1}const p=gr(d).join(":"),h=u?p+Ft:p,k=h+b;if(o.includes(k))continue;o.push(k);const A=a(b,S);for(let L=0;L0?" "+s:s)}return s};function wr(){let e=0,t,r,n="";for(;e{if(typeof e=="string")return e;let t,r="";for(let n=0;nu(d),e());return r=hr(c),n=r.cache.get,a=r.cache.set,o=s,s(l)}function s(l){const c=n(l);if(c)return c;const d=yr(l,r);return a(l,d),d}return function(){return o(wr.apply(null,arguments))}}const z=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},It=/^\[(?:([a-z-]+):)?(.+)\]$/i,kr=/^\d+\/\d+$/,Sr=new Set(["px","full","screen"]),Cr=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Lr=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Mr=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,Fr=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Pr=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ne=e=>be(e)||Sr.has(e)||kr.test(e),ce=e=>xe(e,"length",Wr),be=e=>!!e&&!Number.isNaN(Number(e)),Ze=e=>xe(e,"number",be),ke=e=>!!e&&Number.isInteger(Number(e)),Ir=e=>e.endsWith("%")&&be(e.slice(0,-1)),x=e=>It.test(e),ue=e=>Cr.test(e),Vr=new Set(["length","size","percentage"]),Ar=e=>xe(e,Vr,Vt),zr=e=>xe(e,"position",Vt),Rr=new Set(["image","url"]),Tr=e=>xe(e,Rr,Nr),Gr=e=>xe(e,"",Er),Se=()=>!0,xe=(e,t,r)=>{const n=It.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):r(n[2]):!1},Wr=e=>Lr.test(e)&&!Mr.test(e),Vt=()=>!1,Er=e=>Fr.test(e),Nr=e=>Pr.test(e),_r=()=>{const e=z("colors"),t=z("spacing"),r=z("blur"),n=z("brightness"),a=z("borderColor"),o=z("borderRadius"),i=z("borderSpacing"),s=z("borderWidth"),l=z("contrast"),c=z("grayscale"),d=z("hueRotate"),u=z("invert"),g=z("gap"),y=z("gradientColorStops"),S=z("gradientColorStopPositions"),b=z("inset"),p=z("margin"),h=z("opacity"),k=z("padding"),A=z("saturate"),L=z("scale"),G=z("sepia"),_=z("skew"),j=z("space"),C=z("translate"),se=()=>["auto","contain","none"],le=()=>["auto","hidden","clip","visible","scroll"],re=()=>["auto",x,t],f=()=>[x,t],v=()=>["",ne,ce],m=()=>["auto",be,x],W=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],M=()=>["solid","dashed","dotted","double","none"],I=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],R=()=>["start","end","center","between","around","evenly","stretch"],H=()=>["","0",x],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],E=()=>[be,x];return{cacheSize:500,separator:":",theme:{colors:[Se],spacing:[ne,ce],blur:["none","",ue,x],brightness:E(),borderColor:[e],borderRadius:["none","","full",ue,x],borderSpacing:f(),borderWidth:v(),contrast:E(),grayscale:H(),hueRotate:E(),invert:H(),gap:f(),gradientColorStops:[e],gradientColorStopPositions:[Ir,ce],inset:re(),margin:re(),opacity:E(),padding:f(),saturate:E(),scale:E(),sepia:H(),skew:E(),space:f(),translate:f()},classGroups:{aspect:[{aspect:["auto","square","video",x]}],container:["container"],columns:[{columns:[ue]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...W(),x]}],overflow:[{overflow:le()}],"overflow-x":[{"overflow-x":le()}],"overflow-y":[{"overflow-y":le()}],overscroll:[{overscroll:se()}],"overscroll-x":[{"overscroll-x":se()}],"overscroll-y":[{"overscroll-y":se()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[b]}],"inset-x":[{"inset-x":[b]}],"inset-y":[{"inset-y":[b]}],start:[{start:[b]}],end:[{end:[b]}],top:[{top:[b]}],right:[{right:[b]}],bottom:[{bottom:[b]}],left:[{left:[b]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ke,x]}],basis:[{basis:re()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",x]}],grow:[{grow:H()}],shrink:[{shrink:H()}],order:[{order:["first","last","none",ke,x]}],"grid-cols":[{"grid-cols":[Se]}],"col-start-end":[{col:["auto",{span:["full",ke,x]},x]}],"col-start":[{"col-start":m()}],"col-end":[{"col-end":m()}],"grid-rows":[{"grid-rows":[Se]}],"row-start-end":[{row:["auto",{span:[ke,x]},x]}],"row-start":[{"row-start":m()}],"row-end":[{"row-end":m()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",x]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",x]}],gap:[{gap:[g]}],"gap-x":[{"gap-x":[g]}],"gap-y":[{"gap-y":[g]}],"justify-content":[{justify:["normal",...R()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...R(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...R(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[p]}],mx:[{mx:[p]}],my:[{my:[p]}],ms:[{ms:[p]}],me:[{me:[p]}],mt:[{mt:[p]}],mr:[{mr:[p]}],mb:[{mb:[p]}],ml:[{ml:[p]}],"space-x":[{"space-x":[j]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[j]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",x,t]}],"min-w":[{"min-w":[x,t,"min","max","fit"]}],"max-w":[{"max-w":[x,t,"none","full","min","max","fit","prose",{screen:[ue]},ue]}],h:[{h:[x,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[x,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[x,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[x,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ue,ce]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Ze]}],"font-family":[{font:[Se]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",x]}],"line-clamp":[{"line-clamp":["none",be,Ze]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ne,x]}],"list-image":[{"list-image":["none",x]}],"list-style-type":[{list:["none","disc","decimal",x]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[h]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[h]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...M(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ne,ce]}],"underline-offset":[{"underline-offset":["auto",ne,x]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:f()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",x]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",x]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[h]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...W(),zr]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Ar]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Tr]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[S]}],"gradient-via-pos":[{via:[S]}],"gradient-to-pos":[{to:[S]}],"gradient-from":[{from:[y]}],"gradient-via":[{via:[y]}],"gradient-to":[{to:[y]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[s]}],"border-w-x":[{"border-x":[s]}],"border-w-y":[{"border-y":[s]}],"border-w-s":[{"border-s":[s]}],"border-w-e":[{"border-e":[s]}],"border-w-t":[{"border-t":[s]}],"border-w-r":[{"border-r":[s]}],"border-w-b":[{"border-b":[s]}],"border-w-l":[{"border-l":[s]}],"border-opacity":[{"border-opacity":[h]}],"border-style":[{border:[...M(),"hidden"]}],"divide-x":[{"divide-x":[s]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[s]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[h]}],"divide-style":[{divide:M()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-s":[{"border-s":[a]}],"border-color-e":[{"border-e":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...M()]}],"outline-offset":[{"outline-offset":[ne,x]}],"outline-w":[{outline:[ne,ce]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:v()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[h]}],"ring-offset-w":[{"ring-offset":[ne,ce]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ue,Gr]}],"shadow-color":[{shadow:[Se]}],opacity:[{opacity:[h]}],"mix-blend":[{"mix-blend":[...I(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":I()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[n]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",ue,x]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[d]}],invert:[{invert:[u]}],saturate:[{saturate:[A]}],sepia:[{sepia:[G]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[d]}],"backdrop-invert":[{"backdrop-invert":[u]}],"backdrop-opacity":[{"backdrop-opacity":[h]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[G]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",x]}],duration:[{duration:E()}],ease:[{ease:["linear","in","out","in-out",x]}],delay:[{delay:E()}],animate:[{animate:["none","spin","ping","pulse","bounce",x]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[L]}],"scale-x":[{"scale-x":[L]}],"scale-y":[{"scale-y":[L]}],rotate:[{rotate:[ke,x]}],"translate-x":[{"translate-x":[C]}],"translate-y":[{"translate-y":[C]}],"skew-x":[{"skew-x":[_]}],"skew-y":[{"skew-y":[_]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",x]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",x]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":f()}],"scroll-mx":[{"scroll-mx":f()}],"scroll-my":[{"scroll-my":f()}],"scroll-ms":[{"scroll-ms":f()}],"scroll-me":[{"scroll-me":f()}],"scroll-mt":[{"scroll-mt":f()}],"scroll-mr":[{"scroll-mr":f()}],"scroll-mb":[{"scroll-mb":f()}],"scroll-ml":[{"scroll-ml":f()}],"scroll-p":[{"scroll-p":f()}],"scroll-px":[{"scroll-px":f()}],"scroll-py":[{"scroll-py":f()}],"scroll-ps":[{"scroll-ps":f()}],"scroll-pe":[{"scroll-pe":f()}],"scroll-pt":[{"scroll-pt":f()}],"scroll-pr":[{"scroll-pr":f()}],"scroll-pb":[{"scroll-pb":f()}],"scroll-pl":[{"scroll-pl":f()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",x]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ne,ce,Ze]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},jr=xr(_r);function qe(...e){return jr(Lt(e))}function Zr(e){if(e===0)return"0 Bytes";const t=1024,r=["Bytes","KB","MB","GB","TB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(2))+" "+r[n]}function Dr(e){return Zr(e)+"/s"}function Or(e){if(e<60)return`${Math.round(e)}s`;if(e<3600){const t=Math.floor(e/60),r=Math.round(e%60);return`${t}m ${r}s`}else{const t=Math.floor(e/3600),r=Math.floor(e%3600/60);return`${t}h ${r}m`}}function me(){return Date.now().toString(36)+Math.random().toString(36).substr(2)}async function At(e){try{if(navigator.clipboard&&window.isSecureContext)return await navigator.clipboard.writeText(e),!0;{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.left="-999999px",t.style.top="-999999px",document.body.appendChild(t),t.focus(),t.select();const r=document.execCommand("copy");return t.remove(),r}}catch(t){return console.error("Failed to copy text: ",t),!1}}var Je=function(){return Je=Object.assign||function(t){for(var r,n=1,a=arguments.length;n0&&o[o.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!o||c[1]>o[0]&&c[1]=a+r?(a=i,[4,Hr()]):[3,3]):[3,4];case 2:s.sent(),s.label=3;case 3:return++o,[3,1];case 4:return[2,n]}})})}function Le(e){return e.then(void 0,function(){}),e}function Xr(e,t){for(var r=0,n=e.length;r=1)return Math.round(e/t)*t;var r=1/t;return Math.round(e*r)/r}function Ur(e){for(var t,r,n="Unexpected syntax '".concat(e,"'"),a=/^\s*([a-z-]*)(.*)$/i.exec(e),o=a[1]||void 0,i={},s=/([.:#][\w-]+|\[.+?\])/gi,l=function(g,y){i[g]=i[g]||[],i[g].push(y)};;){var c=s.exec(a[2]);if(!c)break;var d=c[0];switch(d[0]){case".":l("class",d.slice(1));break;case"#":l("id",d.slice(1));break;case"[":{var u=/^\[([\w-]+)([~|^$*]?=("(.*?)"|([\w-]+)))?(\s+[is])?\]$/.exec(d);if(u)l(u[1],(r=(t=u[4])!==null&&t!==void 0?t:u[5])!==null&&r!==void 0?r:"");else throw new Error(n);break}default:throw new Error(n)}}return[o,i]}function Jr(e){for(var t=new Uint8Array(e.length),r=0;r127)return new TextEncoder().encode(e);t[r]=n}return t}function de(e,t){var r=e[0]>>>16,n=e[0]&65535,a=e[1]>>>16,o=e[1]&65535,i=t[0]>>>16,s=t[0]&65535,l=t[1]>>>16,c=t[1]&65535,d=0,u=0,g=0,y=0;y+=o+c,g+=y>>>16,y&=65535,g+=a+l,u+=g>>>16,g&=65535,u+=n+s,d+=u>>>16,u&=65535,d+=r+i,d&=65535,e[0]=d<<16|u,e[1]=g<<16|y}function U(e,t){var r=e[0]>>>16,n=e[0]&65535,a=e[1]>>>16,o=e[1]&65535,i=t[0]>>>16,s=t[0]&65535,l=t[1]>>>16,c=t[1]&65535,d=0,u=0,g=0,y=0;y+=o*c,g+=y>>>16,y&=65535,g+=a*c,u+=g>>>16,g&=65535,g+=o*l,u+=g>>>16,g&=65535,u+=n*c,d+=u>>>16,u&=65535,u+=a*l,d+=u>>>16,u&=65535,u+=o*s,d+=u>>>16,u&=65535,d+=r*c+n*l+a*s+o*i,d&=65535,e[0]=d<<16|u,e[1]=g<<16|y}function ve(e,t){var r=e[0];t%=64,t===32?(e[0]=e[1],e[1]=r):t<32?(e[0]=r<>>32-t,e[1]=e[1]<>>32-t):(t-=32,e[0]=e[1]<>>32-t,e[1]=r<>>32-t)}function B(e,t){t%=64,t!==0&&(t<32?(e[0]=e[1]>>>32-t,e[1]=e[1]<>>1];T(e,t),U(e,$r),t[1]=e[0]>>>1,T(e,t),U(e,Kr),t[1]=e[0]>>>1,T(e,t)}var Re=[2277735313,289559509],Te=[1291169091,658871167],ut=[0,5],Qr=[0,1390208809],qr=[0,944331445];function en(e,t){var r=Jr(e);t=t||0;var n=[0,r.length],a=n[1]%16,o=n[1]-a,i=[0,t],s=[0,t],l=[0,0],c=[0,0],d;for(d=0;d>>0).toString(16)).slice(-8)+("00000000"+(i[1]>>>0).toString(16)).slice(-8)+("00000000"+(s[0]>>>0).toString(16)).slice(-8)+("00000000"+(s[1]>>>0).toString(16)).slice(-8)}function tn(e){var t;return Je({name:e.name,message:e.message,stack:(t=e.stack)===null||t===void 0?void 0:t.split(` +`)},e)}function rn(e){return/^function\s.*?\{\s*\[native code]\s*}$/.test(String(e))}function nn(e){return typeof e!="function"}function on(e,t){var r=Le(new Promise(function(n){var a=Date.now();st(e.bind(null,t),function(){for(var o=[],i=0;i=4}function sn(){var e=window,t=navigator;return O(["msWriteProfilerMark"in e,"MSStream"in e,"msLaunchUri"in t,"msSaveBlob"in t])>=3&&!Wt()}function Fe(){var e=window,t=navigator;return O(["webkitPersistentStorage"in t,"webkitTemporaryStorage"in t,(t.vendor||"").indexOf("Google")===0,"webkitResolveLocalFileSystemURL"in e,"BatteryManager"in e,"webkitMediaStream"in e,"webkitSpeechGrammar"in e])>=5}function Q(){var e=window,t=navigator;return O(["ApplePayError"in e,"CSSPrimitiveValue"in e,"Counter"in e,t.vendor.indexOf("Apple")===0,"RGBColor"in e,"WebKitMediaKeys"in e])>=4}function tt(){var e=window,t=e.HTMLElement,r=e.Document;return O(["safari"in e,!("ongestureend"in e),!("TouchEvent"in e),!("orientation"in e),t&&!("autocapitalize"in t.prototype),r&&"pointerLockElement"in r.prototype])>=4}function Pe(){var e=window;return rn(e.print)&&String(e.browser)==="[object WebPageNamespace]"}function Et(){var e,t,r=window;return O(["buildID"in navigator,"MozAppearance"in((t=(e=document.documentElement)===null||e===void 0?void 0:e.style)!==null&&t!==void 0?t:{}),"onmozfullscreenchange"in r,"mozInnerScreenX"in r,"CSSMozDocumentRule"in r,"CanvasCaptureMediaStream"in r])>=4}function ln(){var e=window;return O([!("MediaSettingsRange"in e),"RTCEncodedAudioFrame"in e,""+e.Intl=="[object Intl]",""+e.Reflect=="[object Reflect]"])>=3}function cn(){var e=window,t=e.URLPattern;return O(["union"in Set.prototype,"Iterator"in e,t&&"hasRegExpGroups"in t.prototype,"RGB8"in WebGLRenderingContext.prototype])>=3}function un(){var e=window;return O(["DOMRectList"in e,"RTCPeerConnectionIceEvent"in e,"SVGGeometryElement"in e,"ontransitioncancel"in e])>=3}function Ie(){var e=window,t=navigator,r=e.CSS,n=e.HTMLButtonElement;return O([!("getStorageUpdates"in t),n&&"popover"in n.prototype,"CSSCounterStyleRule"in e,r.supports("font-size-adjust: ex-height 0.5"),r.supports("text-transform: full-width")])>=4}function dn(){if(navigator.platform==="iPad")return!0;var e=screen,t=e.width/e.height;return O(["MediaSource"in window,!!Element.prototype.webkitRequestFullscreen,t>.65&&t<1.53])>=2}function fn(){var e=document;return e.fullscreenElement||e.msFullscreenElement||e.mozFullScreenElement||e.webkitFullscreenElement||null}function pn(){var e=document;return(e.exitFullscreen||e.msExitFullscreen||e.mozCancelFullScreen||e.webkitExitFullscreen).call(e)}function rt(){var e=Fe(),t=Et(),r=window,n=navigator,a="connection";return e?O([!("SharedWorker"in r),n[a]&&"ontypechange"in n[a],!("sinkId"in new Audio)])>=2:t?O(["onorientationchange"in r,"orientation"in r,/android/i.test(n.appVersion)])>=2:!1}function mn(){var e=navigator,t=window,r=Audio.prototype,n=t.visualViewport;return O(["srLatency"in r,"srChannelCount"in r,"devicePosture"in e,n&&"segments"in n,"getTextInformation"in Image.prototype])>=3}function vn(){return bn()?-4:gn()}function gn(){var e=window,t=e.OfflineAudioContext||e.webkitOfflineAudioContext;if(!t)return-2;if(hn())return-1;var r=4500,n=5e3,a=new t(1,n,44100),o=a.createOscillator();o.type="triangle",o.frequency.value=1e4;var i=a.createDynamicsCompressor();i.threshold.value=-50,i.knee.value=40,i.ratio.value=12,i.attack.value=0,i.release.value=.25,o.connect(i),i.connect(a.destination),o.start(0);var s=yn(a),l=s[0],c=s[1],d=Le(l.then(function(u){return wn(u.getChannelData(0).subarray(r))},function(u){if(u.name==="timeout"||u.name==="suspended")return-3;throw u}));return function(){return c(),d}}function hn(){return Q()&&!tt()&&!un()}function bn(){return Q()&&Ie()&&Pe()||Fe()&&mn()&&cn()}function yn(e){var t=3,r=500,n=500,a=5e3,o=function(){},i=new Promise(function(s,l){var c=!1,d=0,u=0;e.oncomplete=function(S){return s(S.renderedBuffer)};var g=function(){setTimeout(function(){return l(dt("timeout"))},Math.min(n,u+a-Date.now()))},y=function(){try{var S=e.startRendering();switch(Tt(S)&&Le(S),e.state){case"running":u=Date.now(),c&&g();break;case"suspended":document.hidden||d++,c&&d>=t?l(dt("suspended")):setTimeout(y,r);break}}catch(b){l(b)}};y(),o=function(){c||(c=!0,u>0&&g())}});return[i,o]}function wn(e){for(var t=0,r=0;r=0?"+":"").concat(n)}function Kn(){var e=new Date().getFullYear();return Math.max($(new Date(e,0,1).getTimezoneOffset()),$(new Date(e,6,1).getTimezoneOffset()))}function Qn(){try{return!!window.sessionStorage}catch{return!0}}function qn(){try{return!!window.localStorage}catch{return!0}}function eo(){if(!(Wt()||sn()))try{return!!window.indexedDB}catch{return!0}}function to(){return!!window.openDatabase}function ro(){return navigator.cpuClass}function no(){var e=navigator.platform;return e==="MacIntel"&&Q()&&!tt()?dn()?"iPad":"iPhone":e}function oo(){return navigator.vendor||""}function ao(){for(var e=[],t=0,r=["chrome","safari","__crWeb","__gCrWeb","yandex","__yb","__ybro","__firefox__","__edgeTrackingPreventionStatistics","webkit","oprt","samsungAr","ucweb","UCShellJava","puffinDevice"];tu.length*.6}),s.sort(),[2,s]}})})}function co(){return Q()||rt()}function uo(e){var t;return ee(this,void 0,void 0,function(){var r,n,a,o,l,i,s,l;return te(this,function(c){switch(c.label){case 0:for(r=document,n=r.createElement("div"),a=new Array(e.length),o={},pt(n),l=0;l')}function Mo(){return navigator.pdfViewerEnabled}function Fo(){var e=new Float32Array(1),t=new Uint8Array(e.buffer);return e[0]=1/0,e[0]=e[0]-e[0],t[3]}function Po(){var e=window.ApplePaySession;if(typeof(e==null?void 0:e.canMakePayments)!="function")return-1;if(Io())return-3;try{return e.canMakePayments()?1:0}catch(t){return Vo(t)}}var Io=Sn;function Vo(e){if(e instanceof Error&&e.name==="InvalidAccessError"&&/\bfrom\b.*\binsecure\b/i.test(e.message))return-2;throw e}function Ao(){var e,t=document.createElement("a"),r=(e=t.attributionSourceId)!==null&&e!==void 0?e:t.attributionsourceid;return r===void 0?void 0:String(r)}var _t=-1,jt=-2,zo=new Set([10752,2849,2884,2885,2886,2928,2929,2930,2931,2932,2960,2961,2962,2963,2964,2965,2966,2967,2968,2978,3024,3042,3088,3089,3106,3107,32773,32777,32777,32823,32824,32936,32937,32938,32939,32968,32969,32970,32971,3317,33170,3333,3379,3386,33901,33902,34016,34024,34076,3408,3410,3411,3412,3413,3414,3415,34467,34816,34817,34818,34819,34877,34921,34930,35660,35661,35724,35738,35739,36003,36004,36005,36347,36348,36349,37440,37441,37443,7936,7937,7938]),Ro=new Set([34047,35723,36063,34852,34853,34854,34229,36392,36795,38449]),To=["FRAGMENT_SHADER","VERTEX_SHADER"],Go=["LOW_FLOAT","MEDIUM_FLOAT","HIGH_FLOAT","LOW_INT","MEDIUM_INT","HIGH_INT"],Zt="WEBGL_debug_renderer_info",Wo="WEBGL_polygon_mode";function Eo(e){var t,r,n,a,o,i,s=e.cache,l=Dt(s);if(!l)return _t;if(!Ht(l))return jt;var c=Ot()?null:l.getExtension(Zt);return{version:((t=l.getParameter(l.VERSION))===null||t===void 0?void 0:t.toString())||"",vendor:((r=l.getParameter(l.VENDOR))===null||r===void 0?void 0:r.toString())||"",vendorUnmasked:c?(n=l.getParameter(c.UNMASKED_VENDOR_WEBGL))===null||n===void 0?void 0:n.toString():"",renderer:((a=l.getParameter(l.RENDERER))===null||a===void 0?void 0:a.toString())||"",rendererUnmasked:c?(o=l.getParameter(c.UNMASKED_RENDERER_WEBGL))===null||o===void 0?void 0:o.toString():"",shadingLanguageVersion:((i=l.getParameter(l.SHADING_LANGUAGE_VERSION))===null||i===void 0?void 0:i.toString())||""}}function No(e){var t=e.cache,r=Dt(t);if(!r)return _t;if(!Ht(r))return jt;var n=r.getSupportedExtensions(),a=r.getContextAttributes(),o=[],i=[],s=[],l=[],c=[];if(a)for(var d=0,u=Object.keys(a);d=.001))try{var e=new XMLHttpRequest;e.open("get","https://m1.openfpcdn.io/fingerprintjs/v".concat(Rt,"/npm-monitoring"),!0),e.send()}catch(t){console.error(t)}}function ta(e){var t;return e===void 0&&(e={}),ee(this,void 0,void 0,function(){var r,n,a;return te(this,function(o){switch(o.label){case 0:return(!((t=e.monitoring)!==null&&t!==void 0)||t)&&ea(),r=e.delayFallback,n=e.debug,[4,Qo(r)];case 1:return o.sent(),a=Bo({cache:{},debug:n}),[2,qo(a,n)]}})})}var ra={load:ta,hashComponents:Xt,componentsToDebugString:Bt};let Be=null;async function na(){return Be||(Be=await ra.load()),Be}async function oa(){try{return(await(await na()).get()).visitorId}catch(e){return console.warn("FingerprintJS failed, falling back to simple hash:",e),await aa()}}async function aa(){const e={userAgent:navigator.userAgent,language:navigator.language,screenResolution:`${screen.width}x${screen.height}`,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,colorDepth:screen.colorDepth,pixelRatio:window.devicePixelRatio,cookieEnabled:navigator.cookieEnabled},t=JSON.stringify(e),n=new TextEncoder().encode(t),a=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(a)).map(s=>s.toString(16).padStart(2,"0")).join("")}async function Yt(){const e="tgstate_user_fingerprint";let t=localStorage.getItem(e);return t||(t=await oa(),localStorage.setItem(e,t)),t}const wt=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,xt=Lt,ia=(e,t)=>r=>{var n;if((t==null?void 0:t.variants)==null)return xt(e,r==null?void 0:r.class,r==null?void 0:r.className);const{variants:a,defaultVariants:o}=t,i=Object.keys(a).map(c=>{const d=r==null?void 0:r[c],u=o==null?void 0:o[c];if(d===null)return null;const g=wt(d)||wt(u);return a[c][g]}),s=r&&Object.entries(r).reduce((c,d)=>{let[u,g]=d;return g===void 0||(c[u]=g),c},{}),l=t==null||(n=t.compoundVariants)===null||n===void 0?void 0:n.reduce((c,d)=>{let{class:u,className:g,...y}=d;return Object.entries(y).every(S=>{let[b,p]=S;return Array.isArray(p)?p.includes({...o,...s}[b]):{...o,...s}[b]===p})?[...c,u,g]:c},[]);return xt(e,i,l,r==null?void 0:r.class,r==null?void 0:r.className)},sa=["disabled"],ie=we({__name:"Button",props:{variant:{},size:{},disabled:{type:Boolean}},setup(e){const t=ia("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),r=e,n=$t(),a=Kt(()=>qe(t({variant:r.variant,size:r.size}),n.class));return(o,i)=>(P(),V("button",Qt({class:a.value,disabled:o.disabled},o.$attrs),[St(o.$slots,"default")],16,sa))}}),la=we({__name:"Card",setup(e){return(t,r)=>(P(),V("div",{class:ye(Ee(qe)("rounded-lg border bg-card text-card-foreground shadow-sm",t.$attrs.class))},[St(t.$slots,"default")],2))}}),ca=we({__name:"Progress",props:{modelValue:{}},setup(e){return(t,r)=>(P(),V("div",{class:ye(Ee(qe)("relative h-4 w-full overflow-hidden rounded-full bg-secondary",t.$attrs.class))},[w("div",{class:"h-full w-full flex-1 bg-primary transition-all duration-300 ease-out",style:qt({transform:`translateX(-${100-(t.modelValue||0)}%)`})},null,4)],2))}}),ua={class:"flex border-b border-gray-200 mb-4"},da={key:0,class:"text-center py-8"},fa={class:"mt-2 text-gray-600"},pa={key:1,class:"text-center py-8"},ma={class:"text-red-600"},va={key:2,class:"text-center py-8"},ga={class:"text-gray-600"},ha={key:3,class:"overflow-y-auto max-h-96"},ba={class:"space-y-3"},ya={class:"flex justify-between items-start"},wa={class:"flex-1"},xa={class:"flex items-center gap-2"},ka={class:"font-medium text-gray-900 truncate"},Sa={key:0,class:"text-xs bg-green-100 text-green-800 px-2 py-1 rounded-full"},Ca={class:"text-sm text-gray-500 mt-1"},La={class:"flex gap-2 ml-4"},Ma={key:0,class:"text-center mt-4"},Fa={key:1,class:"text-center mt-4 text-sm text-gray-500"},Pa=we({__name:"HistoryModal",props:{isOpen:{type:Boolean}},emits:["close"],setup(e,{emit:t}){const r=e,n=t,a=D(!1),o=D(""),i=D([]),s=D("history"),l=D({page:1,pageSize:20,total:0,hasMore:!1}),c=()=>{n("close")},d=async(b=1)=>{a.value=!0,o.value="";try{let p;if(s.value==="history"){const h=await Yt();p=await sr(h,b,l.value.pageSize)}else p=await lr(b,l.value.pageSize);if(p.code===0&&p.data){const h=p.data.files||[];b===1?i.value=h:i.value.push(...h),l.value=p.data.pagination}else o.value=p.message||"Failed to load data"}catch(p){o.value="Network error occurred",console.error("Failed to load data:",p)}finally{a.value=!1}},u=()=>{l.value.hasMore&&!a.value&&d(l.value.page+1)},g=b=>new Date(b).toLocaleString(),y=async(b,p,h)=>{const k=`${window.location.origin}/d/${b}`;if(await At(k)){const L=h.target,G=L.textContent,_=L.style.backgroundColor,j=L.style.color;L.style.backgroundColor="#10b981",L.style.color="white",L.textContent=p,setTimeout(()=>{L.textContent=G,L.style.backgroundColor=_,L.style.color=j},1e3)}},S=b=>{const p=`${window.location.origin}/d/${b}`;window.open(p,"_blank")};return nt(s,()=>{i.value=[],l.value.page=1,d(1)}),nt(()=>r.isOpen,b=>{b&&d(1)}),(b,p)=>b.isOpen?(P(),V("div",{key:0,class:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",onClick:c},[w("div",{class:"bg-white rounded-lg p-6 max-w-4xl w-full mx-4 max-h-[80vh] overflow-hidden",onClick:p[3]||(p[3]=Ce(()=>{},["stop"]))},[w("div",{class:"flex justify-between items-center mb-4"},[p[4]||(p[4]=w("h2",{class:"text-xl font-bold text-gray-900"},"📁 File Explorer",-1)),w("button",{onClick:c,class:"text-gray-500 hover:text-gray-700 text-2xl"}," × ")]),w("div",ua,[w("button",{onClick:p[0]||(p[0]=h=>s.value="history"),class:ye(["px-4 py-2 font-medium text-sm border-b-2 transition-colors",s.value==="history"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"])}," 📁 My Files ",2),w("button",{onClick:p[1]||(p[1]=h=>s.value="plaza"),class:ye(["px-4 py-2 font-medium text-sm border-b-2 transition-colors",s.value==="plaza"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"])}," 🌍 Plaza ",2)]),a.value&&i.value.length===0?(P(),V("div",da,[p[5]||(p[5]=w("div",{class:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto"},null,-1)),w("p",fa," Loading "+N(s.value==="history"?"history":"plaza files")+"... ",1)])):o.value?(P(),V("div",pa,[w("p",ma,N(o.value),1),K(ie,{onClick:p[2]||(p[2]=()=>d(1)),class:"mt-4"},{default:q(()=>p[6]||(p[6]=[ae("Retry",-1)])),_:1,__:[6]})])):i.value.length===0?(P(),V("div",va,[p[7]||(p[7]=w("div",{class:"text-4xl mb-4"},"📂",-1)),w("p",ga,N(s.value==="history"?"No upload history found":"No shared files in plaza"),1)])):(P(),V("div",ha,[w("div",ba,[(P(!0),V(Xe,null,Ye(i.value,h=>(P(),V("div",{key:h.fileId,class:"border rounded-lg p-4 hover:bg-gray-50 transition-colors"},[w("div",ya,[w("div",wa,[w("div",xa,[w("h3",ka,N(h.filename),1),h.shared?(P(),V("span",Sa," 🌍 Shared ")):X("",!0)]),w("p",Ca,N(g(h.time)),1)]),w("div",La,[K(ie,{size:"sm",variant:"outline",onClick:k=>y(h.fileId||"","Copied!",k)},{default:q(()=>p[8]||(p[8]=[ae(" Copy Link ",-1)])),_:2,__:[8]},1032,["onClick"]),K(ie,{size:"sm",variant:"outline",onClick:k=>S(h.fileId)},{default:q(()=>p[9]||(p[9]=[ae(" Open ",-1)])),_:2,__:[9]},1032,["onClick"])])])]))),128))]),l.value.hasMore?(P(),V("div",Ma,[K(ie,{onClick:u,disabled:a.value,variant:"outline",class:"w-full"},{default:q(()=>[ae(N(a.value?"Loading...":"Load More"),1)]),_:1},8,["disabled"])])):X("",!0),i.value.length>0?(P(),V("div",Fa," Showing "+N(i.value.length)+" of "+N(l.value.total)+" files ",1)):X("",!0)]))])])):X("",!0)}});var Ia=Object.defineProperty,Va=(e,t,r)=>t in e?Ia(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,kt=(e,t,r)=>Va(e,typeof t!="symbol"?t+"":t,r);const Aa={class:"w-full max-w-2xl mx-auto p-6"},za={class:"relative text-center mb-8"},Ra={key:0,class:"flex items-center justify-center gap-2 mt-4"},Ta={key:0,class:"space-y-4 mb-6"},Ga={class:"flex justify-between items-center mb-2"},Wa={class:"font-medium text-gray-900 truncate flex-1 mr-4"},Ea={class:"text-sm text-gray-500 whitespace-nowrap"},Na={class:"mb-2"},_a={class:"flex justify-between items-center text-xs text-gray-500"},ja={key:0},Za={key:1,class:"space-y-4"},Da={class:"flex items-start justify-between"},Oa={class:"flex-1"},Ha={class:"font-medium mb-2"},Ba={key:0,class:"mb-3"},Xa=["href"],Ya={key:1,class:"flex flex-wrap gap-2"},Ua={key:2,class:"text-red-600"},Ge=10*1024*1024,Ja=3,$a=we({__name:"FileUpload",setup(e){const t=D(),r=D(),n=D([]),a=D(!1),o=D(!1),i=D([]),s=D([]),l=D(!1),c=D(""),d=D(!1),u=f=>{f.preventDefault(),a.value=!0},g=f=>{f.preventDefault(),a.value=!0},y=f=>{var v;f.preventDefault(),(v=t.value)!=null&&v.contains(f.relatedTarget)||(a.value=!1)},S=f=>{var m;f.preventDefault(),a.value=!1;const v=Array.from(((m=f.dataTransfer)==null?void 0:m.files)||[]);n.value=v},b=f=>{const v=f.target,m=Array.from(v.files||[]);n.value=m},p=f=>{const v=[".jpg",".jpeg",".png",".gif",".webp",".bmp",".svg"],m=f.toLowerCase().substring(f.lastIndexOf("."));return v.includes(m)},h=async(f,v,m)=>{if(await At(f)&&(m!=null&&m.target)){const M=m.target,I=M.textContent,R=M.style.backgroundColor,H=M.style.color;M.style.backgroundColor="#10b981",M.style.color="white",M.textContent=v,setTimeout(()=>{M.textContent=I,M.style.backgroundColor=R,M.style.color=H},1e3)}else console.error("Copy faild")},k=async(f,v,m)=>{const W=`${v}`;await h(W,"HTML copied!",m)},A=async(f,v,m)=>{const W=`![${v}](${f})`;await h(W,"Markdown copied!",m)},L=f=>({id:me(),fileName:f,progress:0,status:"Starting upload...",speed:0,eta:0}),G=(f,v,m,W,M)=>{const I=i.value.find(R=>R.id===f);I&&(I.progress=v,m&&(I.status=m),W!==void 0&&(I.speed=W),M!==void 0&&(I.eta=M))},_=f=>{const v=i.value.findIndex(m=>m.id===f);v>-1&&i.value.splice(v,1)},j=f=>{s.value.unshift(f)},C=async f=>{const v=L(f.name);i.value.push(v);const m=Date.now();let W=0,M=m;try{const I=await or(f,c.value,d.value,R=>{const H=Date.now(),J=(H-M)/1e3,E=R-W;if(J>.5&&E>0){const fe=E/100*f.size/J,Y=100-R,pe=Y>0?Y/100*f.size/fe:0;G(v.id,R,"Uploading...",fe,pe),W=R,M=H}else G(v.id,R,"Uploading...")});if(I.code===0)G(v.id,100,"Upload complete!"),setTimeout(()=>{_(v.id),j({id:me(),fileName:f.name,success:!0,data:I})},500);else throw new Error(I.message||"Upload failed")}catch(I){_(v.id),j({id:me(),fileName:f.name,success:!1,error:I instanceof Error?I.message:"Upload failed"})}},se=async f=>{const v=Math.ceil(f.size/Ge),m=me(),W=new Array(v),M=L(f.name);i.value.push(M);const I=new Array(v).fill(0),R=Date.now(),H=()=>{const E=I.reduce((_e,je)=>_e+je,0)/v,Y=(Date.now()-R)/1e3,pe=E/100*f.size/Y,Ve=100-E,Ae=Ve>0?Ve/100*f.size/pe:0;G(M.id,E,"Uploading...",pe,Ae)};try{const J=new re(Ja),E=[];for(let Y=0;Y{try{const Ae=Y*Ge,_e=Math.min(Ae+Ge,f.size),je=f.slice(Ae,_e),ze=await ar(je,Y,m,f.name,c.value,Ut=>{I[Y]=Ut,H()});if(ze.code===0&&ze.chunkId)W[Y]=ze.chunkId,I[Y]=100,H();else throw new Error(ze.message||"Chunk upload failed")}finally{Ve()}});E.push(pe)}await Promise.all(E),G(M.id,100,"Merging chunks...");const fe=await ir({uploadId:m,fileName:f.name,chunkIds:W,fileSize:f.size,userFingerprint:c.value,shared:d.value});if(fe.code===0)G(M.id,100,"Upload complete!"),setTimeout(()=>{_(M.id),j({id:me(),fileName:f.name,success:!0,data:fe})},500);else throw new Error(fe.message||"Merge failed")}catch(J){_(M.id),j({id:me(),fileName:f.name,success:!1,error:J instanceof Error?J.message:"Upload failed"})}},le=async()=>{if(!(n.value.length===0||o.value)){o.value=!0;try{for(const f of n.value)f.size>Ge?await se(f):await C(f)}finally{o.value=!1,n.value=[],d.value=!1,r.value&&(r.value.value="")}}};class re{constructor(v){kt(this,"permits"),kt(this,"waiting",[]),this.permits=v}async acquire(){return new Promise(v=>{this.permits>0?(this.permits--,v(()=>this.release())):this.waiting.push(()=>{this.permits--,v(()=>this.release())})})}release(){if(this.permits++,this.waiting.length>0){const v=this.waiting.shift();v&&v()}}}return er(async()=>{try{c.value=await Yt(),console.log("User fingerprint initialized:",c.value)}catch(f){console.error("Failed to initialize user fingerprint:",f)}}),(f,v)=>(P(),V("div",Aa,[w("div",za,[w("button",{onClick:v[0]||(v[0]=m=>l.value=!0),class:"absolute top-0 right-0 p-2 text-gray-600 hover:text-blue-600 hover:bg-blue-50 rounded-lg transition-colors",title:"Upload History"},v[4]||(v[4]=[w("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[w("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)])),v[5]||(v[5]=w("h1",{class:"text-3xl font-bold text-gray-900 mb-2"}," 📁 File Upload to Telegram ",-1)),v[6]||(v[6]=w("p",{class:"text-gray-600"},"Secure, Fast, Permanent Storage",-1))]),K(la,{class:"p-6 mb-6"},{default:q(()=>[w("div",{ref_key:"dropZone",ref:t,class:ye(["border-2 border-dashed rounded-lg p-8 text-center transition-all duration-300",a.value?"border-green-400 bg-green-50 scale-105":"border-blue-400 bg-blue-50 hover:border-blue-500 hover:bg-blue-100"]),onDragenter:Ce(u,["prevent"]),onDragover:Ce(g,["prevent"]),onDragleave:Ce(y,["prevent"]),onDrop:Ce(S,["prevent"])},[v[7]||(v[7]=w("div",{class:"text-4xl mb-4"},"📤",-1)),v[8]||(v[8]=w("p",{class:"text-gray-700 mb-4"},"Drag files here or click to select",-1)),w("input",{ref_key:"fileInput",ref:r,type:"file",multiple:"",class:"hidden",onChange:b},null,544),K(ie,{onClick:v[1]||(v[1]=()=>{var m;return(m=r.value)==null?void 0:m.click()}),variant:n.value.length>0?"secondary":"default",class:"mb-4"},{default:q(()=>[ae(N(n.value.length>0?`${n.value.length} file(s) selected`:"Choose Files"),1)]),_:1},8,["variant"]),v[9]||(v[9]=w("div",{class:"flex justify-center gap-4 text-sm text-gray-500"},[w("span",null,"📊 Multiple Files"),w("span",null,"🔒 Secure"),w("span",null,"⚡ Fast")],-1))],34),n.value.length>0?(P(),V("div",Ra,[tr(w("input",{id:"shareToPlaza",type:"checkbox","onUpdate:modelValue":v[2]||(v[2]=m=>d.value=m),class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[rr,d.value]]),v[10]||(v[10]=w("label",{for:"shareToPlaza",class:"text-sm text-gray-700 cursor-pointer"}," 🌍 Share to Plaza (Public) ",-1))])):X("",!0),K(ie,{onClick:le,disabled:n.value.length===0||o.value,class:"w-full mt-4",size:"lg"},{default:q(()=>[ae(N(o.value?"Uploading...":n.value.length===0?"🈳 No file":"⬆️ UPLOAD"),1)]),_:1},8,["disabled"])]),_:1}),i.value.length>0?(P(),V("div",Ta,[(P(!0),V(Xe,null,Ye(i.value,m=>(P(),V("div",{key:m.id,class:"bg-white rounded-lg border p-4 shadow-sm"},[w("div",Ga,[w("span",Wa,N(m.fileName),1),w("span",Ea,N(Math.round(m.progress))+"% ",1)]),w("div",Na,[K(ca,{"model-value":m.progress,class:"h-2"},null,8,["model-value"])]),w("div",_a,[w("span",null,N(m.status),1),m.speed&&m.eta?(P(),V("span",ja,N(Ee(Dr)(m.speed))+" • ETA: "+N(Ee(Or)(m.eta)),1)):X("",!0)])]))),128))])):X("",!0),s.value.length>0?(P(),V("div",Za,[(P(!0),V(Xe,null,Ye(s.value,m=>{var W,M;return P(),V("div",{key:m.id,class:ye(["rounded-lg border-l-4 p-4 shadow-sm",m.success?"border-l-green-500 bg-green-50":"border-l-red-500 bg-red-50"])},[w("div",Da,[w("div",Oa,[w("div",Ha,N(m.success?"✅":"❌")+" "+N(m.fileName),1),m.success&&((W=m.data)!=null&&W.shortFileUrl)?(P(),V("div",Ba,[w("a",{href:m.data.shortFileUrl,target:"_blank",class:"text-blue-600 hover:text-blue-800 underline break-all"},N(m.data.shortFileUrl),9,Xa)])):X("",!0),m.success&&((M=m.data)!=null&&M.shortFileUrl)?(P(),V("div",Ya,[K(ie,{size:"sm",variant:"outline",onClick:I=>{var R;return h(((R=m==null?void 0:m.data)==null?void 0:R.shortFileUrl)||"","Link copied!",I)}},{default:q(()=>v[11]||(v[11]=[ae(" Copy Link ",-1)])),_:2,__:[11]},1032,["onClick"]),p(m.fileName)?(P(),ot(ie,{key:0,size:"sm",variant:"outline",onClick:I=>{var R;return k(((R=m==null?void 0:m.data)==null?void 0:R.shortFileUrl)||"",m.fileName,I)}},{default:q(()=>v[12]||(v[12]=[ae(" HTML ",-1)])),_:2,__:[12]},1032,["onClick"])):X("",!0),p(m.fileName)?(P(),ot(ie,{key:1,size:"sm",variant:"outline",onClick:I=>{var R;return A(((R=m==null?void 0:m.data)==null?void 0:R.shortFileUrl)||"",m.fileName,I)}},{default:q(()=>v[13]||(v[13]=[ae(" Markdown ",-1)])),_:2,__:[13]},1032,["onClick"])):X("",!0)])):X("",!0),m.success?X("",!0):(P(),V("div",Ua,N(m.error),1))])])],2)}),128))])):X("",!0),K(Pa,{"is-open":l.value,onClose:v[3]||(v[3]=m=>l.value=!1)},null,8,["is-open"])]))}}),Ka={class:"min-h-screen bg-gray-50"},Qa=we({__name:"App",setup(e){return(t,r)=>(P(),V("div",Ka,[K($a)]))}});nr(Qa).mount("#app"); diff --git a/assets/dist/assets/ui-l0sNRNKZ.js b/assets/dist/assets/ui-l0sNRNKZ.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/assets/dist/assets/ui-l0sNRNKZ.js @@ -0,0 +1 @@ + diff --git a/assets/dist/assets/vendor-D_MnsSZ4.js b/assets/dist/assets/vendor-D_MnsSZ4.js new file mode 100644 index 0000000..d92b10c --- /dev/null +++ b/assets/dist/assets/vendor-D_MnsSZ4.js @@ -0,0 +1,22 @@ +/** +* @vue/shared v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function ds(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const q={},ct=[],Ne=()=>{},uo=()=>!1,hn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),hs=e=>e.startsWith("onUpdate:"),ie=Object.assign,ps=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ao=Object.prototype.hasOwnProperty,V=(e,t)=>ao.call(e,t),D=Array.isArray,ft=e=>Ut(e)==="[object Map]",pn=e=>Ut(e)==="[object Set]",$s=e=>Ut(e)==="[object Date]",U=e=>typeof e=="function",X=e=>typeof e=="string",Se=e=>typeof e=="symbol",J=e=>e!==null&&typeof e=="object",vr=e=>(J(e)||U(e))&&U(e.then)&&U(e.catch),Fr=Object.prototype.toString,Ut=e=>Fr.call(e),ho=e=>Ut(e).slice(8,-1),Nr=e=>Ut(e)==="[object Object]",ms=e=>X(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Tt=ds(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),mn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},po=/-(\w)/g,We=mn(e=>e.replace(po,(t,n)=>n?n.toUpperCase():"")),mo=/\B([A-Z])/g,it=mn(e=>e.replace(mo,"-$1").toLowerCase()),Dr=mn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Nn=mn(e=>e?`on${Dr(e)}`:""),Ke=(e,t)=>!Object.is(e,t),Yt=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},go=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Vs;const gn=()=>Vs||(Vs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function gs(e){if(D(e)){const t={};for(let n=0;n{if(n){const s=n.split(yo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function bs(e){let t="";if(X(e))t=e;else if(D(e))for(let n=0;nbn(n,t))}const Lr=e=>!!(e&&e.__v_isRef===!0),Ro=e=>X(e)?e:e==null?"":D(e)||J(e)&&(e.toString===Fr||!U(e.toString))?Lr(e)?Ro(e.value):JSON.stringify(e,Ur,2):String(e),Ur=(e,t)=>Lr(t)?Ur(e,t.value):ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Dn(s,i)+" =>"]=r,n),{})}:pn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Dn(n))}:Se(t)?Dn(t):J(t)&&!D(t)&&!Nr(t)?String(t):t,Dn=(e,t="")=>{var n;return Se(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let de;class To{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=de,!t&&de&&(this.index=(de.scopes||(de.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(de=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(At){let t=At;for(At=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Ot;){let t=Ot;for(Ot=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function $r(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Vr(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),ws(s),Ao(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Jn(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(kr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function kr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ft)||(e.globalVersion=Ft,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Jn(e))))return;e.flags|=2;const t=e.dep,n=z,s=xe;z=e,xe=!0;try{$r(e);const r=e.fn(e._value);(t.version===0||Ke(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{z=n,xe=s,Vr(e),e.flags&=-3}}function ws(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)ws(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ao(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let xe=!0;const qr=[];function Be(){qr.push(xe),xe=!1}function He(){const e=qr.pop();xe=e===void 0?!0:e}function ks(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=z;z=void 0;try{t()}finally{z=n}}}let Ft=0;class Co{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class xs{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!z||!xe||z===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==z)n=this.activeLink=new Co(z,this),z.deps?(n.prevDep=z.depsTail,z.depsTail.nextDep=n,z.depsTail=n):z.deps=z.depsTail=n,Kr(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=z.depsTail,n.nextDep=void 0,z.depsTail.nextDep=n,z.depsTail=n,z.deps===n&&(z.deps=s)}return n}trigger(t){this.version++,Ft++,this.notify(t)}notify(t){ys();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{_s()}}}function Kr(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Kr(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Gn=new WeakMap,nt=Symbol(""),Xn=Symbol(""),Nt=Symbol("");function te(e,t,n){if(xe&&z){let s=Gn.get(e);s||Gn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new xs),r.map=s,r.key=n),r.track()}}function Ue(e,t,n,s,r,i){const o=Gn.get(e);if(!o){Ft++;return}const l=c=>{c&&c.trigger()};if(ys(),t==="clear")o.forEach(l);else{const c=D(e),a=c&&ms(n);if(c&&n==="length"){const f=Number(s);o.forEach((h,y)=>{(y==="length"||y===Nt||!Se(y)&&y>=f)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),a&&l(o.get(Nt)),t){case"add":c?a&&l(o.get("length")):(l(o.get(nt)),ft(e)&&l(o.get(Xn)));break;case"delete":c||(l(o.get(nt)),ft(e)&&l(o.get(Xn)));break;case"set":ft(e)&&l(o.get(nt));break}}_s()}function ot(e){const t=$(e);return t===e?t:(te(t,"iterate",Nt),we(e)?t:t.map(ee))}function yn(e){return te(e=$(e),"iterate",Nt),e}const Po={__proto__:null,[Symbol.iterator](){return Mn(this,Symbol.iterator,ee)},concat(...e){return ot(this).concat(...e.map(t=>D(t)?ot(t):t))},entries(){return Mn(this,"entries",e=>(e[1]=ee(e[1]),e))},every(e,t){return Me(this,"every",e,t,void 0,arguments)},filter(e,t){return Me(this,"filter",e,t,n=>n.map(ee),arguments)},find(e,t){return Me(this,"find",e,t,ee,arguments)},findIndex(e,t){return Me(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Me(this,"findLast",e,t,ee,arguments)},findLastIndex(e,t){return Me(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Me(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ln(this,"includes",e)},indexOf(...e){return Ln(this,"indexOf",e)},join(e){return ot(this).join(e)},lastIndexOf(...e){return Ln(this,"lastIndexOf",e)},map(e,t){return Me(this,"map",e,t,void 0,arguments)},pop(){return xt(this,"pop")},push(...e){return xt(this,"push",e)},reduce(e,...t){return qs(this,"reduce",e,t)},reduceRight(e,...t){return qs(this,"reduceRight",e,t)},shift(){return xt(this,"shift")},some(e,t){return Me(this,"some",e,t,void 0,arguments)},splice(...e){return xt(this,"splice",e)},toReversed(){return ot(this).toReversed()},toSorted(e){return ot(this).toSorted(e)},toSpliced(...e){return ot(this).toSpliced(...e)},unshift(...e){return xt(this,"unshift",e)},values(){return Mn(this,"values",ee)}};function Mn(e,t,n){const s=yn(e),r=s[t]();return s!==e&&!we(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const vo=Array.prototype;function Me(e,t,n,s,r,i){const o=yn(e),l=o!==e&&!we(e),c=o[t];if(c!==vo[t]){const h=c.apply(e,i);return l?ee(h):h}let a=n;o!==e&&(l?a=function(h,y){return n.call(this,ee(h),y,e)}:n.length>2&&(a=function(h,y){return n.call(this,h,y,e)}));const f=c.call(o,a,s);return l&&r?r(f):f}function qs(e,t,n,s){const r=yn(e);let i=n;return r!==e&&(we(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,ee(l),c,e)}),r[t](i,...s)}function Ln(e,t,n){const s=$(e);te(s,"iterate",Nt);const r=s[t](...n);return(r===-1||r===!1)&&Ts(n[0])?(n[0]=$(n[0]),s[t](...n)):r}function xt(e,t,n=[]){Be(),ys();const s=$(e)[t].apply(e,n);return _s(),He(),s}const Fo=ds("__proto__,__v_isRef,__isVue"),Wr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Se));function No(e){Se(e)||(e=String(e));const t=$(this);return te(t,"has",e),t.hasOwnProperty(e)}class zr{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Vo:Yr:i?Xr:Gr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=D(t);if(!r){let c;if(o&&(c=Po[n]))return c;if(n==="hasOwnProperty")return No}const l=Reflect.get(t,n,re(t)?t:s);return(Se(n)?Wr.has(n):Fo(n))||(r||te(t,"get",n),i)?l:re(l)?o&&ms(n)?l:l.value:J(l)?r?Zr(l):Es(l):l}}class Jr extends zr{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=ze(i);if(!we(s)&&!ze(s)&&(i=$(i),s=$(s)),!D(t)&&re(i)&&!re(s))return c?!1:(i.value=s,!0)}const o=D(t)&&ms(n)?Number(n)e,Jt=e=>Reflect.getPrototypeOf(e);function Uo(e,t,n){return function(...s){const r=this.__v_raw,i=$(r),o=ft(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,a=r[e](...s),f=n?Yn:t?rn:ee;return!t&&te(i,"iterate",c?Xn:nt),{next(){const{value:h,done:y}=a.next();return y?{value:h,done:y}:{value:l?[f(h[0]),f(h[1])]:f(h),done:y}},[Symbol.iterator](){return this}}}}function Gt(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function jo(e,t){const n={get(r){const i=this.__v_raw,o=$(i),l=$(r);e||(Ke(r,l)&&te(o,"get",r),te(o,"get",l));const{has:c}=Jt(o),a=t?Yn:e?rn:ee;if(c.call(o,r))return a(i.get(r));if(c.call(o,l))return a(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&te($(r),"iterate",nt),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=$(i),l=$(r);return e||(Ke(r,l)&&te(o,"has",r),te(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=$(l),a=t?Yn:e?rn:ee;return!e&&te(c,"iterate",nt),l.forEach((f,h)=>r.call(i,a(f),a(h),o))}};return ie(n,e?{add:Gt("add"),set:Gt("set"),delete:Gt("delete"),clear:Gt("clear")}:{add(r){!t&&!we(r)&&!ze(r)&&(r=$(r));const i=$(this);return Jt(i).has.call(i,r)||(i.add(r),Ue(i,"add",r,r)),this},set(r,i){!t&&!we(i)&&!ze(i)&&(i=$(i));const o=$(this),{has:l,get:c}=Jt(o);let a=l.call(o,r);a||(r=$(r),a=l.call(o,r));const f=c.call(o,r);return o.set(r,i),a?Ke(i,f)&&Ue(o,"set",r,i):Ue(o,"add",r,i),this},delete(r){const i=$(this),{has:o,get:l}=Jt(i);let c=o.call(i,r);c||(r=$(r),c=o.call(i,r)),l&&l.call(i,r);const a=i.delete(r);return c&&Ue(i,"delete",r,void 0),a},clear(){const r=$(this),i=r.size!==0,o=r.clear();return i&&Ue(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Uo(r,e,t)}),n}function Ss(e,t){const n=jo(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(V(n,r)&&r in s?n:s,r,i)}const Bo={get:Ss(!1,!1)},Ho={get:Ss(!1,!0)},$o={get:Ss(!0,!1)};const Gr=new WeakMap,Xr=new WeakMap,Yr=new WeakMap,Vo=new WeakMap;function ko(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function qo(e){return e.__v_skip||!Object.isExtensible(e)?0:ko(ho(e))}function Es(e){return ze(e)?e:Rs(e,!1,Io,Bo,Gr)}function Ko(e){return Rs(e,!1,Lo,Ho,Xr)}function Zr(e){return Rs(e,!0,Mo,$o,Yr)}function Rs(e,t,n,s,r){if(!J(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=qo(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function ut(e){return ze(e)?ut(e.__v_raw):!!(e&&e.__v_isReactive)}function ze(e){return!!(e&&e.__v_isReadonly)}function we(e){return!!(e&&e.__v_isShallow)}function Ts(e){return e?!!e.__v_raw:!1}function $(e){const t=e&&e.__v_raw;return t?$(t):e}function Wo(e){return!V(e,"__v_skip")&&Object.isExtensible(e)&&zn(e,"__v_skip",!0),e}const ee=e=>J(e)?Es(e):e,rn=e=>J(e)?Zr(e):e;function re(e){return e?e.__v_isRef===!0:!1}function mu(e){return zo(e,!1)}function zo(e,t){return re(e)?e:new Jo(e,t)}class Jo{constructor(t,n){this.dep=new xs,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:$(t),this._value=n?t:ee(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||we(t)||ze(t);t=s?t:$(t),Ke(t,n)&&(this._rawValue=t,this._value=s?t:ee(t),this.dep.trigger())}}function Go(e){return re(e)?e.value:e}const Xo={get:(e,t,n)=>t==="__v_raw"?e:Go(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return re(r)&&!re(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Qr(e){return ut(e)?e:new Proxy(e,Xo)}class Yo{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new xs(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ft-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&z!==this)return Hr(this,!0),!0}get value(){const t=this.dep.track();return kr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Zo(e,t,n=!1){let s,r;return U(e)?s=e:(s=e.get,r=e.set),new Yo(s,r,n)}const Xt={},on=new WeakMap;let et;function Qo(e,t=!1,n=et){if(n){let s=on.get(n);s||on.set(n,s=[]),s.push(e)}}function el(e,t,n=q){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,a=P=>r?P:we(P)||r===!1||r===0?je(P,1):je(P);let f,h,y,R,x=!1,T=!1;if(re(e)?(h=()=>e.value,x=we(e)):ut(e)?(h=()=>a(e),x=!0):D(e)?(T=!0,x=e.some(P=>ut(P)||we(P)),h=()=>e.map(P=>{if(re(P))return P.value;if(ut(P))return a(P);if(U(P))return c?c(P,2):P()})):U(e)?t?h=c?()=>c(e,2):e:h=()=>{if(y){Be();try{y()}finally{He()}}const P=et;et=f;try{return c?c(e,3,[R]):e(R)}finally{et=P}}:h=Ne,t&&r){const P=h,B=r===!0?1/0:r;h=()=>je(P(),B)}const C=Oo(),N=()=>{f.stop(),C&&C.active&&ps(C.effects,f)};if(i&&t){const P=t;t=(...B)=>{P(...B),N()}}let M=T?new Array(e.length).fill(Xt):Xt;const j=P=>{if(!(!(f.flags&1)||!f.dirty&&!P))if(t){const B=f.run();if(r||x||(T?B.some((Q,Z)=>Ke(Q,M[Z])):Ke(B,M))){y&&y();const Q=et;et=f;try{const Z=[B,M===Xt?void 0:T&&M[0]===Xt?[]:M,R];M=B,c?c(t,3,Z):t(...Z)}finally{et=Q}}}else f.run()};return l&&l(j),f=new jr(h),f.scheduler=o?()=>o(j,!1):j,R=P=>Qo(P,!1,f),y=f.onStop=()=>{const P=on.get(f);if(P){if(c)c(P,4);else for(const B of P)B();on.delete(f)}},t?s?j(!0):M=f.run():o?o(j.bind(null,!0),!0):f.run(),N.pause=f.pause.bind(f),N.resume=f.resume.bind(f),N.stop=N,N}function je(e,t=1/0,n){if(t<=0||!J(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,re(e))je(e.value,t,n);else if(D(e))for(let s=0;s{je(s,t,n)});else if(Nr(e)){for(const s in e)je(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&je(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function jt(e,t,n,s){try{return s?e(...s):e()}catch(r){_n(r,t,n)}}function Ie(e,t,n,s){if(U(e)){const r=jt(e,t,n,s);return r&&vr(r)&&r.catch(i=>{_n(i,t,n)}),r}if(D(e)){const r=[];for(let i=0;i>>1,r=ce[s],i=Dt(r);i=Dt(n)?ce.push(e):ce.splice(sl(t),0,e),e.flags|=1,ti()}}function ti(){ln||(ln=ei.then(si))}function rl(e){D(e)?at.push(...e):ke&&e.id===-1?ke.splice(lt+1,0,e):e.flags&1||(at.push(e),e.flags|=1),ti()}function Ks(e,t,n=ve+1){for(;nDt(n)-Dt(s));if(at.length=0,ke){ke.push(...t);return}for(ke=t,lt=0;lte.id==null?e.flags&2?-1:1/0:e.id;function si(e){try{for(ve=0;ve{s._d&&er(-1);const i=cn(t);let o;try{o=e(...r)}finally{cn(i),s._d&&er(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function gu(e,t){if(se===null)return e;const n=En(se),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport;function As(e,t){e.shapeFlag&6&&e.component?(e.transition=t,As(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}/*! #__NO_SIDE_EFFECTS__ */function bu(e,t){return U(e)?ie({name:e.name},t,{setup:e}):e}function ii(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Ct(e,t,n,s,r=!1){if(D(e)){e.forEach((x,T)=>Ct(x,t&&(D(t)?t[T]:t),n,s,r));return}if(dt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Ct(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?En(s.component):s.el,o=r?null:i,{i:l,r:c}=e,a=t&&t.r,f=l.refs===q?l.refs={}:l.refs,h=l.setupState,y=$(h),R=h===q?()=>!1:x=>V(y,x);if(a!=null&&a!==c&&(X(a)?(f[a]=null,R(a)&&(h[a]=null)):re(a)&&(a.value=null)),U(c))jt(c,l,12,[o,f]);else{const x=X(c),T=re(c);if(x||T){const C=()=>{if(e.f){const N=x?R(c)?h[c]:f[c]:c.value;r?D(N)&&ps(N,i):D(N)?N.includes(i)||N.push(i):x?(f[c]=[i],R(c)&&(h[c]=f[c])):(c.value=[i],e.k&&(f[e.k]=c.value))}else x?(f[c]=o,R(c)&&(h[c]=o)):T&&(c.value=o,e.k&&(f[e.k]=o))};o?(C.id=-1,be(C,n)):C()}}}gn().requestIdleCallback;gn().cancelIdleCallback;const dt=e=>!!e.type.__asyncLoader,oi=e=>e.type.__isKeepAlive;function cl(e,t){li(e,"a",t)}function fl(e,t){li(e,"da",t)}function li(e,t,n=fe){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(wn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)oi(r.parent.vnode)&&ul(s,t,n,r),r=r.parent}}function ul(e,t,n,s){const r=wn(t,e,s,!0);ci(()=>{ps(s[t],r)},n)}function wn(e,t,n=fe,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Be();const l=Bt(n),c=Ie(t,n,e,o);return l(),He(),c});return s?r.unshift(i):r.push(i),i}}const Ve=e=>(t,n=fe)=>{(!Mt||e==="sp")&&wn(e,(...s)=>t(...s),n)},al=Ve("bm"),dl=Ve("m"),hl=Ve("bu"),pl=Ve("u"),ml=Ve("bum"),ci=Ve("um"),gl=Ve("sp"),bl=Ve("rtg"),yl=Ve("rtc");function _l(e,t=fe){wn("ec",e,t)}const wl=Symbol.for("v-ndc");function yu(e,t,n,s){let r;const i=n,o=D(e);if(o||X(e)){const l=o&&ut(e);let c=!1,a=!1;l&&(c=!we(e),a=ze(e),e=yn(e)),r=new Array(e.length);for(let f=0,h=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,a=l.length;cvs(t)?!(t.type===$e||t.type===_e&&!fi(t.children)):!0)?e:null}const Zn=e=>e?Fi(e)?En(e):Zn(e.parent):null,Pt=ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Zn(e.parent),$root:e=>Zn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>ai(e),$forceUpdate:e=>e.f||(e.f=()=>{Os(e.update)}),$nextTick:e=>e.n||(e.n=nl.bind(e.proxy)),$watch:e=>kl.bind(e)}),Un=(e,t)=>e!==q&&!e.__isScriptSetup&&V(e,t),xl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const R=o[t];if(R!==void 0)switch(R){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Un(s,t))return o[t]=1,s[t];if(r!==q&&V(r,t))return o[t]=2,r[t];if((a=e.propsOptions[0])&&V(a,t))return o[t]=3,i[t];if(n!==q&&V(n,t))return o[t]=4,n[t];Qn&&(o[t]=0)}}const f=Pt[t];let h,y;if(f)return t==="$attrs"&&te(e.attrs,"get",""),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==q&&V(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,V(y,t))return y[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Un(r,t)?(r[t]=n,!0):s!==q&&V(s,t)?(s[t]=n,!0):V(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==q&&V(e,o)||Un(t,o)||(l=i[0])&&V(l,o)||V(s,o)||V(Pt,o)||V(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:V(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function wu(){return Sl().attrs}function Sl(e){const t=vi();return t.setupContext||(t.setupContext=Di(t))}function Ws(e){return D(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Qn=!0;function El(e){const t=ai(e),n=e.proxy,s=e.ctx;Qn=!1,t.beforeCreate&&zs(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:y,beforeUpdate:R,updated:x,activated:T,deactivated:C,beforeDestroy:N,beforeUnmount:M,destroyed:j,unmounted:P,render:B,renderTracked:Q,renderTriggered:Z,errorCaptured:me,serverPrefetch:Je,expose:Ge,inheritAttrs:bt,components:qt,directives:Kt,filters:vn}=t;if(a&&Rl(a,s,null),o)for(const G in o){const K=o[G];U(K)&&(s[G]=K.bind(n))}if(r){const G=r.call(n,n);J(G)&&(e.data=Es(G))}if(Qn=!0,i)for(const G in i){const K=i[G],Xe=U(K)?K.bind(n,n):U(K.get)?K.get.bind(n,n):Ne,Wt=!U(K)&&U(K.set)?K.set.bind(n):Ne,Ye=fc({get:Xe,set:Wt});Object.defineProperty(s,G,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:Re=>Ye.value=Re})}if(l)for(const G in l)ui(l[G],s,n,G);if(c){const G=U(c)?c.call(n):c;Reflect.ownKeys(G).forEach(K=>{vl(K,G[K])})}f&&zs(f,e,"c");function oe(G,K){D(K)?K.forEach(Xe=>G(Xe.bind(n))):K&&G(K.bind(n))}if(oe(al,h),oe(dl,y),oe(hl,R),oe(pl,x),oe(cl,T),oe(fl,C),oe(_l,me),oe(yl,Q),oe(bl,Z),oe(ml,M),oe(ci,P),oe(gl,Je),D(Ge))if(Ge.length){const G=e.exposed||(e.exposed={});Ge.forEach(K=>{Object.defineProperty(G,K,{get:()=>n[K],set:Xe=>n[K]=Xe,enumerable:!0})})}else e.exposed||(e.exposed={});B&&e.render===Ne&&(e.render=B),bt!=null&&(e.inheritAttrs=bt),qt&&(e.components=qt),Kt&&(e.directives=Kt),Je&&ii(e)}function Rl(e,t,n=Ne){D(e)&&(e=es(e));for(const s in e){const r=e[s];let i;J(r)?"default"in r?i=Zt(r.from||s,r.default,!0):i=Zt(r.from||s):i=Zt(r),re(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function zs(e,t,n){Ie(D(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function ui(e,t,n,s){let r=s.includes(".")?Ri(n,s):()=>n[s];if(X(e)){const i=t[e];U(i)&&Bn(r,i)}else if(U(e))Bn(r,e.bind(n));else if(J(e))if(D(e))e.forEach(i=>ui(i,t,n,s));else{const i=U(e.handler)?e.handler.bind(n):t[e.handler];U(i)&&Bn(r,i,e)}}function ai(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(a=>fn(c,a,o,!0)),fn(c,t,o)),J(t)&&i.set(t,c),c}function fn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&fn(e,i,n,!0),r&&r.forEach(o=>fn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Tl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Tl={data:Js,props:Gs,emits:Gs,methods:Rt,computed:Rt,beforeCreate:le,created:le,beforeMount:le,mounted:le,beforeUpdate:le,updated:le,beforeDestroy:le,beforeUnmount:le,destroyed:le,unmounted:le,activated:le,deactivated:le,errorCaptured:le,serverPrefetch:le,components:Rt,directives:Rt,watch:Al,provide:Js,inject:Ol};function Js(e,t){return t?e?function(){return ie(U(e)?e.call(this,this):e,U(t)?t.call(this,this):t)}:t:e}function Ol(e,t){return Rt(es(e),es(t))}function es(e){if(D(e)){const t={};for(let n=0;n1)return n&&U(t)?t.call(s&&s.proxy):t}}const hi={},pi=()=>Object.create(hi),mi=e=>Object.getPrototypeOf(e)===hi;function Fl(e,t,n,s=!1){const r={},i=pi();e.propsDefaults=Object.create(null),gi(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Ko(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Nl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=$(r),[c]=e.propsOptions;let a=!1;if((s||o>0)&&!(o&16)){if(o&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,R]=bi(h,t,!0);ie(o,y),R&&l.push(...R)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return J(e)&&s.set(e,ct),ct;if(D(i))for(let f=0;fe==="_"||e==="__"||e==="_ctx"||e==="$stable",Ps=e=>D(e)?e.map(Fe):[Fe(e)],Il=(e,t,n)=>{if(t._n)return t;const s=il((...r)=>Ps(t(...r)),n);return s._c=!1,s},yi=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Cs(r))continue;const i=e[r];if(U(i))t[r]=Il(r,i,s);else if(i!=null){const o=Ps(i);t[r]=()=>o}}},_i=(e,t)=>{const n=Ps(t);e.slots.default=()=>n},wi=(e,t,n)=>{for(const s in t)(n||!Cs(s))&&(e[s]=t[s])},Ml=(e,t,n)=>{const s=e.slots=pi();if(e.vnode.shapeFlag&32){const r=t.__;r&&zn(s,"__",r,!0);const i=t._;i?(wi(s,t,n),n&&zn(s,"_",i,!0)):yi(t,s)}else t&&_i(e,t)},Ll=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=q;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:wi(r,t,n):(i=!t.$stable,yi(t,r)),o=t}else t&&(_i(e,t),o={default:1});if(i)for(const l in r)!Cs(l)&&o[l]==null&&delete r[l]},be=Xl;function Ul(e){return jl(e)}function jl(e,t){const n=gn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:y,setScopeId:R=Ne,insertStaticContent:x}=e,T=(u,d,m,_=null,g=null,b=null,O=void 0,E=null,S=!!d.dynamicChildren)=>{if(u===d)return;u&&!St(u,d)&&(_=zt(u),Re(u,g,b,!0),u=null),d.patchFlag===-2&&(S=!1,d.dynamicChildren=null);const{type:w,ref:F,shapeFlag:A}=d;switch(w){case Sn:C(u,d,m,_);break;case $e:N(u,d,m,_);break;case Hn:u==null&&M(d,m,_,O);break;case _e:qt(u,d,m,_,g,b,O,E,S);break;default:A&1?B(u,d,m,_,g,b,O,E,S):A&6?Kt(u,d,m,_,g,b,O,E,S):(A&64||A&128)&&w.process(u,d,m,_,g,b,O,E,S,_t)}F!=null&&g?Ct(F,u&&u.ref,b,d||u,!d):F==null&&u&&u.ref!=null&&Ct(u.ref,null,b,u,!0)},C=(u,d,m,_)=>{if(u==null)s(d.el=l(d.children),m,_);else{const g=d.el=u.el;d.children!==u.children&&a(g,d.children)}},N=(u,d,m,_)=>{u==null?s(d.el=c(d.children||""),m,_):d.el=u.el},M=(u,d,m,_)=>{[u.el,u.anchor]=x(u.children,d,m,_,u.el,u.anchor)},j=({el:u,anchor:d},m,_)=>{let g;for(;u&&u!==d;)g=y(u),s(u,m,_),u=g;s(d,m,_)},P=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=y(u),r(u),u=m;r(d)},B=(u,d,m,_,g,b,O,E,S)=>{d.type==="svg"?O="svg":d.type==="math"&&(O="mathml"),u==null?Q(d,m,_,g,b,O,E,S):Je(u,d,g,b,O,E,S)},Q=(u,d,m,_,g,b,O,E)=>{let S,w;const{props:F,shapeFlag:A,transition:v,dirs:I}=u;if(S=u.el=o(u.type,b,F&&F.is,F),A&8?f(S,u.children):A&16&&me(u.children,S,null,_,g,jn(u,b),O,E),I&&Ze(u,null,_,"created"),Z(S,u,u.scopeId,O,_),F){for(const W in F)W!=="value"&&!Tt(W)&&i(S,W,null,F[W],b,_);"value"in F&&i(S,"value",null,F.value,b),(w=F.onVnodeBeforeMount)&&Ce(w,_,u)}I&&Ze(u,null,_,"beforeMount");const H=Bl(g,v);H&&v.beforeEnter(S),s(S,d,m),((w=F&&F.onVnodeMounted)||H||I)&&be(()=>{w&&Ce(w,_,u),H&&v.enter(S),I&&Ze(u,null,_,"mounted")},g)},Z=(u,d,m,_,g)=>{if(m&&R(u,m),_)for(let b=0;b<_.length;b++)R(u,_[b]);if(g){let b=g.subTree;if(d===b||Oi(b.type)&&(b.ssContent===d||b.ssFallback===d)){const O=g.vnode;Z(u,O,O.scopeId,O.slotScopeIds,g.parent)}}},me=(u,d,m,_,g,b,O,E,S=0)=>{for(let w=S;w{const E=d.el=u.el;let{patchFlag:S,dynamicChildren:w,dirs:F}=d;S|=u.patchFlag&16;const A=u.props||q,v=d.props||q;let I;if(m&&Qe(m,!1),(I=v.onVnodeBeforeUpdate)&&Ce(I,m,d,u),F&&Ze(d,u,m,"beforeUpdate"),m&&Qe(m,!0),(A.innerHTML&&v.innerHTML==null||A.textContent&&v.textContent==null)&&f(E,""),w?Ge(u.dynamicChildren,w,E,m,_,jn(d,g),b):O||K(u,d,E,null,m,_,jn(d,g),b,!1),S>0){if(S&16)bt(E,A,v,m,g);else if(S&2&&A.class!==v.class&&i(E,"class",null,v.class,g),S&4&&i(E,"style",A.style,v.style,g),S&8){const H=d.dynamicProps;for(let W=0;W{I&&Ce(I,m,d,u),F&&Ze(d,u,m,"updated")},_)},Ge=(u,d,m,_,g,b,O)=>{for(let E=0;E{if(d!==m){if(d!==q)for(const b in d)!Tt(b)&&!(b in m)&&i(u,b,d[b],null,g,_);for(const b in m){if(Tt(b))continue;const O=m[b],E=d[b];O!==E&&b!=="value"&&i(u,b,E,O,g,_)}"value"in m&&i(u,"value",d.value,m.value,g)}},qt=(u,d,m,_,g,b,O,E,S)=>{const w=d.el=u?u.el:l(""),F=d.anchor=u?u.anchor:l("");let{patchFlag:A,dynamicChildren:v,slotScopeIds:I}=d;I&&(E=E?E.concat(I):I),u==null?(s(w,m,_),s(F,m,_),me(d.children||[],m,F,g,b,O,E,S)):A>0&&A&64&&v&&u.dynamicChildren?(Ge(u.dynamicChildren,v,m,g,b,O,E),(d.key!=null||g&&d===g.subTree)&&xi(u,d,!0)):K(u,d,m,F,g,b,O,E,S)},Kt=(u,d,m,_,g,b,O,E,S)=>{d.slotScopeIds=E,u==null?d.shapeFlag&512?g.ctx.activate(d,m,_,O,S):vn(d,m,_,g,b,O,S):Ms(u,d,S)},vn=(u,d,m,_,g,b,O)=>{const E=u.component=rc(u,_,g);if(oi(u)&&(E.ctx.renderer=_t),ic(E,!1,O),E.asyncDep){if(g&&g.registerDep(E,oe,O),!u.el){const S=E.subTree=De($e);N(null,S,d,m),u.placeholder=S.el}}else oe(E,u,d,m,g,b,O)},Ms=(u,d,m)=>{const _=d.component=u.component;if(Jl(u,d,m))if(_.asyncDep&&!_.asyncResolved){G(_,d,m);return}else _.next=d,_.update();else d.el=u.el,_.vnode=d},oe=(u,d,m,_,g,b,O)=>{const E=()=>{if(u.isMounted){let{next:A,bu:v,u:I,parent:H,vnode:W}=u;{const Oe=Si(u);if(Oe){A&&(A.el=W.el,G(u,A,O)),Oe.asyncDep.then(()=>{u.isUnmounted||E()});return}}let k=A,ue;Qe(u,!1),A?(A.el=W.el,G(u,A,O)):A=W,v&&Yt(v),(ue=A.props&&A.props.onVnodeBeforeUpdate)&&Ce(ue,H,A,W),Qe(u,!0);const ae=Zs(u),Te=u.subTree;u.subTree=ae,T(Te,ae,h(Te.el),zt(Te),u,g,b),A.el=ae.el,k===null&&Gl(u,ae.el),I&&be(I,g),(ue=A.props&&A.props.onVnodeUpdated)&&be(()=>Ce(ue,H,A,W),g)}else{let A;const{el:v,props:I}=d,{bm:H,m:W,parent:k,root:ue,type:ae}=u,Te=dt(d);Qe(u,!1),H&&Yt(H),!Te&&(A=I&&I.onVnodeBeforeMount)&&Ce(A,k,d),Qe(u,!0);{ue.ce&&ue.ce._def.shadowRoot!==!1&&ue.ce._injectChildStyle(ae);const Oe=u.subTree=Zs(u);T(null,Oe,m,_,u,g,b),d.el=Oe.el}if(W&&be(W,g),!Te&&(A=I&&I.onVnodeMounted)){const Oe=d;be(()=>Ce(A,k,Oe),g)}(d.shapeFlag&256||k&&dt(k.vnode)&&k.vnode.shapeFlag&256)&&u.a&&be(u.a,g),u.isMounted=!0,d=m=_=null}};u.scope.on();const S=u.effect=new jr(E);u.scope.off();const w=u.update=S.run.bind(S),F=u.job=S.runIfDirty.bind(S);F.i=u,F.id=u.uid,S.scheduler=()=>Os(F),Qe(u,!0),w()},G=(u,d,m)=>{d.component=u;const _=u.vnode.props;u.vnode=d,u.next=null,Nl(u,d.props,_,m),Ll(u,d.children,m),Be(),Ks(u),He()},K=(u,d,m,_,g,b,O,E,S=!1)=>{const w=u&&u.children,F=u?u.shapeFlag:0,A=d.children,{patchFlag:v,shapeFlag:I}=d;if(v>0){if(v&128){Wt(w,A,m,_,g,b,O,E,S);return}else if(v&256){Xe(w,A,m,_,g,b,O,E,S);return}}I&8?(F&16&&yt(w,g,b),A!==w&&f(m,A)):F&16?I&16?Wt(w,A,m,_,g,b,O,E,S):yt(w,g,b,!0):(F&8&&f(m,""),I&16&&me(A,m,_,g,b,O,E,S))},Xe=(u,d,m,_,g,b,O,E,S)=>{u=u||ct,d=d||ct;const w=u.length,F=d.length,A=Math.min(w,F);let v;for(v=0;vF?yt(u,g,b,!0,!1,A):me(d,m,_,g,b,O,E,S,A)},Wt=(u,d,m,_,g,b,O,E,S)=>{let w=0;const F=d.length;let A=u.length-1,v=F-1;for(;w<=A&&w<=v;){const I=u[w],H=d[w]=S?qe(d[w]):Fe(d[w]);if(St(I,H))T(I,H,m,null,g,b,O,E,S);else break;w++}for(;w<=A&&w<=v;){const I=u[A],H=d[v]=S?qe(d[v]):Fe(d[v]);if(St(I,H))T(I,H,m,null,g,b,O,E,S);else break;A--,v--}if(w>A){if(w<=v){const I=v+1,H=Iv)for(;w<=A;)Re(u[w],g,b,!0),w++;else{const I=w,H=w,W=new Map;for(w=H;w<=v;w++){const ge=d[w]=S?qe(d[w]):Fe(d[w]);ge.key!=null&&W.set(ge.key,w)}let k,ue=0;const ae=v-H+1;let Te=!1,Oe=0;const wt=new Array(ae);for(w=0;w=ae){Re(ge,g,b,!0);continue}let Ae;if(ge.key!=null)Ae=W.get(ge.key);else for(k=H;k<=v;k++)if(wt[k-H]===0&&St(ge,d[k])){Ae=k;break}Ae===void 0?Re(ge,g,b,!0):(wt[Ae-H]=w+1,Ae>=Oe?Oe=Ae:Te=!0,T(ge,d[Ae],m,null,g,b,O,E,S),ue++)}const js=Te?Hl(wt):ct;for(k=js.length-1,w=ae-1;w>=0;w--){const ge=H+w,Ae=d[ge],Bs=d[ge+1],Hs=ge+1{const{el:b,type:O,transition:E,children:S,shapeFlag:w}=u;if(w&6){Ye(u.component.subTree,d,m,_);return}if(w&128){u.suspense.move(d,m,_);return}if(w&64){O.move(u,d,m,_t);return}if(O===_e){s(b,d,m);for(let A=0;AE.enter(b),g);else{const{leave:A,delayLeave:v,afterLeave:I}=E,H=()=>{u.ctx.isUnmounted?r(b):s(b,d,m)},W=()=>{A(b,()=>{H(),I&&I()})};v?v(b,H,W):W()}else s(b,d,m)},Re=(u,d,m,_=!1,g=!1)=>{const{type:b,props:O,ref:E,children:S,dynamicChildren:w,shapeFlag:F,patchFlag:A,dirs:v,cacheIndex:I}=u;if(A===-2&&(g=!1),E!=null&&(Be(),Ct(E,null,m,u,!0),He()),I!=null&&(d.renderCache[I]=void 0),F&256){d.ctx.deactivate(u);return}const H=F&1&&v,W=!dt(u);let k;if(W&&(k=O&&O.onVnodeBeforeUnmount)&&Ce(k,d,u),F&6)fo(u.component,m,_);else{if(F&128){u.suspense.unmount(m,_);return}H&&Ze(u,null,d,"beforeUnmount"),F&64?u.type.remove(u,d,m,_t,_):w&&!w.hasOnce&&(b!==_e||A>0&&A&64)?yt(w,d,m,!1,!0):(b===_e&&A&384||!g&&F&16)&&yt(S,d,m),_&&Ls(u)}(W&&(k=O&&O.onVnodeUnmounted)||H)&&be(()=>{k&&Ce(k,d,u),H&&Ze(u,null,d,"unmounted")},m)},Ls=u=>{const{type:d,el:m,anchor:_,transition:g}=u;if(d===_e){co(m,_);return}if(d===Hn){P(u);return}const b=()=>{r(m),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(u.shapeFlag&1&&g&&!g.persisted){const{leave:O,delayLeave:E}=g,S=()=>O(m,b);E?E(u.el,b,S):S()}else b()},co=(u,d)=>{let m;for(;u!==d;)m=y(u),r(u),u=m;r(d)},fo=(u,d,m)=>{const{bum:_,scope:g,job:b,subTree:O,um:E,m:S,a:w,parent:F,slots:{__:A}}=u;Ys(S),Ys(w),_&&Yt(_),F&&D(A)&&A.forEach(v=>{F.renderCache[v]=void 0}),g.stop(),b&&(b.flags|=8,Re(O,u,d,m)),E&&be(E,d),be(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},yt=(u,d,m,_=!1,g=!1,b=0)=>{for(let O=b;O{if(u.shapeFlag&6)return zt(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=y(u.anchor||u.el),m=d&&d[ol];return m?y(m):d};let Fn=!1;const Us=(u,d,m)=>{u==null?d._vnode&&Re(d._vnode,null,null,!0):T(d._vnode||null,u,d,null,null,null,m),d._vnode=u,Fn||(Fn=!0,Ks(),ni(),Fn=!1)},_t={p:T,um:Re,m:Ye,r:Ls,mt:vn,mc:me,pc:K,pbc:Ge,n:zt,o:e};return{render:Us,hydrate:void 0,createApp:Pl(Us)}}function jn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Qe({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Bl(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function xi(e,t,n=!1){const s=e.children,r=t.children;if(D(s)&&D(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Si(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Si(t)}function Ys(e){if(e)for(let t=0;tZt($l);function Bn(e,t,n){return Ei(e,t,n)}function Ei(e,t,n=q){const{immediate:s,deep:r,flush:i,once:o}=n,l=ie({},n),c=t&&s||!t&&i!=="post";let a;if(Mt){if(i==="sync"){const R=Vl();a=R.__watcherHandles||(R.__watcherHandles=[])}else if(!c){const R=()=>{};return R.stop=Ne,R.resume=Ne,R.pause=Ne,R}}const f=fe;l.call=(R,x,T)=>Ie(R,f,x,T);let h=!1;i==="post"?l.scheduler=R=>{be(R,f&&f.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(R,x)=>{x?R():Os(R)}),l.augmentJob=R=>{t&&(R.flags|=4),h&&(R.flags|=2,f&&(R.id=f.uid,R.i=f))};const y=el(e,t,l);return Mt&&(a?a.push(y):c&&y()),y}function kl(e,t,n){const s=this.proxy,r=X(e)?e.includes(".")?Ri(s,e):()=>s[e]:e.bind(s,s);let i;U(t)?i=t:(i=t.handler,n=t);const o=Bt(this),l=Ei(r,i.bind(s),n);return o(),l}function Ri(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${We(t)}Modifiers`]||e[`${it(t)}Modifiers`];function Kl(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||q;let r=n;const i=t.startsWith("update:"),o=i&&ql(s,t.slice(7));o&&(o.trim&&(r=n.map(f=>X(f)?f.trim():f)),o.number&&(r=n.map(go)));let l,c=s[l=Nn(t)]||s[l=Nn(We(t))];!c&&i&&(c=s[l=Nn(it(t))]),c&&Ie(c,e,6,r);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ie(a,e,6,r)}}function Ti(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!U(e)){const c=a=>{const f=Ti(a,t,!0);f&&(l=!0,ie(o,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(J(e)&&s.set(e,null),null):(D(i)?i.forEach(c=>o[c]=null):ie(o,i),J(e)&&s.set(e,o),o)}function xn(e,t){return!e||!hn(t)?!1:(t=t.slice(2).replace(/Once$/,""),V(e,t[0].toLowerCase()+t.slice(1))||V(e,it(t))||V(e,t))}function Zs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:a,renderCache:f,props:h,data:y,setupState:R,ctx:x,inheritAttrs:T}=e,C=cn(e);let N,M;try{if(n.shapeFlag&4){const P=r||s,B=P;N=Fe(a.call(B,P,f,h,R,y,x)),M=l}else{const P=t;N=Fe(P.length>1?P(h,{attrs:l,slots:o,emit:c}):P(h,null)),M=t.props?l:Wl(l)}}catch(P){vt.length=0,_n(P,e,1),N=De($e)}let j=N;if(M&&T!==!1){const P=Object.keys(M),{shapeFlag:B}=j;P.length&&B&7&&(i&&P.some(hs)&&(M=zl(M,i)),j=pt(j,M,!1,!0))}return n.dirs&&(j=pt(j,null,!1,!0),j.dirs=j.dirs?j.dirs.concat(n.dirs):n.dirs),n.transition&&As(j,n.transition),N=j,cn(C),N}const Wl=e=>{let t;for(const n in e)(n==="class"||n==="style"||hn(n))&&((t||(t={}))[n]=e[n]);return t},zl=(e,t)=>{const n={};for(const s in e)(!hs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Jl(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Qs(s,o,a):!!o;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function Xl(e,t){t&&t.pendingBranch?D(e)?t.effects.push(...e):t.effects.push(e):rl(e)}const _e=Symbol.for("v-fgt"),Sn=Symbol.for("v-txt"),$e=Symbol.for("v-cmt"),Hn=Symbol.for("v-stc"),vt=[];let ye=null;function ns(e=!1){vt.push(ye=e?null:[])}function Yl(){vt.pop(),ye=vt[vt.length-1]||null}let It=1;function er(e,t=!1){It+=e,e<0&&ye&&t&&(ye.hasOnce=!0)}function Ai(e){return e.dynamicChildren=It>0?ye||ct:null,Yl(),It>0&&ye&&ye.push(e),e}function xu(e,t,n,s,r,i){return Ai(Pi(e,t,n,s,r,i,!0))}function ss(e,t,n,s,r){return Ai(De(e,t,n,s,r,!0))}function vs(e){return e?e.__v_isVNode===!0:!1}function St(e,t){return e.type===t.type&&e.key===t.key}const Ci=({key:e})=>e??null,Qt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?X(e)||re(e)||U(e)?{i:se,r:e,k:t,f:!!n}:e:null);function Pi(e,t=null,n=null,s=0,r=null,i=e===_e?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ci(t),ref:t&&Qt(t),scopeId:ri,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:se};return l?(Fs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=X(n)?8:16),It>0&&!o&&ye&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&ye.push(c),c}const De=Zl;function Zl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===wl)&&(e=$e),vs(e)){const l=pt(e,t,!0);return n&&Fs(l,n),It>0&&!i&&ye&&(l.shapeFlag&6?ye[ye.indexOf(e)]=l:ye.push(l)),l.patchFlag=-2,l}if(cc(e)&&(e=e.__vccOpts),t){t=Ql(t);let{class:l,style:c}=t;l&&!X(l)&&(t.class=bs(l)),J(c)&&(Ts(c)&&!D(c)&&(c=ie({},c)),t.style=gs(c))}const o=X(e)?1:Oi(e)?128:ll(e)?64:J(e)?4:U(e)?2:0;return Pi(e,t,n,s,r,o,i,!0)}function Ql(e){return e?Ts(e)||mi(e)?ie({},e):e:null}function pt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,a=t?tc(r||{},t):r,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&Ci(a),ref:t&&t.ref?n&&i?D(i)?i.concat(Qt(t)):[i,Qt(t)]:Qt(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==_e?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&pt(e.ssContent),ssFallback:e.ssFallback&&pt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&As(f,c.clone(f)),f}function ec(e=" ",t=0){return De(Sn,null,e,t)}function Su(e="",t=!1){return t?(ns(),ss($e,null,e)):De($e,null,e)}function Fe(e){return e==null||typeof e=="boolean"?De($e):D(e)?De(_e,null,e.slice()):vs(e)?qe(e):De(Sn,null,String(e))}function qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:pt(e)}function Fs(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(D(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Fs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!mi(t)?t._ctx=se:r===3&&se&&(se.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else U(t)?(t={default:t,_ctx:se},n=32):(t=String(t),s&64?(n=16,t=[ec(t)]):n=8);e.children=t,e.shapeFlag|=n}function tc(...e){const t={};for(let n=0;nfe||se;let un,rs;{const e=gn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};un=t("__VUE_INSTANCE_SETTERS__",n=>fe=n),rs=t("__VUE_SSR_SETTERS__",n=>Mt=n)}const Bt=e=>{const t=fe;return un(e),e.scope.on(),()=>{e.scope.off(),un(t)}},tr=()=>{fe&&fe.scope.off(),un(null)};function Fi(e){return e.vnode.shapeFlag&4}let Mt=!1;function ic(e,t=!1,n=!1){t&&rs(t);const{props:s,children:r}=e.vnode,i=Fi(e);Fl(e,s,i,t),Ml(e,r,n||t);const o=i?oc(e,t):void 0;return t&&rs(!1),o}function oc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,xl);const{setup:s}=n;if(s){Be();const r=e.setupContext=s.length>1?Di(e):null,i=Bt(e),o=jt(s,e,0,[e.props,r]),l=vr(o);if(He(),i(),(l||e.sp)&&!dt(e)&&ii(e),l){if(o.then(tr,tr),t)return o.then(c=>{nr(e,c)}).catch(c=>{_n(c,e,0)});e.asyncDep=o}else nr(e,o)}else Ni(e)}function nr(e,t,n){U(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:J(t)&&(e.setupState=Qr(t)),Ni(e)}function Ni(e,t,n){const s=e.type;e.render||(e.render=s.render||Ne);{const r=Bt(e);Be();try{El(e)}finally{He(),r()}}}const lc={get(e,t){return te(e,"get",""),e[t]}};function Di(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,lc),slots:e.slots,emit:e.emit,expose:t}}function En(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Qr(Wo(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Pt)return Pt[n](e)},has(t,n){return n in t||n in Pt}})):e.proxy}function cc(e){return U(e)&&"__vccOpts"in e}const fc=(e,t)=>Zo(e,t,Mt),uc="3.5.18";/** +* @vue/runtime-dom v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let is;const sr=typeof window<"u"&&window.trustedTypes;if(sr)try{is=sr.createPolicy("vue",{createHTML:e=>e})}catch{}const Ii=is?e=>is.createHTML(e):e=>e,ac="http://www.w3.org/2000/svg",dc="http://www.w3.org/1998/Math/MathML",Le=typeof document<"u"?document:null,rr=Le&&Le.createElement("template"),hc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Le.createElementNS(ac,e):t==="mathml"?Le.createElementNS(dc,e):n?Le.createElement(e,{is:n}):Le.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Le.createTextNode(e),createComment:e=>Le.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Le.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{rr.innerHTML=Ii(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=rr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},pc=Symbol("_vtc");function mc(e,t,n){const s=e[pc];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ir=Symbol("_vod"),gc=Symbol("_vsh"),bc=Symbol(""),yc=/(^|;)\s*display\s*:/;function _c(e,t,n){const s=e.style,r=X(n);let i=!1;if(n&&!r){if(t)if(X(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&en(s,l,"")}else for(const o in t)n[o]==null&&en(s,o,"");for(const o in n)o==="display"&&(i=!0),en(s,o,n[o])}else if(r){if(t!==n){const o=s[bc];o&&(n+=";"+o),s.cssText=n,i=yc.test(n)}}else t&&e.removeAttribute("style");ir in e&&(e[ir]=i?s.display:"",e[gc]&&(s.display="none"))}const or=/\s*!important$/;function en(e,t,n){if(D(n))n.forEach(s=>en(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=wc(e,t);or.test(n)?e.setProperty(it(s),n.replace(or,""),"important"):e[s]=n}}const lr=["Webkit","Moz","ms"],$n={};function wc(e,t){const n=$n[t];if(n)return n;let s=We(t);if(s!=="filter"&&s in e)return $n[t]=s;s=Dr(s);for(let r=0;rVn||(Rc.then(()=>Vn=0),Vn=Date.now());function Oc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ie(Ac(s,n.value),t,5,[s])};return n.value=e,n.attached=Tc(),n}function Ac(e,t){if(D(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const hr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Cc=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?mc(e,s,o):t==="style"?_c(e,n,s):hn(t)?hs(t)||Sc(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Pc(e,t,s,o))?(ur(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&fr(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!X(s))?ur(e,We(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),fr(e,t,s,o))};function Pc(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&hr(t)&&U(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return hr(t)&&X(n)?!1:t in e}const pr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return D(t)?n=>Yt(t,n):t},kn=Symbol("_assign"),Eu={deep:!0,created(e,t,n){e[kn]=pr(n),Mi(e,"change",()=>{const s=e._modelValue,r=vc(e),i=e.checked,o=e[kn];if(D(s)){const l=Mr(s,r),c=l!==-1;if(i&&!c)o(s.concat(r));else if(!i&&c){const a=[...s];a.splice(l,1),o(a)}}else if(pn(s)){const l=new Set(s);i?l.add(r):l.delete(r),o(l)}else o(Li(e,i))})},mounted:mr,beforeUpdate(e,t,n){e[kn]=pr(n),mr(e,t,n)}};function mr(e,{value:t,oldValue:n},s){e._modelValue=t;let r;if(D(t))r=Mr(t,s.props.value)>-1;else if(pn(t))r=t.has(s.props.value);else{if(t===n)return;r=bn(t,Li(e,!0))}e.checked!==r&&(e.checked=r)}function vc(e){return"_value"in e?e._value:e.value}function Li(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Fc=["ctrl","shift","alt","meta"],Nc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Fc.some(n=>e[`${n}Key`]&&!t.includes(n))},Ru=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const t=Ic().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Lc(s);if(!r)return;const i=t._component;!U(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Mc(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t};function Mc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Lc(e){return X(e)?document.querySelector(e):e}function Ui(e,t){return function(){return e.apply(t,arguments)}}const{toString:Uc}=Object.prototype,{getPrototypeOf:Ns}=Object,{iterator:Rn,toStringTag:ji}=Symbol,Tn=(e=>t=>{const n=Uc.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Ee=e=>(e=e.toLowerCase(),t=>Tn(t)===e),On=e=>t=>typeof t===e,{isArray:mt}=Array,Lt=On("undefined");function Ht(e){return e!==null&&!Lt(e)&&e.constructor!==null&&!Lt(e.constructor)&&he(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Bi=Ee("ArrayBuffer");function jc(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Bi(e.buffer),t}const Bc=On("string"),he=On("function"),Hi=On("number"),$t=e=>e!==null&&typeof e=="object",Hc=e=>e===!0||e===!1,tn=e=>{if(Tn(e)!=="object")return!1;const t=Ns(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(ji in e)&&!(Rn in e)},$c=e=>{if(!$t(e)||Ht(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},Vc=Ee("Date"),kc=Ee("File"),qc=Ee("Blob"),Kc=Ee("FileList"),Wc=e=>$t(e)&&he(e.pipe),zc=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||he(e.append)&&((t=Tn(e))==="formdata"||t==="object"&&he(e.toString)&&e.toString()==="[object FormData]"))},Jc=Ee("URLSearchParams"),[Gc,Xc,Yc,Zc]=["ReadableStream","Request","Response","Headers"].map(Ee),Qc=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Vt(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let s,r;if(typeof e!="object"&&(e=[e]),mt(e))for(s=0,r=e.length;s0;)if(r=n[s],t===r.toLowerCase())return r;return null}const tt=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Vi=e=>!Lt(e)&&e!==tt;function os(){const{caseless:e}=Vi(this)&&this||{},t={},n=(s,r)=>{const i=e&&$i(t,r)||r;tn(t[i])&&tn(s)?t[i]=os(t[i],s):tn(s)?t[i]=os({},s):mt(s)?t[i]=s.slice():t[i]=s};for(let s=0,r=arguments.length;s(Vt(t,(r,i)=>{n&&he(r)?e[i]=Ui(r,n):e[i]=r},{allOwnKeys:s}),e),tf=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),nf=(e,t,n,s)=>{e.prototype=Object.create(t.prototype,s),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},sf=(e,t,n,s)=>{let r,i,o;const l={};if(t=t||{},e==null)return t;do{for(r=Object.getOwnPropertyNames(e),i=r.length;i-- >0;)o=r[i],(!s||s(o,e,t))&&!l[o]&&(t[o]=e[o],l[o]=!0);e=n!==!1&&Ns(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},rf=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const s=e.indexOf(t,n);return s!==-1&&s===n},of=e=>{if(!e)return null;if(mt(e))return e;let t=e.length;if(!Hi(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},lf=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Ns(Uint8Array)),cf=(e,t)=>{const s=(e&&e[Rn]).call(e);let r;for(;(r=s.next())&&!r.done;){const i=r.value;t.call(e,i[0],i[1])}},ff=(e,t)=>{let n;const s=[];for(;(n=e.exec(t))!==null;)s.push(n);return s},uf=Ee("HTMLFormElement"),af=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,s,r){return s.toUpperCase()+r}),br=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),df=Ee("RegExp"),ki=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),s={};Vt(n,(r,i)=>{let o;(o=t(r,i,e))!==!1&&(s[i]=o||r)}),Object.defineProperties(e,s)},hf=e=>{ki(e,(t,n)=>{if(he(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const s=e[n];if(he(s)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},pf=(e,t)=>{const n={},s=r=>{r.forEach(i=>{n[i]=!0})};return mt(e)?s(e):s(String(e).split(t)),n},mf=()=>{},gf=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function bf(e){return!!(e&&he(e.append)&&e[ji]==="FormData"&&e[Rn])}const yf=e=>{const t=new Array(10),n=(s,r)=>{if($t(s)){if(t.indexOf(s)>=0)return;if(Ht(s))return s;if(!("toJSON"in s)){t[r]=s;const i=mt(s)?[]:{};return Vt(s,(o,l)=>{const c=n(o,r+1);!Lt(c)&&(i[l]=c)}),t[r]=void 0,i}}return s};return n(e,0)},_f=Ee("AsyncFunction"),wf=e=>e&&($t(e)||he(e))&&he(e.then)&&he(e.catch),qi=((e,t)=>e?setImmediate:t?((n,s)=>(tt.addEventListener("message",({source:r,data:i})=>{r===tt&&i===n&&s.length&&s.shift()()},!1),r=>{s.push(r),tt.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",he(tt.postMessage)),xf=typeof queueMicrotask<"u"?queueMicrotask.bind(tt):typeof process<"u"&&process.nextTick||qi,Sf=e=>e!=null&&he(e[Rn]),p={isArray:mt,isArrayBuffer:Bi,isBuffer:Ht,isFormData:zc,isArrayBufferView:jc,isString:Bc,isNumber:Hi,isBoolean:Hc,isObject:$t,isPlainObject:tn,isEmptyObject:$c,isReadableStream:Gc,isRequest:Xc,isResponse:Yc,isHeaders:Zc,isUndefined:Lt,isDate:Vc,isFile:kc,isBlob:qc,isRegExp:df,isFunction:he,isStream:Wc,isURLSearchParams:Jc,isTypedArray:lf,isFileList:Kc,forEach:Vt,merge:os,extend:ef,trim:Qc,stripBOM:tf,inherits:nf,toFlatObject:sf,kindOf:Tn,kindOfTest:Ee,endsWith:rf,toArray:of,forEachEntry:cf,matchAll:ff,isHTMLForm:uf,hasOwnProperty:br,hasOwnProp:br,reduceDescriptors:ki,freezeMethods:hf,toObjectSet:pf,toCamelCase:af,noop:mf,toFiniteNumber:gf,findKey:$i,global:tt,isContextDefined:Vi,isSpecCompliantForm:bf,toJSONObject:yf,isAsyncFn:_f,isThenable:wf,setImmediate:qi,asap:xf,isIterable:Sf};function L(e,t,n,s,r){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),s&&(this.request=s),r&&(this.response=r,this.status=r.status?r.status:null)}p.inherits(L,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:p.toJSONObject(this.config),code:this.code,status:this.status}}});const Ki=L.prototype,Wi={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{Wi[e]={value:e}});Object.defineProperties(L,Wi);Object.defineProperty(Ki,"isAxiosError",{value:!0});L.from=(e,t,n,s,r,i)=>{const o=Object.create(Ki);return p.toFlatObject(e,o,function(c){return c!==Error.prototype},l=>l!=="isAxiosError"),L.call(o,e.message,t,n,s,r),o.cause=e,o.name=e.name,i&&Object.assign(o,i),o};const Ef=null;function ls(e){return p.isPlainObject(e)||p.isArray(e)}function zi(e){return p.endsWith(e,"[]")?e.slice(0,-2):e}function yr(e,t,n){return e?e.concat(t).map(function(r,i){return r=zi(r),!n&&i?"["+r+"]":r}).join(n?".":""):t}function Rf(e){return p.isArray(e)&&!e.some(ls)}const Tf=p.toFlatObject(p,{},null,function(t){return/^is[A-Z]/.test(t)});function An(e,t,n){if(!p.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=p.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(T,C){return!p.isUndefined(C[T])});const s=n.metaTokens,r=n.visitor||f,i=n.dots,o=n.indexes,c=(n.Blob||typeof Blob<"u"&&Blob)&&p.isSpecCompliantForm(t);if(!p.isFunction(r))throw new TypeError("visitor must be a function");function a(x){if(x===null)return"";if(p.isDate(x))return x.toISOString();if(p.isBoolean(x))return x.toString();if(!c&&p.isBlob(x))throw new L("Blob is not supported. Use a Buffer instead.");return p.isArrayBuffer(x)||p.isTypedArray(x)?c&&typeof Blob=="function"?new Blob([x]):Buffer.from(x):x}function f(x,T,C){let N=x;if(x&&!C&&typeof x=="object"){if(p.endsWith(T,"{}"))T=s?T:T.slice(0,-2),x=JSON.stringify(x);else if(p.isArray(x)&&Rf(x)||(p.isFileList(x)||p.endsWith(T,"[]"))&&(N=p.toArray(x)))return T=zi(T),N.forEach(function(j,P){!(p.isUndefined(j)||j===null)&&t.append(o===!0?yr([T],P,i):o===null?T:T+"[]",a(j))}),!1}return ls(x)?!0:(t.append(yr(C,T,i),a(x)),!1)}const h=[],y=Object.assign(Tf,{defaultVisitor:f,convertValue:a,isVisitable:ls});function R(x,T){if(!p.isUndefined(x)){if(h.indexOf(x)!==-1)throw Error("Circular reference detected in "+T.join("."));h.push(x),p.forEach(x,function(N,M){(!(p.isUndefined(N)||N===null)&&r.call(t,N,p.isString(M)?M.trim():M,T,y))===!0&&R(N,T?T.concat(M):[M])}),h.pop()}}if(!p.isObject(e))throw new TypeError("data must be an object");return R(e),t}function _r(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(s){return t[s]})}function Ds(e,t){this._pairs=[],e&&An(e,this,t)}const Ji=Ds.prototype;Ji.append=function(t,n){this._pairs.push([t,n])};Ji.toString=function(t){const n=t?function(s){return t.call(this,s,_r)}:_r;return this._pairs.map(function(r){return n(r[0])+"="+n(r[1])},"").join("&")};function Of(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Gi(e,t,n){if(!t)return e;const s=n&&n.encode||Of;p.isFunction(n)&&(n={serialize:n});const r=n&&n.serialize;let i;if(r?i=r(t,n):i=p.isURLSearchParams(t)?t.toString():new Ds(t,n).toString(s),i){const o=e.indexOf("#");o!==-1&&(e=e.slice(0,o)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class wr{constructor(){this.handlers=[]}use(t,n,s){return this.handlers.push({fulfilled:t,rejected:n,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){p.forEach(this.handlers,function(s){s!==null&&t(s)})}}const Xi={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Af=typeof URLSearchParams<"u"?URLSearchParams:Ds,Cf=typeof FormData<"u"?FormData:null,Pf=typeof Blob<"u"?Blob:null,vf={isBrowser:!0,classes:{URLSearchParams:Af,FormData:Cf,Blob:Pf},protocols:["http","https","file","blob","url","data"]},Is=typeof window<"u"&&typeof document<"u",cs=typeof navigator=="object"&&navigator||void 0,Ff=Is&&(!cs||["ReactNative","NativeScript","NS"].indexOf(cs.product)<0),Nf=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Df=Is&&window.location.href||"http://localhost",If=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Is,hasStandardBrowserEnv:Ff,hasStandardBrowserWebWorkerEnv:Nf,navigator:cs,origin:Df},Symbol.toStringTag,{value:"Module"})),ne={...If,...vf};function Mf(e,t){return An(e,new ne.classes.URLSearchParams,{visitor:function(n,s,r,i){return ne.isNode&&p.isBuffer(n)?(this.append(s,n.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)},...t})}function Lf(e){return p.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function Uf(e){const t={},n=Object.keys(e);let s;const r=n.length;let i;for(s=0;s=n.length;return o=!o&&p.isArray(r)?r.length:o,c?(p.hasOwnProp(r,o)?r[o]=[r[o],s]:r[o]=s,!l):((!r[o]||!p.isObject(r[o]))&&(r[o]=[]),t(n,s,r[o],i)&&p.isArray(r[o])&&(r[o]=Uf(r[o])),!l)}if(p.isFormData(e)&&p.isFunction(e.entries)){const n={};return p.forEachEntry(e,(s,r)=>{t(Lf(s),r,n,0)}),n}return null}function jf(e,t,n){if(p.isString(e))try{return(t||JSON.parse)(e),p.trim(e)}catch(s){if(s.name!=="SyntaxError")throw s}return(n||JSON.stringify)(e)}const kt={transitional:Xi,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const s=n.getContentType()||"",r=s.indexOf("application/json")>-1,i=p.isObject(t);if(i&&p.isHTMLForm(t)&&(t=new FormData(t)),p.isFormData(t))return r?JSON.stringify(Yi(t)):t;if(p.isArrayBuffer(t)||p.isBuffer(t)||p.isStream(t)||p.isFile(t)||p.isBlob(t)||p.isReadableStream(t))return t;if(p.isArrayBufferView(t))return t.buffer;if(p.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(i){if(s.indexOf("application/x-www-form-urlencoded")>-1)return Mf(t,this.formSerializer).toString();if((l=p.isFileList(t))||s.indexOf("multipart/form-data")>-1){const c=this.env&&this.env.FormData;return An(l?{"files[]":t}:t,c&&new c,this.formSerializer)}}return i||r?(n.setContentType("application/json",!1),jf(t)):t}],transformResponse:[function(t){const n=this.transitional||kt.transitional,s=n&&n.forcedJSONParsing,r=this.responseType==="json";if(p.isResponse(t)||p.isReadableStream(t))return t;if(t&&p.isString(t)&&(s&&!this.responseType||r)){const o=!(n&&n.silentJSONParsing)&&r;try{return JSON.parse(t)}catch(l){if(o)throw l.name==="SyntaxError"?L.from(l,L.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ne.classes.FormData,Blob:ne.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};p.forEach(["delete","get","head","post","put","patch"],e=>{kt.headers[e]={}});const Bf=p.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Hf=e=>{const t={};let n,s,r;return e&&e.split(` +`).forEach(function(o){r=o.indexOf(":"),n=o.substring(0,r).trim().toLowerCase(),s=o.substring(r+1).trim(),!(!n||t[n]&&Bf[n])&&(n==="set-cookie"?t[n]?t[n].push(s):t[n]=[s]:t[n]=t[n]?t[n]+", "+s:s)}),t},xr=Symbol("internals");function Et(e){return e&&String(e).trim().toLowerCase()}function nn(e){return e===!1||e==null?e:p.isArray(e)?e.map(nn):String(e)}function $f(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=n.exec(e);)t[s[1]]=s[2];return t}const Vf=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function qn(e,t,n,s,r){if(p.isFunction(s))return s.call(this,t,n);if(r&&(t=n),!!p.isString(t)){if(p.isString(s))return t.indexOf(s)!==-1;if(p.isRegExp(s))return s.test(t)}}function kf(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,s)=>n.toUpperCase()+s)}function qf(e,t){const n=p.toCamelCase(" "+t);["get","set","has"].forEach(s=>{Object.defineProperty(e,s+n,{value:function(r,i,o){return this[s].call(this,t,r,i,o)},configurable:!0})})}let pe=class{constructor(t){t&&this.set(t)}set(t,n,s){const r=this;function i(l,c,a){const f=Et(c);if(!f)throw new Error("header name must be a non-empty string");const h=p.findKey(r,f);(!h||r[h]===void 0||a===!0||a===void 0&&r[h]!==!1)&&(r[h||c]=nn(l))}const o=(l,c)=>p.forEach(l,(a,f)=>i(a,f,c));if(p.isPlainObject(t)||t instanceof this.constructor)o(t,n);else if(p.isString(t)&&(t=t.trim())&&!Vf(t))o(Hf(t),n);else if(p.isObject(t)&&p.isIterable(t)){let l={},c,a;for(const f of t){if(!p.isArray(f))throw TypeError("Object iterator must return a key-value pair");l[a=f[0]]=(c=l[a])?p.isArray(c)?[...c,f[1]]:[c,f[1]]:f[1]}o(l,n)}else t!=null&&i(n,t,s);return this}get(t,n){if(t=Et(t),t){const s=p.findKey(this,t);if(s){const r=this[s];if(!n)return r;if(n===!0)return $f(r);if(p.isFunction(n))return n.call(this,r,s);if(p.isRegExp(n))return n.exec(r);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Et(t),t){const s=p.findKey(this,t);return!!(s&&this[s]!==void 0&&(!n||qn(this,this[s],s,n)))}return!1}delete(t,n){const s=this;let r=!1;function i(o){if(o=Et(o),o){const l=p.findKey(s,o);l&&(!n||qn(s,s[l],l,n))&&(delete s[l],r=!0)}}return p.isArray(t)?t.forEach(i):i(t),r}clear(t){const n=Object.keys(this);let s=n.length,r=!1;for(;s--;){const i=n[s];(!t||qn(this,this[i],i,t,!0))&&(delete this[i],r=!0)}return r}normalize(t){const n=this,s={};return p.forEach(this,(r,i)=>{const o=p.findKey(s,i);if(o){n[o]=nn(r),delete n[i];return}const l=t?kf(i):String(i).trim();l!==i&&delete n[i],n[l]=nn(r),s[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return p.forEach(this,(s,r)=>{s!=null&&s!==!1&&(n[r]=t&&p.isArray(s)?s.join(", "):s)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const s=new this(t);return n.forEach(r=>s.set(r)),s}static accessor(t){const s=(this[xr]=this[xr]={accessors:{}}).accessors,r=this.prototype;function i(o){const l=Et(o);s[l]||(qf(r,o),s[l]=!0)}return p.isArray(t)?t.forEach(i):i(t),this}};pe.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);p.reduceDescriptors(pe.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(s){this[n]=s}}});p.freezeMethods(pe);function Kn(e,t){const n=this||kt,s=t||n,r=pe.from(s.headers);let i=s.data;return p.forEach(e,function(l){i=l.call(n,i,r.normalize(),t?t.status:void 0)}),r.normalize(),i}function Zi(e){return!!(e&&e.__CANCEL__)}function gt(e,t,n){L.call(this,e??"canceled",L.ERR_CANCELED,t,n),this.name="CanceledError"}p.inherits(gt,L,{__CANCEL__:!0});function Qi(e,t,n){const s=n.config.validateStatus;!n.status||!s||s(n.status)?e(n):t(new L("Request failed with status code "+n.status,[L.ERR_BAD_REQUEST,L.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function Kf(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Wf(e,t){e=e||10;const n=new Array(e),s=new Array(e);let r=0,i=0,o;return t=t!==void 0?t:1e3,function(c){const a=Date.now(),f=s[i];o||(o=a),n[r]=c,s[r]=a;let h=i,y=0;for(;h!==r;)y+=n[h++],h=h%e;if(r=(r+1)%e,r===i&&(i=(i+1)%e),a-o{n=f,r=null,i&&(clearTimeout(i),i=null),e(...a)};return[(...a)=>{const f=Date.now(),h=f-n;h>=s?o(a,f):(r=a,i||(i=setTimeout(()=>{i=null,o(r)},s-h)))},()=>r&&o(r)]}const an=(e,t,n=3)=>{let s=0;const r=Wf(50,250);return zf(i=>{const o=i.loaded,l=i.lengthComputable?i.total:void 0,c=o-s,a=r(c),f=o<=l;s=o;const h={loaded:o,total:l,progress:l?o/l:void 0,bytes:c,rate:a||void 0,estimated:a&&l&&f?(l-o)/a:void 0,event:i,lengthComputable:l!=null,[t?"download":"upload"]:!0};e(h)},n)},Sr=(e,t)=>{const n=e!=null;return[s=>t[0]({lengthComputable:n,total:e,loaded:s}),t[1]]},Er=e=>(...t)=>p.asap(()=>e(...t)),Jf=ne.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,ne.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(ne.origin),ne.navigator&&/(msie|trident)/i.test(ne.navigator.userAgent)):()=>!0,Gf=ne.hasStandardBrowserEnv?{write(e,t,n,s,r,i){const o=[e+"="+encodeURIComponent(t)];p.isNumber(n)&&o.push("expires="+new Date(n).toGMTString()),p.isString(s)&&o.push("path="+s),p.isString(r)&&o.push("domain="+r),i===!0&&o.push("secure"),document.cookie=o.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Xf(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Yf(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function eo(e,t,n){let s=!Xf(t);return e&&(s||n==!1)?Yf(e,t):t}const Rr=e=>e instanceof pe?{...e}:e;function rt(e,t){t=t||{};const n={};function s(a,f,h,y){return p.isPlainObject(a)&&p.isPlainObject(f)?p.merge.call({caseless:y},a,f):p.isPlainObject(f)?p.merge({},f):p.isArray(f)?f.slice():f}function r(a,f,h,y){if(p.isUndefined(f)){if(!p.isUndefined(a))return s(void 0,a,h,y)}else return s(a,f,h,y)}function i(a,f){if(!p.isUndefined(f))return s(void 0,f)}function o(a,f){if(p.isUndefined(f)){if(!p.isUndefined(a))return s(void 0,a)}else return s(void 0,f)}function l(a,f,h){if(h in t)return s(a,f);if(h in e)return s(void 0,a)}const c={url:i,method:i,data:i,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:l,headers:(a,f,h)=>r(Rr(a),Rr(f),h,!0)};return p.forEach(Object.keys({...e,...t}),function(f){const h=c[f]||r,y=h(e[f],t[f],f);p.isUndefined(y)&&h!==l||(n[f]=y)}),n}const to=e=>{const t=rt({},e);let{data:n,withXSRFToken:s,xsrfHeaderName:r,xsrfCookieName:i,headers:o,auth:l}=t;t.headers=o=pe.from(o),t.url=Gi(eo(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&o.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):"")));let c;if(p.isFormData(n)){if(ne.hasStandardBrowserEnv||ne.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if((c=o.getContentType())!==!1){const[a,...f]=c?c.split(";").map(h=>h.trim()).filter(Boolean):[];o.setContentType([a||"multipart/form-data",...f].join("; "))}}if(ne.hasStandardBrowserEnv&&(s&&p.isFunction(s)&&(s=s(t)),s||s!==!1&&Jf(t.url))){const a=r&&i&&Gf.read(i);a&&o.set(r,a)}return t},Zf=typeof XMLHttpRequest<"u",Qf=Zf&&function(e){return new Promise(function(n,s){const r=to(e);let i=r.data;const o=pe.from(r.headers).normalize();let{responseType:l,onUploadProgress:c,onDownloadProgress:a}=r,f,h,y,R,x;function T(){R&&R(),x&&x(),r.cancelToken&&r.cancelToken.unsubscribe(f),r.signal&&r.signal.removeEventListener("abort",f)}let C=new XMLHttpRequest;C.open(r.method.toUpperCase(),r.url,!0),C.timeout=r.timeout;function N(){if(!C)return;const j=pe.from("getAllResponseHeaders"in C&&C.getAllResponseHeaders()),B={data:!l||l==="text"||l==="json"?C.responseText:C.response,status:C.status,statusText:C.statusText,headers:j,config:e,request:C};Qi(function(Z){n(Z),T()},function(Z){s(Z),T()},B),C=null}"onloadend"in C?C.onloadend=N:C.onreadystatechange=function(){!C||C.readyState!==4||C.status===0&&!(C.responseURL&&C.responseURL.indexOf("file:")===0)||setTimeout(N)},C.onabort=function(){C&&(s(new L("Request aborted",L.ECONNABORTED,e,C)),C=null)},C.onerror=function(){s(new L("Network Error",L.ERR_NETWORK,e,C)),C=null},C.ontimeout=function(){let P=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const B=r.transitional||Xi;r.timeoutErrorMessage&&(P=r.timeoutErrorMessage),s(new L(P,B.clarifyTimeoutError?L.ETIMEDOUT:L.ECONNABORTED,e,C)),C=null},i===void 0&&o.setContentType(null),"setRequestHeader"in C&&p.forEach(o.toJSON(),function(P,B){C.setRequestHeader(B,P)}),p.isUndefined(r.withCredentials)||(C.withCredentials=!!r.withCredentials),l&&l!=="json"&&(C.responseType=r.responseType),a&&([y,x]=an(a,!0),C.addEventListener("progress",y)),c&&C.upload&&([h,R]=an(c),C.upload.addEventListener("progress",h),C.upload.addEventListener("loadend",R)),(r.cancelToken||r.signal)&&(f=j=>{C&&(s(!j||j.type?new gt(null,e,C):j),C.abort(),C=null)},r.cancelToken&&r.cancelToken.subscribe(f),r.signal&&(r.signal.aborted?f():r.signal.addEventListener("abort",f)));const M=Kf(r.url);if(M&&ne.protocols.indexOf(M)===-1){s(new L("Unsupported protocol "+M+":",L.ERR_BAD_REQUEST,e));return}C.send(i||null)})},eu=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let s=new AbortController,r;const i=function(a){if(!r){r=!0,l();const f=a instanceof Error?a:this.reason;s.abort(f instanceof L?f:new gt(f instanceof Error?f.message:f))}};let o=t&&setTimeout(()=>{o=null,i(new L(`timeout ${t} of ms exceeded`,L.ETIMEDOUT))},t);const l=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(a=>{a.unsubscribe?a.unsubscribe(i):a.removeEventListener("abort",i)}),e=null)};e.forEach(a=>a.addEventListener("abort",i));const{signal:c}=s;return c.unsubscribe=()=>p.asap(l),c}},tu=function*(e,t){let n=e.byteLength;if(n{const r=nu(e,t);let i=0,o,l=c=>{o||(o=!0,s&&s(c))};return new ReadableStream({async pull(c){try{const{done:a,value:f}=await r.next();if(a){l(),c.close();return}let h=f.byteLength;if(n){let y=i+=h;n(y)}c.enqueue(new Uint8Array(f))}catch(a){throw l(a),a}},cancel(c){return l(c),r.return()}},{highWaterMark:2})},Cn=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",no=Cn&&typeof ReadableStream=="function",ru=Cn&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),so=(e,...t)=>{try{return!!e(...t)}catch{return!1}},iu=no&&so(()=>{let e=!1;const t=new Request(ne.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),Or=64*1024,fs=no&&so(()=>p.isReadableStream(new Response("").body)),dn={stream:fs&&(e=>e.body)};Cn&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!dn[t]&&(dn[t]=p.isFunction(e[t])?n=>n[t]():(n,s)=>{throw new L(`Response type '${t}' is not supported`,L.ERR_NOT_SUPPORT,s)})})})(new Response);const ou=async e=>{if(e==null)return 0;if(p.isBlob(e))return e.size;if(p.isSpecCompliantForm(e))return(await new Request(ne.origin,{method:"POST",body:e}).arrayBuffer()).byteLength;if(p.isArrayBufferView(e)||p.isArrayBuffer(e))return e.byteLength;if(p.isURLSearchParams(e)&&(e=e+""),p.isString(e))return(await ru(e)).byteLength},lu=async(e,t)=>{const n=p.toFiniteNumber(e.getContentLength());return n??ou(t)},cu=Cn&&(async e=>{let{url:t,method:n,data:s,signal:r,cancelToken:i,timeout:o,onDownloadProgress:l,onUploadProgress:c,responseType:a,headers:f,withCredentials:h="same-origin",fetchOptions:y}=to(e);a=a?(a+"").toLowerCase():"text";let R=eu([r,i&&i.toAbortSignal()],o),x;const T=R&&R.unsubscribe&&(()=>{R.unsubscribe()});let C;try{if(c&&iu&&n!=="get"&&n!=="head"&&(C=await lu(f,s))!==0){let B=new Request(t,{method:"POST",body:s,duplex:"half"}),Q;if(p.isFormData(s)&&(Q=B.headers.get("content-type"))&&f.setContentType(Q),B.body){const[Z,me]=Sr(C,an(Er(c)));s=Tr(B.body,Or,Z,me)}}p.isString(h)||(h=h?"include":"omit");const N="credentials"in Request.prototype;x=new Request(t,{...y,signal:R,method:n.toUpperCase(),headers:f.normalize().toJSON(),body:s,duplex:"half",credentials:N?h:void 0});let M=await fetch(x,y);const j=fs&&(a==="stream"||a==="response");if(fs&&(l||j&&T)){const B={};["status","statusText","headers"].forEach(Je=>{B[Je]=M[Je]});const Q=p.toFiniteNumber(M.headers.get("content-length")),[Z,me]=l&&Sr(Q,an(Er(l),!0))||[];M=new Response(Tr(M.body,Or,Z,()=>{me&&me(),T&&T()}),B)}a=a||"text";let P=await dn[p.findKey(dn,a)||"text"](M,e);return!j&&T&&T(),await new Promise((B,Q)=>{Qi(B,Q,{data:P,headers:pe.from(M.headers),status:M.status,statusText:M.statusText,config:e,request:x})})}catch(N){throw T&&T(),N&&N.name==="TypeError"&&/Load failed|fetch/i.test(N.message)?Object.assign(new L("Network Error",L.ERR_NETWORK,e,x),{cause:N.cause||N}):L.from(N,N&&N.code,e,x)}}),us={http:Ef,xhr:Qf,fetch:cu};p.forEach(us,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Ar=e=>`- ${e}`,fu=e=>p.isFunction(e)||e===null||e===!1,ro={getAdapter:e=>{e=p.isArray(e)?e:[e];const{length:t}=e;let n,s;const r={};for(let i=0;i`adapter ${l} `+(c===!1?"is not supported by the environment":"is not available in the build"));let o=t?i.length>1?`since : +`+i.map(Ar).join(` +`):" "+Ar(i[0]):"as no adapter specified";throw new L("There is no suitable adapter to dispatch the request "+o,"ERR_NOT_SUPPORT")}return s},adapters:us};function Wn(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new gt(null,e)}function Cr(e){return Wn(e),e.headers=pe.from(e.headers),e.data=Kn.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ro.getAdapter(e.adapter||kt.adapter)(e).then(function(s){return Wn(e),s.data=Kn.call(e,e.transformResponse,s),s.headers=pe.from(s.headers),s},function(s){return Zi(s)||(Wn(e),s&&s.response&&(s.response.data=Kn.call(e,e.transformResponse,s.response),s.response.headers=pe.from(s.response.headers))),Promise.reject(s)})}const io="1.11.0",Pn={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Pn[e]=function(s){return typeof s===e||"a"+(t<1?"n ":" ")+e}});const Pr={};Pn.transitional=function(t,n,s){function r(i,o){return"[Axios v"+io+"] Transitional option '"+i+"'"+o+(s?". "+s:"")}return(i,o,l)=>{if(t===!1)throw new L(r(o," has been removed"+(n?" in "+n:"")),L.ERR_DEPRECATED);return n&&!Pr[o]&&(Pr[o]=!0,console.warn(r(o," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(i,o,l):!0}};Pn.spelling=function(t){return(n,s)=>(console.warn(`${s} is likely a misspelling of ${t}`),!0)};function uu(e,t,n){if(typeof e!="object")throw new L("options must be an object",L.ERR_BAD_OPTION_VALUE);const s=Object.keys(e);let r=s.length;for(;r-- >0;){const i=s[r],o=t[i];if(o){const l=e[i],c=l===void 0||o(l,i,e);if(c!==!0)throw new L("option "+i+" must be "+c,L.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new L("Unknown option "+i,L.ERR_BAD_OPTION)}}const sn={assertOptions:uu,validators:Pn},Pe=sn.validators;let st=class{constructor(t){this.defaults=t||{},this.interceptors={request:new wr,response:new wr}}async request(t,n){try{return await this._request(t,n)}catch(s){if(s instanceof Error){let r={};Error.captureStackTrace?Error.captureStackTrace(r):r=new Error;const i=r.stack?r.stack.replace(/^.+\n/,""):"";try{s.stack?i&&!String(s.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(s.stack+=` +`+i):s.stack=i}catch{}}throw s}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=rt(this.defaults,n);const{transitional:s,paramsSerializer:r,headers:i}=n;s!==void 0&&sn.assertOptions(s,{silentJSONParsing:Pe.transitional(Pe.boolean),forcedJSONParsing:Pe.transitional(Pe.boolean),clarifyTimeoutError:Pe.transitional(Pe.boolean)},!1),r!=null&&(p.isFunction(r)?n.paramsSerializer={serialize:r}:sn.assertOptions(r,{encode:Pe.function,serialize:Pe.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),sn.assertOptions(n,{baseUrl:Pe.spelling("baseURL"),withXsrfToken:Pe.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let o=i&&p.merge(i.common,i[n.method]);i&&p.forEach(["delete","get","head","post","put","patch","common"],x=>{delete i[x]}),n.headers=pe.concat(o,i);const l=[];let c=!0;this.interceptors.request.forEach(function(T){typeof T.runWhen=="function"&&T.runWhen(n)===!1||(c=c&&T.synchronous,l.unshift(T.fulfilled,T.rejected))});const a=[];this.interceptors.response.forEach(function(T){a.push(T.fulfilled,T.rejected)});let f,h=0,y;if(!c){const x=[Cr.bind(this),void 0];for(x.unshift(...l),x.push(...a),y=x.length,f=Promise.resolve(n);h{if(!s._listeners)return;let i=s._listeners.length;for(;i-- >0;)s._listeners[i](r);s._listeners=null}),this.promise.then=r=>{let i;const o=new Promise(l=>{s.subscribe(l),i=l}).then(r);return o.cancel=function(){s.unsubscribe(i)},o},t(function(i,o,l){s.reason||(s.reason=new gt(i,o,l),n(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=s=>{t.abort(s)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new oo(function(r){t=r}),cancel:t}}};function du(e){return function(n){return e.apply(null,n)}}function hu(e){return p.isObject(e)&&e.isAxiosError===!0}const as={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(as).forEach(([e,t])=>{as[t]=e});function lo(e){const t=new st(e),n=Ui(st.prototype.request,t);return p.extend(n,st.prototype,t,{allOwnKeys:!0}),p.extend(n,t,null,{allOwnKeys:!0}),n.create=function(r){return lo(rt(e,r))},n}const Y=lo(kt);Y.Axios=st;Y.CanceledError=gt;Y.CancelToken=au;Y.isCancel=Zi;Y.VERSION=io;Y.toFormData=An;Y.AxiosError=L;Y.Cancel=Y.CanceledError;Y.all=function(t){return Promise.all(t)};Y.spread=du;Y.isAxiosError=hu;Y.mergeConfig=rt;Y.AxiosHeaders=pe;Y.formToJSON=e=>Yi(p.isHTMLForm(e)?new FormData(e):e);Y.getAdapter=ro.getAdapter;Y.HttpStatusCode=as;Y.default=Y;const{Axios:Cu,AxiosError:Pu,CanceledError:vu,isCancel:Fu,CancelToken:Nu,VERSION:Du,all:Iu,Cancel:Mu,isAxiosError:Lu,spread:Uu,toFormData:ju,AxiosHeaders:Bu,HttpStatusCode:Hu,formToJSON:$u,getAdapter:Vu,mergeConfig:ku}=Y;export{_e as F,Y as a,xu as b,fc as c,bu as d,Go as e,Pi as f,gs as g,mu as h,Su as i,De as j,il as k,ec as l,tc as m,bs as n,ns as o,yu as p,Ru as q,_u as r,dl as s,Ro as t,wu as u,gu as v,Bn as w,Eu as x,ss as y,Tu as z}; diff --git a/assets/dist/index.html b/assets/dist/index.html new file mode 100644 index 0000000..9f780a0 --- /dev/null +++ b/assets/dist/index.html @@ -0,0 +1,17 @@ + + + + + + + File Upload to Telegram + + + + + + + +
+ + \ No newline at end of file diff --git a/assets/templates/files.tmpl b/assets/templates/files.tmpl index 8659c8a..a99df1e 100644 --- a/assets/templates/files.tmpl +++ b/assets/templates/files.tmpl @@ -1,6 +1,1061 @@ {{template "public/header" .}} -

上传文件到 Telegram

-
上传中...
+
+

📁 File Upload to Telegram

+

Secure, Fast, Permanent Storage

+ +
+
+
📤
+

Drag files here or click to select

+ + +
+ + + +
+ 📊 Multiple Files + 🔒 Secure + ⚡ Fast +
+
+ +
Uploading...
+
+ + + + + {{template "public/footer" .}} diff --git a/assets/templates/footer.tmpl b/assets/templates/footer.tmpl index ed91446..5bb8e97 100644 --- a/assets/templates/footer.tmpl +++ b/assets/templates/footer.tmpl @@ -3,7 +3,7 @@ function uploadFile(file) { var limit = 10 * 1024 * 1024; if (file.size <= limit) { - uploadImg(file, 1).then((url) => { + uploadImg(file, 1, file.name).then((url) => { // 处理上传成功的情况 console.log(url); }).catch((error) => { @@ -18,7 +18,7 @@ function uploadNextChunk() { if (start < file.size) { var chunk = file.slice(start, end); - return uploadImg(chunk, 0) + return uploadImg(chunk, 0, file.name) .then((url) => { // 处理上传成功的情况 temp = temp + '\n' + url.replace(/^\/d\//, ''); // 每次改变值都换行 @@ -47,7 +47,7 @@ // 将字符串转换为 Blob 对象 var blob = new Blob([temp], { type: 'text/plain' }); var fileAll = new File([blob], 'fileAll.txt', { type: 'text/plain' }); - return uploadImg(fileAll, 1); + return uploadImg(fileAll, 1, file.name); }) .catch((error) => { // 处理上传失败的情况 @@ -55,13 +55,14 @@ }); } } - function uploadImg(e, ms) { + function uploadImg(e, ms, fileName) { return new Promise((resolve, reject) => { var o = new FormData(); - o.append("image", e); + o.append("file", e); var isImage = e.type.startsWith('image/'); + var displayFileName = fileName || e.name || 'Unknown file'; $("#uploadButton").prop("disabled", !0); - $("#uploadButton").text("上传中"); + $("#uploadButton").text("Uploading"); $("#loading").show(); var a = window.location.protocol + "//" + window.location.hostname; "80" !== window.location.port && @@ -69,89 +70,124 @@ (a = a + ":" + window.location.port), $.ajax({ type: "POST", - url: a + "/api", + url: window.location.href.replace(/\/$/, "") + "/api", data: o, contentType: !1, processData: !1, success: function (e) { - var link = a + e.message; + + var link = window.location.href.replace(/\/$/, "") + e.message; + var proxyUrl = e.proxyUrl var t; if (e.code == 1) { if (ms) { + var shortLink = e.shortFileUrl ? window.location.href.replace(/\/$/, "") + e.shortUrl : ''; + var fileNameToShow = displayFileName; + if (isImage) { - t = $( - '
上传成功,图片外链:' + - link + - '
' - ); + var shortLinkHtml = shortLink ? + '
' + + '
' + fileNameToShow + '
' + + '' + + '
' : ''; + + t = $(shortLinkHtml); } else { - t = $( - '
上传成功,文件外链:' + - link + - "
" - ); + var shortLinkHtml = shortLink ? + '
' + + '
' + fileNameToShow + '
' + + '' + + '
' : ''; + + t = $(shortLinkHtml); } } resolve(e.message); } else { - var t = $('
上传失败(' + e.message + ')
'); - reject("上传失败(" + e.message + ")"); + var t = $('
Upload failed (' + e.message + ')
'); + reject("Upload failed (" + e.message + ")"); } $("#response").prepend(t); $("#uploadFile").val(""); $("#uploadFileLabel") - .text("选择文件") + .text("Choose Files") .css("background-color", "#007BFF"); + + // 重置上传按钮状态 + $("#uploadButton").prop("disabled", true); + $("#uploadButton").text("⬆️ Please select files first"); $(".copy-code").click(function () { var code = $(this).data("clipboard-text"); - var input = $(""); - $("body").append(input); - input.val(code).select(); - document.execCommand("copy"); - input.remove(); var copyButton = $(this); var originalText = copyButton.text(); - copyButton.text("复制成功"); - setTimeout(function () { - copyButton.text(originalText); - }, 1000); + + // 使用现代的 Clipboard API,如果不支持则回退到旧方法 + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(code).then(function() { + copyButton.text("Copied!").addClass("copied"); + setTimeout(function () { + copyButton.text(originalText).removeClass("copied"); + }, 1500); + }).catch(function() { + // 如果 Clipboard API 失败,使用旧方法 + fallbackCopy(code, copyButton, originalText); + }); + } else { + // 使用旧的复制方法 + fallbackCopy(code, copyButton, originalText); + } }); + + function fallbackCopy(text, button, originalText) { + var input = $(""); + $("body").append(input); + input.val(text).select(); + try { + document.execCommand("copy"); + button.text("Copied!").addClass("copied"); + setTimeout(function () { + button.text(originalText).removeClass("copied"); + }, 1500); + } catch (err) { + button.text("Copy failed"); + setTimeout(function () { + button.text(originalText); + }, 1500); + } + input.remove(); + } return e.message; }, error: function () { - var errorResponse = $('
上传失败
'); + var errorResponse = $('
Upload failed
'); $("#response").prepend(errorResponse); - reject("上传失败"); + reject("Upload failed"); }, complete: function () { - $("#uploadButton").prop("disabled", !1); - $("#uploadButton").text("上传"); + // 检查是否还有文件选中 + var input = document.getElementById("uploadFile"); + if (input.files.length > 0) { + $("#uploadButton").prop("disabled", false); + $("#uploadButton").text("⬆️ Start Upload"); + } else { + $("#uploadButton").prop("disabled", true); + $("#uploadButton").text("⬆️ Please select files first"); + } $("#loading").hide(); } }); }); } function readAndUploadFile(file) { - var reader = new FileReader(); - reader.onload = function (e) { - // e.target.result 包含读取的文件内容 - var fileContent = e.target.result; - // 调用上传文件的函数 - uploadFile(file, fileContent); - }; - // 以文本形式读取文件内容 - reader.readAsText(file); + // 直接调用上传文件的函数 + uploadFile(file); } document.addEventListener("paste", function (e) { for (var o = e.clipboardData.items, t = 0; t < o.length; t++) { @@ -160,8 +196,11 @@ -1 !== n.type.indexOf("image") && ((a = n.getAsFile()), $("#uploadFileLabel") - .text("已选择剪贴板文件") + .text("Clipboard file selected") .css("background-color", "#0056b3"), + // 启用上传按钮 + $("#uploadButton").prop("disabled", false), + $("#uploadButton").text("⬆️ Start Upload"), uploadFile(a)); } }), @@ -171,44 +210,23 @@ if (files.length > 0) { if (files.length === 1) { $("#uploadFileLabel") - .text("已选择文件: " + files[0].name) + .text("Selected: " + files[0].name) .css("background-color", "#0056b3"); } else { $("#uploadFileLabel") - .text("已选择多个文件") + .text("Selected " + files.length + " files") .css("background-color", "#0056b3"); } } else { $("#uploadFileLabel") - .text("选择文件") + .text("Choose Files") .css("background-color", "#007BFF"); } }); - $("#uploadButton").click(function () { - var input = document.getElementById("uploadFile"); - if (input.files.length > 0) { - for (var i = 0; i < input.files.length; i++) { - readAndUploadFile(input.files[i]); - } - } else { - alert("请选择一个文件"); - } - }); + // 上传按钮点击事件已在files.tmpl中处理,这里不再重复绑定 }); - - - + diff --git a/assets/templates/header.tmpl b/assets/templates/header.tmpl index c5dddb6..a853cfb 100644 --- a/assets/templates/header.tmpl +++ b/assets/templates/header.tmpl @@ -3,10 +3,10 @@ - tgState + File Upload to Telegram - + content="telegram file upload,tg file storage,free file hosting,permanent file storage,file sharing,free file links,telegram cloud,file upload service" /> + diff --git a/frontend/src/components/FileUpload.vue b/frontend/src/components/FileUpload.vue new file mode 100644 index 0000000..21c5b0a --- /dev/null +++ b/frontend/src/components/FileUpload.vue @@ -0,0 +1,651 @@ + + + diff --git a/frontend/src/components/GiscusComments.vue b/frontend/src/components/GiscusComments.vue new file mode 100644 index 0000000..a7850cc --- /dev/null +++ b/frontend/src/components/GiscusComments.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/HistoryModal.vue b/frontend/src/components/HistoryModal.vue new file mode 100644 index 0000000..58cf926 --- /dev/null +++ b/frontend/src/components/HistoryModal.vue @@ -0,0 +1,277 @@ + + + diff --git a/frontend/src/components/ui/Button.vue b/frontend/src/components/ui/Button.vue new file mode 100644 index 0000000..356757b --- /dev/null +++ b/frontend/src/components/ui/Button.vue @@ -0,0 +1,62 @@ + + + diff --git a/frontend/src/components/ui/Card.vue b/frontend/src/components/ui/Card.vue new file mode 100644 index 0000000..aaf59f9 --- /dev/null +++ b/frontend/src/components/ui/Card.vue @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/ui/Progress.vue b/frontend/src/components/ui/Progress.vue new file mode 100644 index 0000000..5b79aed --- /dev/null +++ b/frontend/src/components/ui/Progress.vue @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/frontend/src/config/giscus.ts b/frontend/src/config/giscus.ts new file mode 100644 index 0000000..fc95976 --- /dev/null +++ b/frontend/src/config/giscus.ts @@ -0,0 +1,49 @@ +// Giscus 评论系统配置 +export const giscusConfig = { + // 你的 GitHub 仓库,格式:用户名/仓库名 + repo: import.meta.env.VITE_GISCUS_REPO || 'your-username/repo', + + // 仓库 ID (从 giscus.app 获取) + repoId: import.meta.env.VITE_GISCUS_REPO_ID, + + // Discussion 分类 (从 giscus.app 获取) + category: import.meta.env.VITE_GISCUS_CATEGORY || "General", + + // Discussion 分类 ID (从 giscus.app 获取) + categoryId: import.meta.env.VITE_GISCUS_CATEGORY_ID || "DIC_kwDONBiMHM4CuNL-", + + // 页面 ↔️ discussion 映射关系 + mapping: (import.meta.env.VITE_GISCUS_MAPPING || "pathname") as + | "pathname" + | "url" + | "title" + | "og:title", + + // 是否启用严格标题匹配 + strict: import.meta.env.VITE_GISCUS_STRICT === "true", + + // 是否启用 reactions + reactionsEnabled: import.meta.env.VITE_GISCUS_REACTIONS_ENABLED !== "false", + + // 是否发出 reactions + emitMetadata: import.meta.env.VITE_GISCUS_EMIT_METADATA === "true", + + // 输入框位置 + inputPosition: (import.meta.env.VITE_GISCUS_INPUT_POSITION || "top") as + | "top" + | "bottom", + + // 主题 + theme: (import.meta.env.VITE_GISCUS_THEME || "light") as + | "light" + | "dark" + | "preferred_color_scheme" + | "transparent_dark" + | "dark_dimmed", + + // 语言 + lang: (import.meta.env.VITE_GISCUS_LANG || "en") as string, + + // 是否启用评论系统 + enabled: import.meta.env.VITE_GISCUS_ENABLED !== "false", +}; diff --git a/frontend/src/lib/fingerprint.ts b/frontend/src/lib/fingerprint.ts new file mode 100644 index 0000000..62d57db --- /dev/null +++ b/frontend/src/lib/fingerprint.ts @@ -0,0 +1,65 @@ +import FingerprintJS from "@fingerprintjs/fingerprintjs"; + +// FingerprintJS 实例缓存 +let fpInstance: any = null; + +// 初始化 FingerprintJS +async function initFingerprint() { + if (!fpInstance) { + fpInstance = await FingerprintJS.load(); + } + return fpInstance; +} + +// 生成指纹哈希 +export async function generateFingerprintHash(): Promise { + try { + const fp = await initFingerprint(); + const result = await fp.get(); + return result.visitorId; + } catch (error) { + console.warn("FingerprintJS failed, falling back to simple hash:", error); + // 降级方案:使用简单的浏览器信息生成哈希 + return await generateFallbackHash(); + } +} + +// 降级方案:简单的指纹生成 +async function generateFallbackHash(): Promise { + const data = { + userAgent: navigator.userAgent, + language: navigator.language, + screenResolution: `${screen.width}x${screen.height}`, + timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, + colorDepth: screen.colorDepth, + pixelRatio: window.devicePixelRatio, + cookieEnabled: navigator.cookieEnabled, + }; + + const dataString = JSON.stringify(data); + const encoder = new TextEncoder(); + const dataBuffer = encoder.encode(dataString); + const hashBuffer = await crypto.subtle.digest("SHA-256", dataBuffer); + const hashArray = Array.from(new Uint8Array(hashBuffer)); + const hashHex = hashArray + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + + return hashHex; +} + +// 获取或生成用户指纹ID +export async function getUserFingerprintId(): Promise { + const storageKey = "tgstate_user_fingerprint"; + + // 尝试从localStorage获取已存储的指纹 + let fingerprintId = localStorage.getItem(storageKey); + + if (!fingerprintId) { + // 生成新的指纹ID + fingerprintId = await generateFingerprintHash(); + localStorage.setItem(storageKey, fingerprintId); + } + + return fingerprintId; +} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts new file mode 100644 index 0000000..9bc3a1b --- /dev/null +++ b/frontend/src/lib/utils.ts @@ -0,0 +1,63 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} + +export function formatFileSize(bytes: number): string { + if (bytes === 0) return '0 Bytes' + + const k = 1024 + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] +} + +export function formatSpeed(bytesPerSecond: number): string { + return formatFileSize(bytesPerSecond) + '/s' +} + +export function formatTime(seconds: number): string { + if (seconds < 60) { + return `${Math.round(seconds)}s` + } else if (seconds < 3600) { + const minutes = Math.floor(seconds / 60) + const remainingSeconds = Math.round(seconds % 60) + return `${minutes}m ${remainingSeconds}s` + } else { + const hours = Math.floor(seconds / 3600) + const minutes = Math.floor((seconds % 3600) / 60) + return `${hours}h ${minutes}m` + } +} + +export function generateUploadId(): string { + return Date.now().toString(36) + Math.random().toString(36).substr(2) +} + +export async function copyToClipboard(text: string): Promise { + try { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(text) + return true + } else { + // Fallback for older browsers + const textArea = document.createElement('textarea') + textArea.value = text + textArea.style.position = 'fixed' + textArea.style.left = '-999999px' + textArea.style.top = '-999999px' + document.body.appendChild(textArea) + textArea.focus() + textArea.select() + const result = document.execCommand('copy') + textArea.remove() + return result + } + } catch (err) { + console.error('Failed to copy text: ', err) + return false + } +} \ No newline at end of file diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..5a6e246 --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') \ No newline at end of file diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts new file mode 100644 index 0000000..24544c7 --- /dev/null +++ b/frontend/src/services/api.ts @@ -0,0 +1,146 @@ +import axios from "axios"; + +export interface UploadResponse { + code: number; + message: string; + imgUrl?: string; + proxyUrl?: string; + shortUrl?: string; + shortFileUrl?: string; + name?: string; + chunkId?: string; +} + +export interface MergeRequest { + uploadId: string; + fileName: string; + chunkIds: string[]; + fileSize: number; +} + +export interface FileRecord { + fileId: string; + filename: string; + ip: string; + time: string; + userFingerprint?: string; + shared: boolean; +} + +export interface PaginationInfo { + page: number; + pageSize: number; + total: number; + hasMore: boolean; +} + +export interface HistoryResponse { + code: number; + message: string; + data?: { + files: FileRecord[]; + pagination: PaginationInfo; + }; +} + +const api = axios.create({ + baseURL: "/", + timeout: 60000 * 60, +}); + +export const uploadFile = async ( + file: File, + userFingerprint?: string, + shared?: boolean, + onProgress?: (progress: number) => void +): Promise => { + const formData = new FormData(); + formData.append("file", file); + if (userFingerprint) { + formData.append("userFingerprint", userFingerprint); + } + if (shared !== undefined) { + formData.append("shared", shared.toString()); + } + + const response = await api.post("/api", formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + onUploadProgress: (progressEvent) => { + if (progressEvent.total && onProgress) { + const progress = (progressEvent.loaded / progressEvent.total) * 100; + onProgress(progress); + } + }, + }); + + return response.data; +}; + +export const uploadChunk = async ( + chunk: Blob, + chunkIndex: number, + uploadId: string, + fileName: string, + userFingerprint?: string, + onProgress?: (progress: number) => void +): Promise => { + const formData = new FormData(); + formData.append("file", chunk, `${fileName}.chunk.${chunkIndex}`); + formData.append("chunkIndex", chunkIndex.toString()); + formData.append("uploadId", uploadId); + formData.append("fileName", fileName); + if (userFingerprint) { + formData.append("userFingerprint", userFingerprint); + } + + const response = await api.post("/api/chunk", formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + onUploadProgress: (progressEvent) => { + if (progressEvent.total && onProgress) { + const progress = (progressEvent.loaded / progressEvent.total) * 100; + onProgress(progress); + } + }, + }); + + return response.data; +}; + +export const mergeChunks = async ( + request: MergeRequest & { userFingerprint?: string; shared?: boolean } +): Promise => { + const response = await api.post("/api/merge", request, { + headers: { + "Content-Type": "application/json", + }, + }); + + return response.data; +}; + +// 获取用户历史文件 +export const getUserHistory = async ( + userFingerprint: string, + page = 1, + pageSize = 20 +): Promise => { + const response = await api.get( + `/api/history?fingerprint=${encodeURIComponent(userFingerprint)}&page=${page}&pageSize=${pageSize}` + ); + return response.data; +}; + +// 获取广场文件 +export const getPlazaFiles = async ( + page = 1, + pageSize = 20 +): Promise => { + const response = await api.get( + `/api/plaza?page=${page}&pageSize=${pageSize}` + ); + return response.data; +}; diff --git a/frontend/src/style.css b/frontend/src/style.css new file mode 100644 index 0000000..e27c680 --- /dev/null +++ b/frontend/src/style.css @@ -0,0 +1,59 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --primary: 221.2 83.2% 53.3%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96%; + --secondary-foreground: 222.2 84% 4.9%; + --muted: 210 40% 96%; + --muted-foreground: 215.4 16.3% 46.9%; + --accent: 210 40% 96%; + --accent-foreground: 222.2 84% 4.9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 221.2 83.2% 53.3%; + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 217.2 91.2% 59.8%; + --primary-foreground: 222.2 84% 4.9%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 224.3 76.3% 94.1%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 0000000..daa2258 --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1,20 @@ +/// + +interface ImportMetaEnv { + readonly VITE_GISCUS_REPO: string + readonly VITE_GISCUS_REPO_ID: string + readonly VITE_GISCUS_CATEGORY: string + readonly VITE_GISCUS_CATEGORY_ID: string + readonly VITE_GISCUS_MAPPING: string + readonly VITE_GISCUS_STRICT: string + readonly VITE_GISCUS_REACTIONS_ENABLED: string + readonly VITE_GISCUS_EMIT_METADATA: string + readonly VITE_GISCUS_INPUT_POSITION: string + readonly VITE_GISCUS_THEME: string + readonly VITE_GISCUS_LANG: string + readonly VITE_GISCUS_ENABLED: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} \ No newline at end of file diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..615c9b7 --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,77 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: ["class"], + content: [ + './pages/**/*.{ts,tsx,vue}', + './components/**/*.{ts,tsx,vue}', + './app/**/*.{ts,tsx,vue}', + './src/**/*.{ts,tsx,vue}', + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +} \ No newline at end of file diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..4311465 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + /* Path mapping */ + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "types": ["vite/client"], + "references": [{ "path": "./tsconfig.node.json" }] +} \ No newline at end of file diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..099658c --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} \ No newline at end of file diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..864cecd --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,50 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' + +export default defineConfig({ + plugins: [ + vue({ + script: { + defineModel: true, + propsDestructure: true + } + }) + ], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + server: { + proxy: { + '/api': { + target: 'http://localhost:8088', + changeOrigin: true, + }, + '/d/': { + target: 'http://localhost:8088', + changeOrigin: true, + }, + '/s/': { + target: 'http://localhost:8088', + changeOrigin: true, + } + } + }, + build: { + outDir: '../assets/dist', + emptyOutDir: true, + rollupOptions: { + output: { + manualChunks: { + vendor: ['vue', 'axios'], + ui: ['lucide-vue-next'] + } + } + } + }, + esbuild: { + target: 'es2020' + } +}) \ No newline at end of file diff --git a/go.mod b/go.mod index c744d82..b8a8b53 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,9 @@ module csz.net/tgstate go 1.20 -require github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 +require ( + github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 + github.com/joho/godotenv v1.5.1 +) + +require github.com/mattn/go-sqlite3 v1.14.24 // indirect diff --git a/go.sum b/go.sum index db8e45c..d010c00 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,6 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= diff --git a/main.go b/main.go index 1191006..ef234e7 100644 --- a/main.go +++ b/main.go @@ -3,10 +3,13 @@ package main import ( "flag" "fmt" + "log" "net" "net/http" "os" + "github.com/joho/godotenv" + "csz.net/tgstate/conf" "csz.net/tgstate/control" "csz.net/tgstate/utils" @@ -21,38 +24,77 @@ func main() { fmt.Println("请先设置Bot Token和对象") return } + + // 验证 Bot 配置 + if err := utils.ValidateBotConfig(); err != nil { + log.Printf("Bot 配置验证失败: %v", err) + fmt.Println("\n请检查以下配置:") + fmt.Printf("1. Bot Token: %s\n", maskToken(conf.BotToken)) + fmt.Printf("2. 频道名称: %s\n", conf.ChannelName) + fmt.Println("\n常见问题解决方案:") + fmt.Println("- 确保 Bot Token 正确且有效") + fmt.Println("- 确保频道名称格式正确 (如: @channelname 或 -1001234567890)") + fmt.Println("- 确保 Bot 已被添加到频道并具有管理员权限") + fmt.Println("- 确保 Bot 有发送消息的权限") + return + } + go utils.BotDo() web() } +// maskToken 遮蔽 Token 的敏感部分 +func maskToken(token string) string { + if len(token) < 10 { + return "***" + } + return token[:10] + "***" + token[len(token)-4:] +} + func web() { http.HandleFunc(conf.FileRoute, control.D) + http.HandleFunc("/s/", control.S) // 短链路由 if OptApi { if conf.Pass != "" && conf.Pass != "none" { http.HandleFunc("/pwd", control.Pwd) } - http.HandleFunc("/api", control.Middleware(control.UploadImageAPI)) + http.HandleFunc("/api", control.Middleware(control.UploadAPI)) + http.HandleFunc("/api/chunk", control.Middleware(control.ChunkUploadAPI)) + http.HandleFunc("/api/merge", control.Middleware(control.MergeChunksAPI)) + http.HandleFunc("/api/history", control.HistoryAPI) + http.HandleFunc("/api/plaza", control.PlazaAPI) + http.HandleFunc("/files", control.Middleware(control.FilesAPI)) + http.HandleFunc("/shortlinks", control.Middleware(control.ShortLinksAPI)) + + // 静态文件服务 + http.HandleFunc("/assets/", control.ServeDistFiles) + http.HandleFunc("/", control.Middleware(control.Index)) } if listener, err := net.Listen("tcp", ":"+webPort); err != nil { - fmt.Printf("端口 %s 已被占用\n", webPort) + log.Fatalf("端口 %s 已被占用\n", webPort) } else { defer listener.Close() - fmt.Printf("启动Web服务器,监听端口 %s\n", webPort) + log.Printf("Http server start at %s\n", webPort) if err := http.Serve(listener, nil); err != nil { - fmt.Println(err) + log.Fatal(err) } } } func init() { + _ = godotenv.Load() + flag.StringVar(&webPort, "port", "8088", "Web Port") flag.StringVar(&conf.BotToken, "token", os.Getenv("token"), "Bot Token") flag.StringVar(&conf.ChannelName, "target", os.Getenv("target"), "Channel Name or ID") flag.StringVar(&conf.Pass, "pass", os.Getenv("pass"), "Visit Password") + flag.StringVar(&conf.ApiPass, "apiPass", os.Getenv("apiPass"), "API Visit Password") flag.StringVar(&conf.Mode, "mode", os.Getenv("mode"), "Run mode") flag.StringVar(&conf.BaseUrl, "url", os.Getenv("url"), "Base Url") + flag.StringVar(&conf.AllowedExts, "exts", os.Getenv("exts"), "Allowed Exts") + flag.StringVar(&conf.ProxyUrl, "proxyUrl", os.Getenv("proxyUrl"), "proxy url") flag.Parse() if conf.Mode == "m" { OptApi = false @@ -60,4 +102,9 @@ func init() { if conf.Mode != "p" && conf.Mode != "m" { conf.Mode = "p" } + _, err := control.InitDB() + if err != nil { + log.Fatal(err) + } + } diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..07bba58 --- /dev/null +++ b/start.sh @@ -0,0 +1,446 @@ +#!/bin/bash + +# TGState 启动脚本 +# 用于启动 Telegram 文件存储服务 + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 日志函数 +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_debug() { + echo -e "${BLUE}[DEBUG]${NC} $1" +} + +# 默认配置 +DEFAULT_PORT="8088" +DEFAULT_MODE="p" +BINARY_NAME="tgstate" +PID_FILE="tgstate.pid" + +# 显示帮助信息 +show_help() { + echo "TGState 启动脚本" + echo "" + echo "用法: $0 [选项]" + echo "" + echo "选项:" + echo " -p, --port PORT 设置Web端口 (默认: $DEFAULT_PORT)" + echo " -m, --mode MODE 运行模式 (p=完整模式, m=最小模式) (默认: $DEFAULT_MODE)" + echo " -d, --daemon 后台运行" + echo " -s, --stop 停止服务" + echo " -r, --restart 重启服务" + echo " -t, --status 查看服务状态" + echo " -l, --logs 查看日志" + echo " -h, --help 显示此帮助信息" + echo "" + echo "环境变量 (可在 .env 文件中设置):" + echo " token - Telegram Bot Token" + echo " target - 目标频道名称或ID" + echo " pass - 访问密码" + echo " apiPass - API访问密码" + echo " url - 基础URL" + echo " proxyUrl - 代理URL" + echo " exts - 允许的文件扩展名" +} + +# 检查依赖 +check_dependencies() { + log_info "检查依赖..." + + # 检查 Go 是否安装 + if ! command -v go &> /dev/null; then + log_error "Go 未安装,请先安装 Go" + exit 1 + fi + + # 检查网络工具 + if ! command -v netstat &> /dev/null && ! command -v ss &> /dev/null; then + log_warn "未找到 netstat 或 ss 命令,端口检查功能可能受限" + fi + + # 检查 .env 文件 + if [ ! -f ".env" ]; then + log_warn ".env 文件不存在,将使用命令行参数或默认值" + fi + + log_info "依赖检查完成" +} + +# 获取端口占用进程信息 +get_port_process() { + local port=$1 + + if command -v lsof &> /dev/null; then + lsof -ti:$port 2>/dev/null + elif command -v ss &> /dev/null; then + ss -tulpn | grep ":$port " | awk -F',' '{print $2}' | awk -F'=' '{print $2}' | head -1 + elif command -v netstat &> /dev/null; then + netstat -tulpn 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f1 | head -1 + else + echo "" + fi +} + +# 检查端口是否被占用 +is_port_occupied() { + local port=$1 + + if command -v ss &> /dev/null; then + ss -tuln | grep -q ":$port " + elif command -v netstat &> /dev/null; then + netstat -tuln 2>/dev/null | grep -q ":$port " + else + # 尝试连接端口来检查 + (echo >/dev/tcp/localhost/$port) &>/dev/null + fi +} + +# 构建项目 +build_project() { + log_info "构建项目..." + + if [ ! -f "go.mod" ]; then + log_error "go.mod 文件不存在,请确保在项目根目录运行此脚本" + exit 1 + fi + + # 下载依赖 + go mod tidy + + # 构建二进制文件 + go build -o $BINARY_NAME . + + if [ $? -eq 0 ]; then + log_info "构建成功" + else + log_error "构建失败" + exit 1 + fi +} + +# 检查服务状态 +check_status() { + if [ -f "$PID_FILE" ]; then + PID=$(cat $PID_FILE) + if ps -p $PID > /dev/null 2>&1; then + return 0 # 服务正在运行 + else + rm -f $PID_FILE + return 1 # PID文件存在但进程不存在 + fi + else + return 1 # PID文件不存在 + fi +} + +# 停止服务 +stop_service() { + log_info "停止服务..." + + if check_status; then + PID=$(cat $PID_FILE) + kill $PID + + # 等待进程结束 + for i in {1..10}; do + if ! ps -p $PID > /dev/null 2>&1; then + break + fi + sleep 1 + done + + # 如果进程仍在运行,强制杀死 + if ps -p $PID > /dev/null 2>&1; then + log_warn "强制停止服务..." + kill -9 $PID + fi + + rm -f $PID_FILE + log_info "服务已停止" + else + log_warn "服务未运行" + fi +} + +# 启动服务 +start_service() { + local port=$1 + local mode=$2 + local daemon=$3 + + log_info "启动服务..." + + # 检查服务是否已在运行 + if check_status; then + log_error "服务已在运行 (PID: $(cat $PID_FILE))" + exit 1 + fi + + # 检查端口是否被占用 + if is_port_occupied $port; then + log_warn "端口 $port 已被占用" + + # 查找占用端口的进程 + PROCESS_PID=$(get_port_process $port) + + if [ ! -z "$PROCESS_PID" ] && [ "$PROCESS_PID" != "0" ]; then + # 获取进程详细信息 + if command -v ps &> /dev/null; then + PROCESS_DETAILS=$(ps -p $PROCESS_PID -o pid,ppid,user,cmd --no-headers 2>/dev/null) + if [ ! -z "$PROCESS_DETAILS" ]; then + log_info "占用端口 $port 的进程信息:" + echo " PID PPID USER COMMAND" + echo " $PROCESS_DETAILS" + else + log_info "占用端口 $port 的进程 PID: $PROCESS_PID" + fi + else + log_info "占用端口 $port 的进程 PID: $PROCESS_PID" + fi + + echo "" + echo -n "是否强制结束占用端口 $port 的进程并继续启动? [y/N]: " + read -r response + case "$response" in + [yY][eE][sS]|[yY]) + log_info "正在结束占用端口的进程 (PID: $PROCESS_PID)..." + + # 首先尝试优雅地结束进程 + if kill $PROCESS_PID 2>/dev/null; then + log_debug "发送 TERM 信号到进程 $PROCESS_PID" + + # 等待进程结束 + for i in {1..8}; do + if ! is_port_occupied $port; then + log_info "端口 $port 已释放" + break + fi + sleep 1 + log_debug "等待进程结束... ($i/8)" + done + + # 如果端口仍被占用,强制杀死进程 + if is_port_occupied $port; then + log_warn "正在强制结束进程 (PID: $PROCESS_PID)..." + if kill -9 $PROCESS_PID 2>/dev/null; then + sleep 2 + + if is_port_occupied $port; then + log_error "无法释放端口 $port,进程可能无法被终止" + exit 1 + else + log_info "端口 $port 已强制释放" + fi + else + log_error "无法强制结束进程 $PROCESS_PID" + exit 1 + fi + fi + else + log_error "无法发送信号到进程 $PROCESS_PID,可能权限不足" + exit 1 + fi + ;; + *) + log_info "用户取消操作" + exit 1 + ;; + esac + else + # 无法获取进程信息,但端口确实被占用 + log_warn "无法获取占用端口 $port 的进程信息" + + # 显示端口占用情况 + if command -v ss &> /dev/null; then + PORT_INFO=$(ss -tulpn | grep ":$port ") + if [ ! -z "$PORT_INFO" ]; then + log_info "端口占用详情:" + echo "$PORT_INFO" + fi + elif command -v netstat &> /dev/null; then + PORT_INFO=$(netstat -tulpn 2>/dev/null | grep ":$port ") + if [ ! -z "$PORT_INFO" ]; then + log_info "端口占用详情:" + echo "$PORT_INFO" + fi + fi + + echo "" + echo -n "端口 $port 已被占用但无法获取进程信息,是否继续启动? (可能会失败) [y/N]: " + read -r response + case "$response" in + [yY][eE][sS]|[yY]) + log_warn "用户选择继续启动,启动可能会失败" + ;; + *) + log_info "用户取消操作" + exit 1 + ;; + esac + fi + fi + + # 构建项目 + build_project + + # 准备启动参数 + ARGS="-port $port -mode $mode" + + if [ "$daemon" = true ]; then + # 后台运行 + log_info "以守护进程模式启动服务 (端口: $port, 模式: $mode)" + nohup ./$BINARY_NAME $ARGS > tgstate.log 2>&1 & + echo $! > $PID_FILE + log_info "服务已启动 (PID: $!)" + log_info "日志文件: tgstate.log" + else + # 前台运行 + log_info "启动服务 (端口: $port, 模式: $mode)" + ./$BINARY_NAME $ARGS + fi +} + +# 查看服务状态 +show_status() { + if check_status; then + PID=$(cat $PID_FILE) + log_info "服务正在运行 (PID: $PID)" + + # 显示端口信息 + if command -v netstat &> /dev/null; then + PORTS=$(netstat -tuln 2>/dev/null | grep $PID 2>/dev/null | awk '{print $4}' | cut -d: -f2 | sort -u) + if [ ! -z "$PORTS" ]; then + log_info "监听端口: $PORTS" + fi + fi + + # 显示内存使用情况 + if command -v ps &> /dev/null; then + MEMORY=$(ps -p $PID -o rss= 2>/dev/null | awk '{print int($1/1024)"MB"}') + if [ ! -z "$MEMORY" ]; then + log_info "内存使用: $MEMORY" + fi + fi + else + log_warn "服务未运行" + fi +} + +# 查看日志 +show_logs() { + if [ -f "tgstate.log" ]; then + tail -f tgstate.log + else + log_error "日志文件不存在" + exit 1 + fi +} + +# 重启服务 +restart_service() { + local port=$1 + local mode=$2 + + log_info "重启服务..." + stop_service + sleep 2 + start_service $port $mode true +} + +# 主函数 +main() { + local port=$DEFAULT_PORT + local mode=$DEFAULT_MODE + local daemon=false + local action="start" + + # 解析命令行参数 + while [[ $# -gt 0 ]]; do + case $1 in + -p|--port) + port="$2" + shift 2 + ;; + -m|--mode) + mode="$2" + shift 2 + ;; + -d|--daemon) + daemon=true + shift + ;; + -s|--stop) + action="stop" + shift + ;; + -r|--restart) + action="restart" + shift + ;; + -t|--status) + action="status" + shift + ;; + -l|--logs) + action="logs" + shift + ;; + -h|--help) + show_help + exit 0 + ;; + *) + log_error "未知参数: $1" + show_help + exit 1 + ;; + esac + done + + # 检查依赖 + check_dependencies + + # 执行相应操作 + case $action in + start) + start_service $port $mode $daemon + ;; + stop) + stop_service + ;; + restart) + restart_service $port $mode + ;; + status) + show_status + ;; + logs) + show_logs + ;; + *) + log_error "未知操作: $action" + exit 1 + ;; + esac +} + +# 脚本入口 +main "$@" \ No newline at end of file diff --git a/test_chunked_upload.html b/test_chunked_upload.html new file mode 100644 index 0000000..e69de29 diff --git a/utils/utils.go b/utils/utils.go index b64731b..3e79599 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,9 +1,12 @@ package utils import ( + "crypto/rand" "encoding/json" + "fmt" "io" "log" + "math/big" "strconv" "strings" @@ -11,6 +14,32 @@ import ( tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) +// ValidateBotConfig 验证 Bot 配置 +func ValidateBotConfig() error { + if conf.BotToken == "" { + return fmt.Errorf("bot token 未配置") + } + + if conf.ChannelName == "" { + return fmt.Errorf("频道名称未配置") + } + + // 测试 Bot Token 是否有效 + bot, err := tgbotapi.NewBotAPI(conf.BotToken) + if err != nil { + return fmt.Errorf("bot token 无效: %v", err) + } + + // 获取 Bot 信息 + me, err := bot.GetMe() + if err != nil { + return fmt.Errorf("无法获取 bot 信息: %v", err) + } + + log.Printf("Bot 配置验证成功: @%s (%s)", me.UserName, me.FirstName) + return nil +} + func TgFileData(fileName string, fileData io.Reader) tgbotapi.FileReader { return tgbotapi.FileReader{ Name: fileName, @@ -21,9 +50,18 @@ func TgFileData(fileName string, fileData io.Reader) tgbotapi.FileReader { func UpDocument(fileData tgbotapi.FileReader) string { bot, err := tgbotapi.NewBotAPI(conf.BotToken) if err != nil { - log.Println(err) + log.Printf("创建 Bot API 实例失败: %v", err) + return "" + } + + // 验证配置 + if conf.ChannelName == "" { + log.Println("错误: 频道名称未配置") return "" } + + log.Printf("正在上传文件 '%s' 到频道 '%s'", fileData.Name, conf.ChannelName) + // Upload the file to Telegram params := tgbotapi.Params{ "chat_id": conf.ChannelName, // Replace with the chat ID where you want to send the file @@ -36,28 +74,47 @@ func UpDocument(fileData tgbotapi.FileReader) string { } response, err := bot.UploadFiles("sendDocument", params, files) if err != nil { - log.Panic(err) + log.Printf("上传文件到 Telegram 失败: %v", err) + log.Printf("请检查: 1) Bot Token 是否正确 2) 频道名称 '%s' 是否正确 3) Bot 是否已添加到频道并有发送权限", conf.ChannelName) + return "" } var msg tgbotapi.Message - json.Unmarshal([]byte(response.Result), &msg) + if err := json.Unmarshal([]byte(response.Result), &msg); err != nil { + log.Printf("解析 Telegram 响应失败: %v", err) + log.Printf("响应内容: %s", response.Result) + return "" + } + var resp string switch { case msg.Document != nil: resp = msg.Document.FileID + log.Printf("文档上传成功,FileID: %s", resp) case msg.Audio != nil: resp = msg.Audio.FileID + log.Printf("音频上传成功,FileID: %s", resp) case msg.Video != nil: resp = msg.Video.FileID + log.Printf("视频上传成功,FileID: %s", resp) case msg.Sticker != nil: resp = msg.Sticker.FileID + log.Printf("贴纸上传成功,FileID: %s", resp) + default: + log.Println("警告: 无法识别上传的文件类型") + } + + if resp == "" { + log.Println("错误: 未能获取文件ID") } + return resp } func GetDownloadUrl(fileID string) (string, bool) { bot, err := tgbotapi.NewBotAPI(conf.BotToken) if err != nil { - log.Panic(err) + log.Printf("创建 Bot API 实例失败: %v", err) + return "", false } // 使用 getFile 方法获取文件信息 file, err := bot.GetFile(tgbotapi.FileConfig{FileID: fileID}) @@ -112,3 +169,39 @@ func BotDo() { } } } + +// GenerateShortCode 生成短链码 +func GenerateShortCode(length int) string { + const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + result := make([]byte, length) + + for i := range result { + num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(charset)))) + result[i] = charset[num.Int64()] + } + + return string(result) +} + +// CreateMergedFile 创建合并文件的元数据 +func CreateMergedFile(fileName string, chunkIds []string, fileSize int64) string { + // 创建合并文件的元数据内容 + content := fmt.Sprintf("tgstate-blob\n%s\nsize%d\n", fileName, fileSize) + + // 添加所有分片ID + for _, chunkId := range chunkIds { + content += chunkId + "\n" + } + + // 将元数据作为文件上传到Telegram + fileData := TgFileData("blob", strings.NewReader(content)) + mergedFileId := UpDocument(fileData) + + if mergedFileId != "" { + log.Printf("合并文件元数据创建成功: %s, FileID: %s", fileName, mergedFileId) + } else { + log.Printf("合并文件元数据创建失败: %s", fileName) + } + + return mergedFileId +}