From 26a44e64bd66feacb42adbd370cb27bde1342df2 Mon Sep 17 00:00:00 2001 From: lbl <1791778603@qq.com> Date: Sat, 22 Aug 2026 04:12:46 +0800 Subject: [PATCH] build(web): build frontend UI automatically in build.rs vnt-web/build.rs now runs the pnpm UI build when static/ is missing or older than ui/src, so the embedded assets no longer need to be committed. Set VNT_WEB_SKIP_UI_BUILD=1 to skip (a placeholder page is written). Remove vnt-web/static from version control. --- .gitignore | 3 + vnt-web/build.rs | 124 ++++++++++++++ vnt-web/static/assets/index-B15xAuUw.js | 174 -------------------- vnt-web/static/assets/index-DI9vlWSX.css | 1 - vnt-web/static/assets/vnt-icon-CtSHy0mt.png | Bin 16855 -> 0 bytes vnt-web/static/index.html | 28 ---- 6 files changed, 127 insertions(+), 203 deletions(-) create mode 100644 vnt-web/build.rs delete mode 100644 vnt-web/static/assets/index-B15xAuUw.js delete mode 100644 vnt-web/static/assets/index-DI9vlWSX.css delete mode 100644 vnt-web/static/assets/vnt-icon-CtSHy0mt.png delete mode 100644 vnt-web/static/index.html diff --git a/.gitignore b/.gitignore index 0bb80cd..b7e6ed5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ vnt-desktop/dist vnt-desktop/src-tauri/gen vnt-desktop/src-tauri/icons/android vnt-desktop/src-tauri/icons/ios + +# 前端构建产物,由 vnt-web/build.rs 自动构建 +vnt-web/static diff --git a/vnt-web/build.rs b/vnt-web/build.rs new file mode 100644 index 0000000..c2d53a8 --- /dev/null +++ b/vnt-web/build.rs @@ -0,0 +1,124 @@ +//! 构建 vnt-web 前自动构建前端 UI(vnt-web/ui -> vnt-web/static)。 +//! +//! - 前端源码(ui/src 等)比 static 产物新、或产物缺失时,调用 pnpm 构建 +//! - 产物已是最新则跳过,不拖慢增量编译 +//! - 找不到 pnpm 时:已有产物则告警并沿用;没有产物则报错并给出指引 +//! - 设置环境变量 VNT_WEB_SKIP_UI_BUILD=1 可完全跳过前端构建 + +use std::path::Path; +use std::process::Command; +use std::time::SystemTime; + +fn main() { + let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"); + let manifest_dir = Path::new(&manifest_dir); + let ui_dir = manifest_dir.join("ui"); + let static_dir = manifest_dir.join("static"); + let workspace_root = manifest_dir.parent().expect("workspace root"); + + // UI 源码变化时重新运行本脚本 + println!("cargo:rerun-if-changed={}", ui_dir.join("src").display()); + println!("cargo:rerun-if-changed={}", ui_dir.join("index.html").display()); + println!("cargo:rerun-if-changed={}", ui_dir.join("vite.config.js").display()); + println!("cargo:rerun-if-changed={}", ui_dir.join("package.json").display()); + // 产物被删除时也要重新运行 + println!( + "cargo:rerun-if-changed={}", + static_dir.join("index.html").display() + ); + println!("cargo:rerun-if-env-changed=VNT_WEB_SKIP_UI_BUILD"); + + if std::env::var("VNT_WEB_SKIP_UI_BUILD").is_ok() { + ensure_static_placeholder(&static_dir); + return; + } + + if static_is_fresh(&ui_dir, &static_dir) { + return; + } + + let Some(pnpm) = find_pnpm() else { + if static_dir.join("index.html").is_file() { + println!( + "cargo:warning=未找到 pnpm,沿用 vnt-web/static 中已有的前端产物(可能不是最新)" + ); + return; + } + panic!( + "未找到 pnpm 且 vnt-web/static 没有前端产物。\n\ + 请安装 Node.js 与 pnpm 后重新构建(cargo 会自动完成前端构建),\n\ + 或从发布包中获取 static 目录放入 vnt-web/。" + ); + }; + + if !ui_dir.join("node_modules").is_dir() { + // ui 依赖使用 workspace catalog,必须在仓库根目录安装 + run_or_panic(&pnpm, &["install", "--frozen-lockfile"], workspace_root); + } + run_or_panic(&pnpm, &["--filter", "vnt-web-ui", "build"], workspace_root); +} + +/// pnpm 命令名(Windows 上是 pnpm.cmd,由 cmd.exe 执行) +fn find_pnpm() -> Option<&'static str> { + let candidates: &[&str] = if cfg!(windows) { + &["pnpm.cmd", "pnpm"] + } else { + &["pnpm"] + }; + candidates + .iter() + .copied() + .find(|cmd| Command::new(cmd).arg("--version").output().is_ok()) +} + +fn run_or_panic(program: &str, args: &[&str], dir: &Path) { + println!("cargo:warning=执行前端构建: {} {} ({})", program, args.join(" "), dir.display()); + let status = Command::new(program) + .args(args) + .current_dir(dir) + .status() + .unwrap_or_else(|e| panic!("执行 {} 失败: {}", program, e)); + if !status.success() { + panic!("前端构建失败: {} {} (exit: {:?})", program, args.join(" "), status.code()); + } +} + +/// static 产物是否比 UI 源码新 +fn static_is_fresh(ui_dir: &Path, static_dir: &Path) -> bool { + let Ok(built_at) = std::fs::metadata(static_dir.join("index.html")).and_then(|m| m.modified()) + else { + return false; + }; + newest_mtime(&ui_dir.join("src")).is_none_or(|t| t <= built_at) +} + +fn newest_mtime(dir: &Path) -> Option { + let mut newest: Option = None; + let mut stack = vec![dir.to_path_buf()]; + while let Some(d) = stack.pop() { + for entry in std::fs::read_dir(&d).ok()?.flatten() { + let path = entry.path(); + if path.is_dir() { + stack.push(path); + } else if let Ok(m) = entry.metadata().and_then(|m| m.modified()) { + newest = Some(newest.map_or(m, |n| n.max(m))); + } + } + } + newest +} + +/// 跳过构建时保证 static/ 存在,使 rust_embed 可以编译 +fn ensure_static_placeholder(static_dir: &Path) { + if static_dir.join("index.html").is_file() { + return; + } + println!("cargo:warning=VNT_WEB_SKIP_UI_BUILD 已设置且 static 为空,写入占位页面"); + std::fs::create_dir_all(static_dir).expect("创建 static 目录失败"); + std::fs::write( + static_dir.join("index.html"), + "

VNT Web UI 未构建。请安装 pnpm 后重新执行 cargo build,\ + 或取消 VNT_WEB_SKIP_UI_BUILD。

", + ) + .expect("写入占位页面失败"); +} diff --git a/vnt-web/static/assets/index-B15xAuUw.js b/vnt-web/static/assets/index-B15xAuUw.js deleted file mode 100644 index a5fa5fc..0000000 --- a/vnt-web/static/assets/index-B15xAuUw.js +++ /dev/null @@ -1,174 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))n(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const r of l.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function s(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerPolicy&&(l.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?l.credentials="include":o.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function n(o){if(o.ep)return;o.ep=!0;const l=s(o);fetch(o.href,l)}})();function Ho(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const ke={},bs=[],_t=()=>{},Er=()=>!1,$n=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),An=e=>e.startsWith("onUpdate:"),Re=Object.assign,Wo=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},wa=Object.prototype.hasOwnProperty,ve=(e,t)=>wa.call(e,t),X=Array.isArray,xs=e=>tn(e)==="[object Map]",In=e=>tn(e)==="[object Set]",bl=e=>tn(e)==="[object Date]",re=e=>typeof e=="function",Ce=e=>typeof e=="string",Xe=e=>typeof e=="symbol",be=e=>e!==null&&typeof e=="object",Tr=e=>(be(e)||re(e))&&re(e.then)&&re(e.catch),$r=Object.prototype.toString,tn=e=>$r.call(e),Ca=e=>tn(e).slice(8,-1),Ar=e=>tn(e)==="[object Object]",Rn=e=>Ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,js=Ho(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Pn=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Sa=/-\w/g,Ge=Pn(e=>e.replace(Sa,t=>t.slice(1).toUpperCase())),Ea=/\B([A-Z])/g,as=Pn(e=>e.replace(Ea,"-$1").toLowerCase()),On=Pn(e=>e.charAt(0).toUpperCase()+e.slice(1)),to=Pn(e=>e?`on${On(e)}`:""),xt=(e,t)=>!Object.is(e,t),dn=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Ko=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ta=e=>{const t=Ce(e)?Number(e):NaN;return isNaN(t)?e:t};let xl;const Mn=()=>xl||(xl=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function sn(e){if(X(e)){const t={};for(let s=0;s{if(s){const n=s.split(Aa);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function G(e){let t="";if(Ce(e))t=e;else if(X(e))for(let s=0;snn(s,t))}const Or=e=>!!(e&&e.__v_isRef===!0),L=e=>Ce(e)?e:e==null?"":X(e)||be(e)&&(e.toString===$r||!re(e.toString))?Or(e)?L(e.value):JSON.stringify(e,Mr,2):String(e),Mr=(e,t)=>Or(t)?Mr(e,t.value):xs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,o],l)=>(s[so(n,l)+" =>"]=o,s),{})}:In(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>so(s))}:Xe(t)?so(t):be(t)&&!X(t)&&!Ar(t)?String(t):t,so=(e,t="")=>{var s;return Xe(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let Oe;class Nr{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Oe&&(Oe.active?(this.parent=Oe,this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes){const n=this.scopes.slice();for(t=0,s=n.length;t0&&--this._on===0){if(Oe===this)Oe=this.prevScope;else{let t=Oe;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s0)return;if(Bs){let t=Bs;for(Bs=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Ds;){let t=Ds;for(Ds=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Fr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ur(e){let t,s=e.depsTail,n=s;for(;n;){const o=n.prevDep;n.version===-1?(n===s&&(s=o),zo(n),La(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=o}e.deps=t,e.depsTail=s}function ko(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Hr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Hr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Gs)||(e.globalVersion=Gs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!ko(e))))return;e.flags|=2;const t=e.dep,s=we,n=lt;we=e,lt=!0;try{Fr(e);const o=e.fn(e._value);(t.version===0||xt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{we=s,lt=n,Ur(e),e.flags&=-3}}function zo(e,t=!1){const{dep:s,prevSub:n,nextSub:o}=e;if(n&&(n.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let l=s.computed.deps;l;l=l.nextDep)zo(l,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function La(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let lt=!0;const Wr=[];function It(){Wr.push(lt),lt=!1}function Rt(){const e=Wr.pop();lt=e===void 0?!0:e}function _l(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=we;we=void 0;try{t()}finally{we=s}}}let Gs=0;class Va{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Zo{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(!we||!lt||we===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==we)s=this.activeLink=new Va(we,this),we.deps?(s.prevDep=we.depsTail,we.depsTail.nextDep=s,we.depsTail=s):we.deps=we.depsTail=s,Kr(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=we.depsTail,s.nextDep=void 0,we.depsTail.nextDep=s,we.depsTail=s,we.deps===s&&(we.deps=n)}return s}trigger(t){this.version++,Gs++,this.notify(t)}notify(t){Go();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{qo()}}}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 n=t.deps;n;n=n.nextDep)Kr(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const hn=new WeakMap,os=Symbol(""),wo=Symbol(""),qs=Symbol("");function je(e,t,s){if(lt&&we){let n=hn.get(e);n||hn.set(e,n=new Map);let o=n.get(s);o||(n.set(s,o=new Zo),o.map=n,o.key=s),o.track()}}function Et(e,t,s,n,o,l){const r=hn.get(e);if(!r){Gs++;return}const i=c=>{c&&c.trigger()};if(Go(),t==="clear")r.forEach(i);else{const c=X(e),f=c&&Rn(s);if(c&&s==="length"){const u=Number(n);r.forEach((p,g)=>{(g==="length"||g===qs||!Xe(g)&&g>=u)&&i(p)})}else switch((s!==void 0||r.has(void 0))&&i(r.get(s)),f&&i(r.get(qs)),t){case"add":c?f&&i(r.get("length")):(i(r.get(os)),xs(e)&&i(r.get(wo)));break;case"delete":c||(i(r.get(os)),xs(e)&&i(r.get(wo)));break;case"set":xs(e)&&i(r.get(os));break}}qo()}function ja(e,t){const s=hn.get(e);return s&&s.get(t)}function ds(e){const t=pe(e);return t===e?t:(je(t,"iterate",qs),Ye(e)?t:t.map(rt))}function Nn(e){return je(e=pe(e),"iterate",qs),e}function gt(e,t){return Ot(e)?ks($t(e)?rt(t):t):rt(t)}const Da={__proto__:null,[Symbol.iterator](){return oo(this,Symbol.iterator,e=>gt(this,e))},concat(...e){return ds(this).concat(...e.map(t=>X(t)?ds(t):t))},entries(){return oo(this,"entries",e=>(e[1]=gt(this,e[1]),e))},every(e,t){return kt(this,"every",e,t,void 0,arguments)},filter(e,t){return kt(this,"filter",e,t,s=>s.map(n=>gt(this,n)),arguments)},find(e,t){return kt(this,"find",e,t,s=>gt(this,s),arguments)},findIndex(e,t){return kt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return kt(this,"findLast",e,t,s=>gt(this,s),arguments)},findLastIndex(e,t){return kt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return kt(this,"forEach",e,t,void 0,arguments)},includes(...e){return lo(this,"includes",e)},indexOf(...e){return lo(this,"indexOf",e)},join(e){return ds(this).join(e)},lastIndexOf(...e){return lo(this,"lastIndexOf",e)},map(e,t){return kt(this,"map",e,t,void 0,arguments)},pop(){return As(this,"pop")},push(...e){return As(this,"push",e)},reduce(e,...t){return yl(this,"reduce",e,t)},reduceRight(e,...t){return yl(this,"reduceRight",e,t)},shift(){return As(this,"shift")},some(e,t){return kt(this,"some",e,t,void 0,arguments)},splice(...e){return As(this,"splice",e)},toReversed(){return ds(this).toReversed()},toSorted(e){return ds(this).toSorted(e)},toSpliced(...e){return ds(this).toSpliced(...e)},unshift(...e){return As(this,"unshift",e)},values(){return oo(this,"values",e=>gt(this,e))}};function oo(e,t,s){const n=Nn(e),o=n[t]();return n!==e&&!Ye(e)&&(o._next=o.next,o.next=()=>{const l=o._next();return l.done||(l.value=s(l.value)),l}),o}const Ba=Array.prototype;function kt(e,t,s,n,o,l){const r=Nn(e),i=r!==e&&!Ye(e),c=r[t];if(c!==Ba[t]){const p=c.apply(e,l);return i?rt(p):p}let f=s;r!==e&&(i?f=function(p,g){return s.call(this,gt(e,p),g,e)}:s.length>2&&(f=function(p,g){return s.call(this,p,g,e)}));const u=c.call(r,f,n);return i&&o?o(u):u}function yl(e,t,s,n){const o=Nn(e),l=o!==e&&!Ye(e);let r=s,i=!1;o!==e&&(l?(i=n.length===0,r=function(f,u,p){return i&&(i=!1,f=gt(e,f)),s.call(this,f,gt(e,u),p,e)}):s.length>3&&(r=function(f,u,p){return s.call(this,f,u,p,e)}));const c=o[t](r,...n);return i?gt(e,c):c}function lo(e,t,s){const n=pe(e);je(n,"iterate",qs);const o=n[t](...s);return(o===-1||o===!1)&&Ln(s[0])?(s[0]=pe(s[0]),n[t](...s)):o}function As(e,t,s=[]){It(),Go();const n=pe(e)[t].apply(e,s);return qo(),Rt(),n}const Fa=Ho("__proto__,__v_isRef,__isVue"),Gr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xe));function Ua(e){Xe(e)||(e=String(e));const t=pe(this);return je(t,"has",e),t.hasOwnProperty(e)}class qr{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const o=this._isReadonly,l=this._isShallow;if(s==="__v_isReactive")return!o;if(s==="__v_isReadonly")return o;if(s==="__v_isShallow")return l;if(s==="__v_raw")return n===(o?l?Qa:Yr:l?Jr:Zr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const r=X(t);if(!o){let c;if(r&&(c=Da[s]))return c;if(s==="hasOwnProperty")return Ua}const i=Reflect.get(t,s,Ee(t)?t:n);if((Xe(s)?Gr.has(s):Fa(s))||(o||je(t,"get",s),l))return i;if(Ee(i)){const c=r&&Rn(s)?i:i.value;return o&&be(c)?So(c):c}return be(i)?o?So(i):Pt(i):i}}class zr extends qr{constructor(t=!1){super(!1,t)}set(t,s,n,o){let l=t[s];const r=X(t)&&Rn(s);if(!this._isShallow){const f=Ot(l);if(!Ye(n)&&!Ot(n)&&(l=pe(l),n=pe(n)),!r&&Ee(l)&&!Ee(n))return f||(l.value=n),!0}const i=r?Number(s)e,rn=e=>Reflect.getPrototypeOf(e);function qa(e,t,s){return function(...n){const o=this.__v_raw,l=pe(o),r=xs(l),i=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,f=o[e](...n),u=s?Co:t?ks:rt;return!t&&je(l,"iterate",c?wo:os),Re(Object.create(f),{next(){const{value:p,done:g}=f.next();return g?{value:p,done:g}:{value:i?[u(p[0]),u(p[1])]:u(p),done:g}}})}}function an(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function za(e,t){const s={get(o){const l=this.__v_raw,r=pe(l),i=pe(o);e||(xt(o,i)&&je(r,"get",o),je(r,"get",i));const{has:c}=rn(r),f=t?Co:e?ks:rt;if(c.call(r,o))return f(l.get(o));if(c.call(r,i))return f(l.get(i));l!==r&&l.get(o)},get size(){const o=this.__v_raw;return!e&&je(pe(o),"iterate",os),o.size},has(o){const l=this.__v_raw,r=pe(l),i=pe(o);return e||(xt(o,i)&&je(r,"has",o),je(r,"has",i)),o===i?l.has(o):l.has(o)||l.has(i)},forEach(o,l){const r=this,i=r.__v_raw,c=pe(i),f=t?Co:e?ks:rt;return!e&&je(c,"iterate",os),i.forEach((u,p)=>o.call(l,f(u),f(p),r))}};return Re(s,e?{add:an("add"),set:an("set"),delete:an("delete"),clear:an("clear")}:{add(o){const l=pe(this),r=rn(l),i=pe(o),c=!t&&!Ye(o)&&!Ot(o)?i:o;return r.has.call(l,c)||xt(o,c)&&r.has.call(l,o)||xt(i,c)&&r.has.call(l,i)||(l.add(c),Et(l,"add",c,c)),this},set(o,l){!t&&!Ye(l)&&!Ot(l)&&(l=pe(l));const r=pe(this),{has:i,get:c}=rn(r);let f=i.call(r,o);f||(o=pe(o),f=i.call(r,o));const u=c.call(r,o);return r.set(o,l),f?xt(l,u)&&Et(r,"set",o,l):Et(r,"add",o,l),this},delete(o){const l=pe(this),{has:r,get:i}=rn(l);let c=r.call(l,o);c||(o=pe(o),c=r.call(l,o)),i&&i.call(l,o);const f=l.delete(o);return c&&Et(l,"delete",o,void 0),f},clear(){const o=pe(this),l=o.size!==0,r=o.clear();return l&&Et(o,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(o=>{s[o]=qa(o,e,t)}),s}function Jo(e,t){const s=za(e,t);return(n,o,l)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?n:Reflect.get(ve(s,o)&&o in n?s:n,o,l)}const Za={get:Jo(!1,!1)},Ja={get:Jo(!1,!0)},Ya={get:Jo(!0,!1)};const Zr=new WeakMap,Jr=new WeakMap,Yr=new WeakMap,Qa=new WeakMap;function Xa(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Pt(e){return Ot(e)?e:Yo(e,!1,Wa,Za,Zr)}function Qr(e){return Yo(e,!1,Ga,Ja,Jr)}function So(e){return Yo(e,!0,Ka,Ya,Yr)}function Yo(e,t,s,n,o){if(!be(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const l=o.get(e);if(l)return l;const r=Xa(Ca(e));if(r===0)return e;const i=new Proxy(e,r===2?n:s);return o.set(e,i),i}function $t(e){return Ot(e)?$t(e.__v_raw):!!(e&&e.__v_isReactive)}function Ot(e){return!!(e&&e.__v_isReadonly)}function Ye(e){return!!(e&&e.__v_isShallow)}function Ln(e){return e?!!e.__v_raw:!1}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function Qo(e){return!ve(e,"__v_skip")&&Object.isExtensible(e)&&Ir(e,"__v_skip",!0),e}const rt=e=>be(e)?Pt(e):e,ks=e=>be(e)?So(e):e;function Ee(e){return e?e.__v_isRef===!0:!1}function Z(e){return Xr(e,!1)}function ec(e){return Xr(e,!0)}function Xr(e,t){return Ee(e)?e:new tc(e,t)}class tc{constructor(t,s){this.dep=new Zo,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:pe(t),this._value=s?t:rt(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Ye(t)||Ot(t);t=n?t:pe(t),xt(t,s)&&(this._rawValue=t,this._value=n?t:rt(t),this.dep.trigger())}}function R(e){return Ee(e)?e.value:e}const sc={get:(e,t,s)=>t==="__v_raw"?e:R(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const o=e[t];return Ee(o)&&!Ee(s)?(o.value=s,!0):Reflect.set(e,t,s,n)}};function ei(e){return $t(e)?e:new Proxy(e,sc)}function nc(e){const t=X(e)?new Array(e.length):{};for(const s in e)t[s]=lc(e,s);return t}class oc{constructor(t,s,n){this._object=t,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=Xe(s)?s:String(s),this._raw=pe(t);let o=!0,l=t;if(!X(t)||Xe(this._key)||!Rn(this._key))do o=!Ln(l)||Ye(l);while(o&&(l=l.__v_raw));this._shallow=o}get value(){let t=this._object[this._key];return this._shallow&&(t=R(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Ee(this._raw[this._key])){const s=this._object[this._key];if(Ee(s)){s.value=t;return}}this._object[this._key]=t}get dep(){return ja(this._raw,this._key)}}function lc(e,t,s){return new oc(e,t,s)}class rc{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Zo(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Gs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&we!==this)return Br(this,!0),!0}get value(){const t=this.dep.track();return Hr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function ic(e,t,s=!1){let n,o;return re(e)?n=e:(n=e.get,o=e.set),new rc(n,o,s)}const cn={},mn=new WeakMap;let Qt;function ac(e,t=!1,s=Qt){if(s){let n=mn.get(s);n||mn.set(s,n=[]),n.push(e)}}function cc(e,t,s=ke){const{immediate:n,deep:o,once:l,scheduler:r,augmentJob:i,call:c}=s,f=b=>o?b:Ye(b)||o===!1||o===0?Tt(b,1):Tt(b);let u,p,g,h,C=!1,w=!1;if(Ee(e)?(p=()=>e.value,C=Ye(e)):$t(e)?(p=()=>f(e),C=!0):X(e)?(w=!0,C=e.some(b=>$t(b)||Ye(b)),p=()=>e.map(b=>{if(Ee(b))return b.value;if($t(b))return f(b);if(re(b))return c?c(b,2):b()})):re(e)?t?p=c?()=>c(e,2):e:p=()=>{if(g){It();try{g()}finally{Rt()}}const b=Qt;Qt=u;try{return c?c(e,3,[h]):e(h)}finally{Qt=b}}:p=_t,t&&o){const b=p,x=o===!0?1/0:o;p=()=>Tt(b(),x)}const N=Vr(),T=()=>{u.stop(),N&&N.active&&Wo(N.effects,u)};if(l&&t){const b=t;t=(...x)=>{const V=b(...x);return T(),V}}let y=w?new Array(e.length).fill(cn):cn;const d=b=>{if(!(!(u.flags&1)||!u.dirty&&!b))if(t){const x=u.run();if(b||o||C||(w?x.some((V,j)=>xt(V,y[j])):xt(x,y))){g&&g();const V=Qt;Qt=u;try{const j=[x,y===cn?void 0:w&&y[0]===cn?[]:y,h];y=x,c?c(t,3,j):t(...j)}finally{Qt=V}}}else u.run()};return i&&i(d),u=new jr(p),u.scheduler=r?()=>r(d,!1):d,h=b=>ac(b,!1,u),g=u.onStop=()=>{const b=mn.get(u);if(b){if(c)c(b,4);else for(const x of b)x();mn.delete(u)}},t?n?d(!0):y=u.run():r?r(d.bind(null,!0),!0):u.run(),T.pause=u.pause.bind(u),T.resume=u.resume.bind(u),T.stop=T,T}function Tt(e,t=1/0,s){if(t<=0||!be(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Ee(e))Tt(e.value,t,s);else if(X(e))for(let n=0;n{Tt(n,t,s)});else if(Ar(e)){for(const n in e)Tt(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&Tt(e[n],t,s)}return e}function on(e,t,s,n){try{return n?e(...n):e()}catch(o){Vn(o,t,s)}}function ot(e,t,s,n){if(re(e)){const o=on(e,t,s,n);return o&&Tr(o)&&o.catch(l=>{Vn(l,t,s)}),o}if(X(e)){const o=[];for(let l=0;l>>1,o=Ke[n],l=zs(o);l=zs(s)?Ke.push(e):Ke.splice(fc(t),0,e),e.flags|=1,si()}}function si(){gn||(gn=ti.then(oi))}function dc(e){if(!X(e))Ut&&e.id===-1?Ut.splice(gs+1,0,e):e.flags&1||(_s.push(e),e.flags|=1);else for(let t=0;tzs(s)-zs(n));if(_s.length=0,Ut){for(let s=0;se.id==null?e.flags&2?-1:1/0:e.id;function oi(e){try{for(mt=0;mt{n._d&&yn(-1);const l=vn(t),r=At.length;let i;try{i=e(...o)}finally{for(let c=At.length;c>r;c--)ll();vn(l),n._d&&yn(1)}return i};return n._n=!0,n._c=!0,n._d=!0,n}function xe(e,t){if(Ne===null)return e;const s=Kn(Ne),n=e.dirs||(e.dirs=[]);for(let o=0;o1)return s&&re(t)?t.call(n&&n.proxy):t}}function pc(){return!!(Ts()||ls)}const hc=Symbol.for("v-scx"),mc=()=>Qe(hc);function Le(e,t,s){return ri(e,t,s)}function ri(e,t,s=ke){const{immediate:n,deep:o,flush:l,once:r}=s,i=Re({},s),c=t&&n||!t&&l!=="post";let f;if(Xs){if(l==="sync"){const h=mc();f=h.__watcherHandles||(h.__watcherHandles=[])}else if(!c){const h=()=>{};return h.stop=_t,h.resume=_t,h.pause=_t,h}}const u=Be;i.call=(h,C,w)=>ot(h,u,C,w);let p=!1;l==="post"?i.scheduler=h=>{He(h,u&&u.suspense)}:l!=="sync"&&(p=!0,i.scheduler=(h,C)=>{C?h():Xo(h)}),i.augmentJob=h=>{t&&(h.flags|=4),p&&(h.flags|=2,u&&(h.id=u.uid,h.i=u))};const g=cc(e,t,i);return Xs&&(f?f.push(g):c&&g()),g}function gc(e,t,s){const n=this.proxy,o=Ce(e)?e.includes(".")?ii(n,e):()=>n[e]:e.bind(n,n);let l;re(t)?l=t:(l=t.handler,s=t);const r=ln(this),i=ri(o,l.bind(n),s);return r(),i}function ii(e,t){const s=t.split(".");return()=>{let n=e;for(let o=0;oe.__isTeleport,Xt=e=>e&&(e.disabled||e.disabled===""),vc=e=>e&&(e.defer||e.defer===""),wl=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Cl=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Eo=(e,t)=>{const s=e&&e.to;return Ce(s)?t?t(s):null:s},bc={name:"Teleport",__isTeleport:!0,process(e,t,s,n,o,l,r,i,c,f){const{mc:u,pc:p,pbc:g,o:{insert:h,querySelector:C,createText:w,createComment:N,parentNode:T}}=f,y=Xt(t.props);let{dynamicChildren:d}=t;const b=(j,H,M)=>{j.shapeFlag&16&&u(j.children,H,M,o,l,r,i,c)},x=(j=t)=>{const H=Xt(j.props),M=j.target=Eo(j.props,C),z=To(M,j,w,h);M&&(r!=="svg"&&wl(M)?r="svg":r!=="mathml"&&Cl(M)&&(r="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add(M),H||(b(j,M,z),Ms(j,!1)))},V=j=>{const H=()=>{if(Dt.get(j)===H){if(Dt.delete(j),Xt(j.props)){const M=T(j.el)||s;b(j,M,j.anchor),Ms(j,!0)}x(j)}};Dt.set(j,H),He(H,l)};if(e==null){const j=t.el=w(""),H=t.anchor=w("");if(h(j,s,n),h(H,s,n),vc(t.props)||l&&l.pendingBranch){V(t);return}y&&(b(t,s,H),Ms(t,!0)),x()}else{t.el=e.el;const j=t.anchor=e.anchor,H=Dt.get(e);if(H){H.flags|=8,Dt.delete(e),V(t);return}t.targetStart=e.targetStart;const M=t.target=e.target,z=t.targetAnchor=e.targetAnchor,oe=Xt(e.props),F=oe?s:M,J=oe?j:z;if(r==="svg"||wl(M)?r="svg":(r==="mathml"||Cl(M))&&(r="mathml"),d?(g(e.dynamicChildren,d,F,o,l,r,i),ol(e,t,!0)):c||p(e,t,F,J,o,l,r,i,!1),y)oe?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):un(t,s,j,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const P=Eo(t.props,C);P&&(t.target=P,un(t,P,null,f,0))}else oe&&un(t,M,z,f,1);Ms(t,y)}},remove(e,t,s,{um:n,o:{remove:o}},l){const{shapeFlag:r,children:i,anchor:c,targetStart:f,targetAnchor:u,target:p,props:g}=e,h=Xt(g),C=l||!h,w=Dt.get(e);if(w&&(w.flags|=8,Dt.delete(e)),p&&(o(f),o(u)),l&&o(c),!w&&(h||p)&&r&16)for(let N=0;N{e.isMounted=!0}),Fn(()=>{e.isUnmounting=!0}),e}const st=[Function,Array],ui={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:st,onEnter:st,onAfterEnter:st,onEnterCancelled:st,onBeforeLeave:st,onLeave:st,onAfterLeave:st,onLeaveCancelled:st,onBeforeAppear:st,onAppear:st,onAfterAppear:st,onAppearCancelled:st},fi=e=>{const t=e.subTree;return t.component?fi(t.component):t},_c={name:"BaseTransition",props:ui,setup(e,{slots:t}){const s=Ts(),n=ci();return()=>{const o=t.default&&tl(t.default(),!0),l=o&&o.length?di(o):s.subTree?le():void 0;if(!l)return;const r=pe(e),{mode:i}=r;if(n.isLeaving)return ro(l);const c=bn(l);if(!c)return ro(l);let f=Zs(c,r,n,s,p=>f=p);c.type!==De&&is(c,f);let u=s.subTree&&bn(s.subTree);if(u&&u.type!==De&&!es(u,c)&&fi(s).type!==De){let p=Zs(u,r,n,s);if(is(u,p),i==="out-in"&&c.type!==De)return n.isLeaving=!0,p.afterLeave=()=>{n.isLeaving=!1,s.job.flags&8||s.update(),delete p.afterLeave,u=void 0},ro(l);i==="in-out"&&c.type!==De?p.delayLeave=(g,h,C)=>{const w=pi(n,u);w[String(u.key)]=u,g[nt]=()=>{h(),g[nt]=void 0,delete f.delayedLeave,u=void 0},f.delayedLeave=()=>{C(),delete f.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return l}}};function di(e){let t=e[0];if(e.length>1){for(const s of e)if(s.type!==De){t=s;break}}return t}const yc=_c;function pi(e,t){const{leavingVNodes:s}=e;let n=s.get(t.type);return n||(n=Object.create(null),s.set(t.type,n)),n}function Zs(e,t,s,n,o){const{appear:l,mode:r,persisted:i=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:u,onEnterCancelled:p,onBeforeLeave:g,onLeave:h,onAfterLeave:C,onLeaveCancelled:w,onBeforeAppear:N,onAppear:T,onAfterAppear:y,onAppearCancelled:d}=t,b=String(e.key),x=pi(s,e),V=(M,z)=>{M&&ot(M,n,9,z)},j=(M,z)=>{const oe=z[1];V(M,z),X(M)?M.every(F=>F.length<=1)&&oe():M.length<=1&&oe()},H={mode:r,persisted:i,beforeEnter(M){let z=c;if(!s.isMounted)if(l)z=N||c;else return;M[nt]&&M[nt](!0);const oe=x[b];oe&&es(e,oe)&&oe.el[nt]&&oe.el[nt](),V(z,[M])},enter(M){if(x[b]===e)return;let z=f,oe=u,F=p;if(!s.isMounted)if(l)z=T||f,oe=y||u,F=d||p;else return;let J=!1;M[Is]=te=>{J||(J=!0,te?V(F,[M]):V(oe,[M]),H.delayedLeave&&H.delayedLeave(),M[Is]=void 0)};const P=M[Is].bind(null,!1);z?j(z,[M,P]):P()},leave(M,z){const oe=String(e.key);if(M[Is]&&M[Is](!0),s.isUnmounting)return z();V(g,[M]);let F=!1;M[nt]=P=>{F||(F=!0,z(),P?V(w,[M]):V(C,[M]),M[nt]=void 0,x[oe]===e&&delete x[oe])};const J=M[nt].bind(null,!1);x[oe]=e,h?j(h,[M,J]):J()},clone(M){const z=Zs(M,t,s,n,o);return o&&o(z),z}};return H}function ro(e){if(Dn(e))return e=Wt(e),e.children=null,e}function bn(e){if(!Dn(e))return jn(e.type)&&e.children?di(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:s}=e;if(s){if(t&16)return s[0];if(t&32&&re(s.default))return s.default()}}function is(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const s=e.component.subTree;is(jn(s.type)&&bn(s)||s,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function tl(e,t=!1,s){let n=[],o=0;for(let l=0;l1)for(let l=0;lUs(w,t&&(X(t)?t[N]:t),s,n,o));return}if(ys(n)&&!o){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Us(e,t,s,n.component.subTree);return}const l=n.shapeFlag&4?Kn(n.component):n.el,r=o?null:l,{i,r:c}=e,f=t&&t.r,u=i.refs===ke?i.refs={}:i.refs,p=i.setupState,g=pe(p),h=p===ke?Er:w=>Sl(u,w)?!1:ve(g,w),C=(w,N)=>!(N&&Sl(u,N));if(f!=null&&f!==c){if(El(t),Ce(f))u[f]=null,h(f)&&(p[f]=null);else if(Ee(f)){const w=t;C(f,w.k)&&(f.value=null),w.k&&(u[w.k]=null)}}if(re(c))on(c,i,12,[r,u]);else{const w=Ce(c),N=Ee(c);if(w||N){const T=()=>{if(e.f){const y=w?h(c)?p[c]:u[c]:C()||!e.k?c.value:u[e.k];if(o)X(y)&&Wo(y,l);else if(X(y))y.includes(l)||y.push(l);else if(w)u[c]=[l],h(c)&&(p[c]=u[c]);else{const d=[l];C(c,e.k)&&(c.value=d),e.k&&(u[e.k]=d)}}else w?(u[c]=r,h(c)&&(p[c]=r)):N&&(C(c,e.k)&&(c.value=r),e.k&&(u[e.k]=r))};if(r){const y=()=>{T(),xn.delete(e)};y.id=-1,xn.set(e,y),He(y,s)}else El(e),T()}}}function El(e){const t=xn.get(e);t&&(t.flags|=8,xn.delete(e))}Mn().requestIdleCallback;Mn().cancelIdleCallback;const ys=e=>!!e.type.__asyncLoader,Dn=e=>e.type.__isKeepAlive;function wc(e,t){gi(e,"a",t)}function Cc(e,t){gi(e,"da",t)}function gi(e,t,s=Be){const n=e.__wdc||(e.__wdc=()=>{let o=s;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Bn(t,n,s),s){let o=s.parent;for(;o&&o.parent;)Dn(o.parent.vnode)&&Sc(n,t,s,o),o=o.parent}}function Sc(e,t,s,n){const o=Bn(t,e,n,!0);Es(()=>{Wo(n[t],o)},s)}function Bn(e,t,s=Be,n=!1){if(s){const o=s[e]||(s[e]=[]),l=t.__weh||(t.__weh=(...r)=>{It();const i=ln(s),c=ot(t,s,e,r);return i(),Rt(),c});return n?o.unshift(l):o.push(l),l}}const Mt=e=>(t,s=Be)=>{(!Xs||e==="sp")&&Bn(e,(...n)=>t(...n),s)},Ec=Mt("bm"),at=Mt("m"),Tc=Mt("bu"),vi=Mt("u"),Fn=Mt("bum"),Es=Mt("um"),$c=Mt("sp"),Ac=Mt("rtg"),Ic=Mt("rtc");function Rc(e,t=Be){Bn("ec",e,t)}const bi="components";function Un(e,t){return _i(bi,e,!0,t)||e}const xi=Symbol.for("v-ndc");function Pc(e){return Ce(e)?_i(bi,e,!1)||e:e||xi}function _i(e,t,s=!0,n=!1){const o=Ne||Be;if(o){const l=o.type;{const i=hu(l,!1);if(i&&(i===t||i===Ge(t)||i===On(Ge(t))))return l}const r=Tl(o[e]||l[e],t)||Tl(o.appContext[e],t);return!r&&n?l:r}}function Tl(e,t){return e&&(e[t]||e[Ge(t)]||e[On(Ge(t))])}function Te(e,t,s,n){let o;const l=s,r=X(e);if(r||Ce(e)){const i=r&&$t(e);let c=!1,f=!1;i&&(c=!Ye(e),f=Ot(e),e=Nn(e)),o=new Array(e.length);for(let u=0,p=e.length;ut(i,c,void 0,l));else{const i=Object.keys(e);o=new Array(i.length);for(let c=0,f=i.length;c0;return t!=="default"&&(f.name=t),k(),Ve(ae,null,[fe("slot",f,n)],u?-2:64)}let r=e[t];r&&r._c&&(r._d=!1);const i=At.length;k();let c;try{const f=r&&yi(r(s)),u=s.key||l||f&&f.key;c=Ve(ae,{key:(u&&!Xe(u)?u:`_${t}`)+(!f&&n?"_fb":"")},f||(n?n():[]),f&&e._===1?64:-2)}catch(f){for(let u=At.length;u>i;u--)ll();throw f}finally{r&&r._c&&(r._d=!0)}return c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),c}function yi(e){return e.some(t=>Ys(t)?!(t.type===De||t.type===ae&&!yi(t.children)):!0)?e:null}const $o=e=>e?Fi(e)?Kn(e):$o(e.parent):null,Hs=Re(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=>$o(e.parent),$root:e=>$o(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>wi(e),$forceUpdate:e=>e.f||(e.f=()=>{Xo(e.update)}),$nextTick:e=>e.n||(e.n=yt.bind(e.proxy)),$watch:e=>gc.bind(e)}),ao=(e,t)=>e!==ke&&!e.__isScriptSetup&&ve(e,t),Oc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:o,props:l,accessCache:r,type:i,appContext:c}=e;if(t[0]!=="$"){const g=r[t];if(g!==void 0)switch(g){case 1:return n[t];case 2:return o[t];case 4:return s[t];case 3:return l[t]}else{if(ao(n,t))return r[t]=1,n[t];if(o!==ke&&ve(o,t))return r[t]=2,o[t];if(ve(l,t))return r[t]=3,l[t];if(s!==ke&&ve(s,t))return r[t]=4,s[t];Ao&&(r[t]=0)}}const f=Hs[t];let u,p;if(f)return t==="$attrs"&&je(e.attrs,"get",""),f(e);if((u=i.__cssModules)&&(u=u[t]))return u;if(s!==ke&&ve(s,t))return r[t]=4,s[t];if(p=c.config.globalProperties,ve(p,t))return p[t]},set({_:e},t,s){const{data:n,setupState:o,ctx:l}=e;return ao(o,t)?(o[t]=s,!0):n!==ke&&ve(n,t)?(n[t]=s,!0):ve(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:o,props:l,type:r}},i){let c;return!!(s[i]||e!==ke&&i[0]!=="$"&&ve(e,i)||ao(t,i)||ve(l,i)||ve(n,i)||ve(Hs,i)||ve(o.config.globalProperties,i)||(c=r.__cssModules)&&c[i])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:ve(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function $l(e){return X(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let Ao=!0;function Mc(e){const t=wi(e),s=e.proxy,n=e.ctx;Ao=!1,t.beforeCreate&&Al(t.beforeCreate,e,"bc");const{data:o,computed:l,methods:r,watch:i,provide:c,inject:f,created:u,beforeMount:p,mounted:g,beforeUpdate:h,updated:C,activated:w,deactivated:N,beforeDestroy:T,beforeUnmount:y,destroyed:d,unmounted:b,render:x,renderTracked:V,renderTriggered:j,errorCaptured:H,serverPrefetch:M,expose:z,inheritAttrs:oe,components:F,directives:J,filters:P}=t;if(f&&Nc(f,n,null),r)for(const se in r){const ie=r[se];re(ie)&&(n[se]=ie.bind(s))}if(o){const se=o.call(s,s);be(se)&&(e.data=Pt(se))}if(Ao=!0,l)for(const se in l){const ie=l[se],Fe=re(ie)?ie.bind(s,s):re(ie.get)?ie.get.bind(s,s):_t,qe=!re(ie)&&re(ie.set)?ie.set.bind(s):_t,ct=he({get:Fe,set:qe});Object.defineProperty(n,se,{enumerable:!0,configurable:!0,get:()=>ct.value,set:ze=>ct.value=ze})}if(i)for(const se in i)ki(i[se],n,s,se);if(c){const se=re(c)?c.call(s):c;Reflect.ownKeys(se).forEach(ie=>{Fs(ie,se[ie])})}u&&Al(u,e,"c");function ue(se,ie){X(ie)?ie.forEach(Fe=>se(Fe.bind(s))):ie&&se(ie.bind(s))}if(ue(Ec,p),ue(at,g),ue(Tc,h),ue(vi,C),ue(wc,w),ue(Cc,N),ue(Rc,H),ue(Ic,V),ue(Ac,j),ue(Fn,y),ue(Es,b),ue($c,M),X(z))if(z.length){const se=e.exposed||(e.exposed={});z.forEach(ie=>{Object.defineProperty(se,ie,{get:()=>s[ie],set:Fe=>s[ie]=Fe,enumerable:!0})})}else e.exposed||(e.exposed={});x&&e.render===_t&&(e.render=x),oe!=null&&(e.inheritAttrs=oe),F&&(e.components=F),J&&(e.directives=J),M&&mi(e)}function Nc(e,t,s=_t){X(e)&&(e=Io(e));for(const n in e){const o=e[n];let l;be(o)?"default"in o?l=Qe(o.from||n,o.default,!0):l=Qe(o.from||n):l=Qe(o),Ee(l)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>l.value,set:r=>l.value=r}):t[n]=l}}function Al(e,t,s){ot(X(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function ki(e,t,s,n){let o=n.includes(".")?ii(s,n):()=>s[n];if(Ce(e)){const l=t[e];re(l)&&Le(o,l)}else if(re(e))Le(o,e.bind(s));else if(be(e))if(X(e))e.forEach(l=>ki(l,t,s,n));else{const l=re(e.handler)?e.handler.bind(s):t[e.handler];re(l)&&Le(o,l,e)}}function wi(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:o,optionsCache:l,config:{optionMergeStrategies:r}}=e.appContext,i=l.get(t);let c;return i?c=i:!o.length&&!s&&!n?c=t:(c={},o.length&&o.forEach(f=>_n(c,f,r,!0)),_n(c,t,r)),be(t)&&l.set(t,c),c}function _n(e,t,s,n=!1){const{mixins:o,extends:l}=t;l&&_n(e,l,s,!0),o&&o.forEach(r=>_n(e,r,s,!0));for(const r in t)if(!(n&&r==="expose")){const i=Lc[r]||s&&s[r];e[r]=i?i(e[r],t[r]):t[r]}return e}const Lc={data:Il,props:Rl,emits:Rl,methods:Ns,computed:Ns,beforeCreate:Ue,created:Ue,beforeMount:Ue,mounted:Ue,beforeUpdate:Ue,updated:Ue,beforeDestroy:Ue,beforeUnmount:Ue,destroyed:Ue,unmounted:Ue,activated:Ue,deactivated:Ue,errorCaptured:Ue,serverPrefetch:Ue,components:Ns,directives:Ns,watch:jc,provide:Il,inject:Vc};function Il(e,t){return t?e?function(){return Re(re(e)?e.call(this,this):e,re(t)?t.call(this,this):t)}:t:e}function Vc(e,t){return Ns(Io(e),Io(t))}function Io(e){if(X(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ge(t)}Modifiers`]||e[`${as(t)}Modifiers`];function Uc(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||ke;let o=s;const l=t.startsWith("update:"),r=l&&Fc(n,t.slice(7));r&&(r.trim&&(o=s.map(u=>Ce(u)?u.trim():u)),r.number&&(o=s.map(Ko)));let i,c=n[i=to(t)]||n[i=to(Ge(t))];!c&&l&&(c=n[i=to(as(t))]),c&&ot(c,e,6,o);const f=n[i+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[i])return;e.emitted[i]=!0,ot(f,e,6,o)}}const Hc=new WeakMap;function Si(e,t,s=!1){const n=s?Hc:t.emitsCache,o=n.get(e);if(o!==void 0)return o;const l=e.emits;let r={},i=!1;if(!re(e)){const c=f=>{const u=Si(f,t,!0);u&&(i=!0,Re(r,u))};!s&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!l&&!i?(be(e)&&n.set(e,null),null):(X(l)?l.forEach(c=>r[c]=null):Re(r,l),be(e)&&n.set(e,r),r)}function Hn(e,t){return!e||!$n(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),ve(e,t[0].toLowerCase()+t.slice(1))||ve(e,as(t))||ve(e,t))}function Pl(e){const{type:t,vnode:s,proxy:n,withProxy:o,propsOptions:[l],slots:r,attrs:i,emit:c,render:f,renderCache:u,props:p,data:g,setupState:h,ctx:C,inheritAttrs:w}=e,N=vn(e);let T,y;try{if(s.shapeFlag&4){const b=o||n,x=b;T=vt(f.call(x,b,u,p,h,g,C)),y=i}else{const b=t;T=vt(b.length>1?b(p,{attrs:i,slots:r,emit:c}):b(p,null)),y=t.props?i:Wc(i)}}catch(b){At.length=0,Vn(b,e,1),T=fe(De)}let d=T;if(y&&w!==!1){const b=Object.keys(y),{shapeFlag:x}=d;b.length&&x&7&&(l&&b.some(An)&&(y=Kc(y,l)),d=Wt(d,y,!1,!0))}if(s.dirs&&(d=Wt(d,null,!1,!0),d.dirs=d.dirs?d.dirs.concat(s.dirs):s.dirs),s.transition){const b=jn(d.type)&&bn(d)||d;is(b,s.transition)}return T=d,vn(N),T}const Wc=e=>{let t;for(const s in e)(s==="class"||s==="style"||$n(s))&&((t||(t={}))[s]=e[s]);return t},Kc=(e,t)=>{const s={};for(const n in e)(!An(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Gc(e,t,s){const{props:n,children:o,component:l}=e,{props:r,children:i,patchFlag:c}=t,f=l.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&c>=0){if(c&1024)return!0;if(c&16)return n?Ol(n,r,f):!!r;if(c&8){const u=t.dynamicProps;for(let p=0;pObject.create(Ti),Ai=e=>Object.getPrototypeOf(e)===Ti;function zc(e,t,s,n=!1){const o={},l=$i();e.propsDefaults=Object.create(null),Ii(e,t,o,l);for(const r in e.propsOptions[0])r in o||(o[r]=void 0);s?e.props=n?o:Qr(o):e.type.props?e.props=o:e.props=l,e.attrs=l}function Zc(e,t,s,n){const{props:o,attrs:l,vnode:{patchFlag:r}}=e,i=pe(o),[c]=e.propsOptions;let f=!1;if((n||r>0)&&!(r&16)){if(r&8){const u=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[g,h]=Ri(p,t,!0);Re(r,g),h&&i.push(...h)};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!l&&!c)return be(e)&&n.set(e,bs),bs;if(X(l))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",nl=e=>X(e)?e.map(vt):[vt(e)],Yc=(e,t,s)=>{if(t._n)return t;const n=Ie((...o)=>nl(t(...o)),s);return n._c=!1,n},Pi=(e,t,s)=>{const n=e._ctx;for(const o in e){if(sl(o))continue;const l=e[o];if(re(l))t[o]=Yc(o,l,n);else if(l!=null){const r=nl(l);t[o]=()=>r}}},Oi=(e,t)=>{const s=nl(t);e.slots.default=()=>s},Mi=(e,t,s)=>{for(const n in t)(s||!sl(n))&&(e[n]=t[n])},Qc=(e,t,s)=>{const n=e.slots=$i();if(e.vnode.shapeFlag&32){const o=t._;o?(Mi(n,t,s),s&&Ir(n,"_",o,!0)):Pi(t,n)}else t&&Oi(e,t)},Xc=(e,t,s)=>{const{vnode:n,slots:o}=e;let l=!0,r=ke;if(n.shapeFlag&32){const i=t._;i?s&&i===1?l=!1:Mi(o,t,s):(l=!t.$stable,Pi(t,o)),r=t}else t&&(Oi(e,t),r={default:1});if(l)for(const i in o)!sl(i)&&r[i]==null&&delete o[i]},He=ou;function eu(e){return tu(e)}function tu(e,t){const s=Mn();s.__VUE__=!0;const{insert:n,remove:o,patchProp:l,createElement:r,createText:i,createComment:c,setText:f,setElementText:u,parentNode:p,nextSibling:g,setScopeId:h=_t,insertStaticContent:C}=e,w=(m,v,_,$=null,I=null,E=null,U=void 0,B=null,D=!!v.dynamicChildren)=>{if(m===v)return;m&&!es(m,v)&&($=A(m),ze(m,I,E,!0),m=null),v.patchFlag===-2&&(D=!1,v.dynamicChildren=null);const{type:O,ref:ee,shapeFlag:K}=v;switch(O){case Wn:N(m,v,_,$);break;case De:T(m,v,_,$);break;case uo:m==null&&y(v,_,$,U);break;case ae:F(m,v,_,$,I,E,U,B,D);break;default:K&1?x(m,v,_,$,I,E,U,B,D):K&6?J(m,v,_,$,I,E,U,B,D):(K&64||K&128)&&O.process(m,v,_,$,I,E,U,B,D,Y)}ee!=null&&I?Us(ee,m&&m.ref,E,v||m,!v):ee==null&&m&&m.ref!=null&&Us(m.ref,null,E,m,!0)},N=(m,v,_,$)=>{if(m==null)n(v.el=i(v.children),_,$);else{const I=v.el=m.el;v.children!==m.children&&f(I,v.children)}},T=(m,v,_,$)=>{m==null?n(v.el=c(v.children||""),_,$):v.el=m.el},y=(m,v,_,$)=>{[m.el,m.anchor]=C(m.children,v,_,$,m.el,m.anchor)},d=({el:m,anchor:v},_,$)=>{let I;for(;m&&m!==v;)I=g(m),n(m,_,$),m=I;n(v,_,$)},b=({el:m,anchor:v})=>{let _;for(;m&&m!==v;)_=g(m),o(m),m=_;o(v)},x=(m,v,_,$,I,E,U,B,D)=>{if(v.type==="svg"?U="svg":v.type==="math"&&(U="mathml"),m==null)V(v,_,$,I,E,U,B,D);else{const O=m.el&&m.el._isVueCE?m.el:null;try{O&&O._beginPatch(),M(m,v,I,E,U,B,D)}finally{O&&O._endPatch()}}},V=(m,v,_,$,I,E,U,B)=>{let D,O;const{props:ee,shapeFlag:K,transition:Q,dirs:ne}=m;if(D=m.el=r(m.type,E,ee&&ee.is,ee),K&8?u(D,m.children):K&16&&H(m.children,D,null,$,I,co(m,E),U,B),ne&&Gt(m,null,$,"created"),j(D,m,m.scopeId,U,$),ee){for(const ye in ee)ye!=="value"&&!js(ye)&&l(D,ye,null,ee[ye],E,$);"value"in ee&&l(D,"value",null,ee.value,E),(O=ee.onVnodeBeforeMount)&&pt(O,$,m)}ne&&Gt(m,null,$,"beforeMount");const me=su(I,Q);me&&Q.beforeEnter(D),n(D,v,_),((O=ee&&ee.onVnodeMounted)||me||ne)&&He(()=>{O&&pt(O,$,m),me&&Q.enter(D),ne&&Gt(m,null,$,"mounted")},I)},j=(m,v,_,$,I)=>{if(_&&h(m,_),$)for(let E=0;E<$.length;E++)h(m,$[E]);if(I){let E=I.subTree;if(v===E||Vi(E.type)&&(E.ssContent===v||E.ssFallback===v)){const U=I.vnode;j(m,U,U.scopeId,U.slotScopeIds,I.parent)}}},H=(m,v,_,$,I,E,U,B,D=0)=>{for(let O=D;O{const B=v.el=m.el;let{patchFlag:D,dynamicChildren:O,dirs:ee}=v;D|=m.patchFlag&16;const K=m.props||ke,Q=v.props||ke;let ne;if(_&&qt(_,!1),(ne=Q.onVnodeBeforeUpdate)&&pt(ne,_,v,m),ee&&Gt(v,m,_,"beforeUpdate"),_&&qt(_,!0),O&&(!m.dynamicChildren||m.dynamicChildren.length!==O.length)&&(D=0,U=!1,O=null),(K.innerHTML&&Q.innerHTML==null||K.textContent&&Q.textContent==null)&&u(B,""),O?z(m.dynamicChildren,O,B,_,$,co(v,I),E):U||ie(m,v,B,null,_,$,co(v,I),E,!1),D>0){if(D&16)oe(B,K,Q,_,I);else if(D&2&&K.class!==Q.class&&l(B,"class",null,Q.class,I),D&4&&l(B,"style",K.style,Q.style,I),D&8){const me=v.dynamicProps;for(let ye=0;ye{ne&&pt(ne,_,v,m),ee&&Gt(v,m,_,"updated")},$)},z=(m,v,_,$,I,E,U)=>{for(let B=0;B{if(v!==_){if(v!==ke)for(const E in v)!js(E)&&!(E in _)&&l(m,E,v[E],null,I,$);for(const E in _){if(js(E))continue;const U=_[E],B=v[E];U!==B&&E!=="value"&&l(m,E,B,U,I,$)}"value"in _&&l(m,"value",v.value,_.value,I)}},F=(m,v,_,$,I,E,U,B,D)=>{const O=v.el=m?m.el:i(""),ee=v.anchor=m?m.anchor:i("");let{patchFlag:K,dynamicChildren:Q,slotScopeIds:ne}=v;ne&&(B=B?B.concat(ne):ne),m==null?(n(O,_,$),n(ee,_,$),H(v.children||[],_,ee,I,E,U,B,D)):K>0&&K&64&&Q&&m.dynamicChildren&&m.dynamicChildren.length===Q.length?(z(m.dynamicChildren,Q,_,I,E,U,B),(v.key!=null||I&&v===I.subTree)&&ol(m,v,!0)):ie(m,v,_,ee,I,E,U,B,D)},J=(m,v,_,$,I,E,U,B,D)=>{v.slotScopeIds=B,m==null?v.shapeFlag&512?I.ctx.activate(v,_,$,U,D):P(v,_,$,I,E,U,D):te(m,v,D)},P=(m,v,_,$,I,E,U)=>{const B=m.component=cu(m,$,I);if(Dn(m)&&(B.ctx.renderer=Y),uu(B,!1,U),B.asyncDep){if(I&&I.registerDep(B,ue,U),!m.el){const D=B.subTree=fe(De);T(null,D,v,_),m.placeholder=D.el}}else ue(B,m,v,_,I,E,U)},te=(m,v,_)=>{const $=v.component=m.component;if(Gc(m,v,_))if($.asyncDep&&!$.asyncResolved){se($,v,_);return}else $.next=v,$.update();else v.el=m.el,$.vnode=v},ue=(m,v,_,$,I,E,U)=>{const B=()=>{if(m.isMounted){let{next:K,bu:Q,u:ne,parent:me,vnode:ye}=m;{const ft=Ni(m);if(ft){K&&(K.el=ye.el,se(m,K,U)),ft.asyncDep.then(()=>{He(()=>{m.isUnmounted||O()},I)});return}}let _e=K,$e;qt(m,!1),K?(K.el=ye.el,se(m,K,U)):K=ye,Q&&dn(Q),($e=K.props&&K.props.onVnodeBeforeUpdate)&&pt($e,me,K,ye),qt(m,!0);const Me=Pl(m),ut=m.subTree;m.subTree=Me,w(ut,Me,p(ut.el),A(ut),m,I,E),K.el=Me.el,_e===null&&qc(m,Me.el),ne&&He(ne,I),($e=K.props&&K.props.onVnodeUpdated)&&He(()=>pt($e,me,K,ye),I)}else{let K;const{el:Q,props:ne}=v,{bm:me,m:ye,parent:_e,root:$e,type:Me}=m,ut=ys(v);qt(m,!1),me&&dn(me),!ut&&(K=ne&&ne.onVnodeBeforeMount)&&pt(K,_e,v),qt(m,!0);{$e.ce&&$e.ce._hasShadowRoot()&&$e.ce._injectChildStyle(Me,m.parent?m.parent.type:void 0);const ft=m.subTree=Pl(m);w(null,ft,_,$,m,I,E),v.el=ft.el}if(ye&&He(ye,I),!ut&&(K=ne&&ne.onVnodeMounted)){const ft=v;He(()=>pt(K,_e,ft),I)}(v.shapeFlag&256||_e&&ys(_e.vnode)&&_e.vnode.shapeFlag&256)&&m.a&&He(m.a,I),m.isMounted=!0,v=_=$=null}};m.scope.on();const D=m.effect=new jr(B);m.scope.off();const O=m.update=D.run.bind(D),ee=m.job=D.runIfDirty.bind(D);ee.i=m,ee.id=m.uid,D.scheduler=()=>Xo(ee),qt(m,!0),O()},se=(m,v,_)=>{v.component=m;const $=m.vnode.props;m.vnode=v,m.next=null,Zc(m,v.props,$,_),Xc(m,v.children,_),It(),kl(m),Rt()},ie=(m,v,_,$,I,E,U,B,D=!1)=>{const O=m&&m.children,ee=m?m.shapeFlag:0,K=v.children,{patchFlag:Q,shapeFlag:ne}=v;if(Q>0){if(Q&128){qe(O,K,_,$,I,E,U,B,D);return}else if(Q&256){Fe(O,K,_,$,I,E,U,B,D);return}}ne&8?(ee&16&&tt(O,I,E),K!==O&&u(_,K)):ee&16?ne&16?qe(O,K,_,$,I,E,U,B,D):tt(O,I,E,!0):(ee&8&&u(_,""),ne&16&&H(K,_,$,I,E,U,B,D))},Fe=(m,v,_,$,I,E,U,B,D)=>{m=m||bs,v=v||bs;const O=m.length,ee=v.length,K=Math.min(O,ee);let Q;for(Q=0;Qee?tt(m,I,E,!0,!1,K):H(v,_,$,I,E,U,B,D,K)},qe=(m,v,_,$,I,E,U,B,D)=>{let O=0;const ee=v.length;let K=m.length-1,Q=ee-1;for(;O<=K&&O<=Q;){const ne=m[O],me=v[O]=D?St(v[O]):vt(v[O]);if(es(ne,me))w(ne,me,_,null,I,E,U,B,D);else break;O++}for(;O<=K&&O<=Q;){const ne=m[K],me=v[Q]=D?St(v[Q]):vt(v[Q]);if(es(ne,me))w(ne,me,_,null,I,E,U,B,D);else break;K--,Q--}if(O>K){if(O<=Q){const ne=Q+1,me=neQ)for(;O<=K;)ze(m[O],I,E,!0),O++;else{const ne=O,me=O,ye=new Map;for(O=me;O<=Q;O++){const Ze=v[O]=D?St(v[O]):vt(v[O]);Ze.key!=null&&ye.set(Ze.key,O)}let _e,$e=0;const Me=Q-me+1;let ut=!1,ft=0;const $s=new Array(Me);for(O=0;O=Me){ze(Ze,I,E,!0);continue}let dt;if(Ze.key!=null)dt=ye.get(Ze.key);else for(_e=me;_e<=Q;_e++)if($s[_e-me]===0&&es(Ze,v[_e])){dt=_e;break}dt===void 0?ze(Ze,I,E,!0):($s[dt-me]=O+1,dt>=ft?ft=dt:ut=!0,w(Ze,v[dt],_,null,I,E,U,B,D),$e++)}const ml=ut?nu($s):bs;for(_e=ml.length-1,O=Me-1;O>=0;O--){const Ze=me+O,dt=v[Ze],gl=v[Ze+1],vl=Ze+1{const{el:E,type:U,transition:B,children:D,shapeFlag:O}=m;if(O&6){ct(m.component.subTree,v,_,$);return}if(O&128){m.suspense.move(v,_,$);return}if(O&64){U.move(m,v,_,Y);return}if(U===ae){n(E,v,_);for(let K=0;KB.enter(E),I));else{const{leave:K,delayLeave:Q,afterLeave:ne}=B,me=()=>{m.ctx.isUnmounted?o(E):n(E,v,_)},ye=()=>{const _e=E._isLeaving||!!E[nt];E._isLeaving&&E[nt](!0),B.persisted&&!_e?me():K(E,()=>{me(),ne&&ne()})};Q?Q(E,me,ye):ye()}else n(E,v,_)},ze=(m,v,_,$=!1,I=!1)=>{const{type:E,props:U,ref:B,children:D,dynamicChildren:O,shapeFlag:ee,patchFlag:K,dirs:Q,cacheIndex:ne,memo:me}=m;if(K===-2&&(I=!1),B!=null&&(It(),Us(B,null,_,m,!0),Rt()),ne!=null&&(v.renderCache[ne]=void 0),ee&256){v.ctx.deactivate(m);return}const ye=ee&1&&Q,_e=!ys(m);let $e;if(_e&&($e=U&&U.onVnodeBeforeUnmount)&&pt($e,v,m),ee&6)Kt(m.component,_,$);else{if(ee&128){m.suspense.unmount(_,$);return}ye&&Gt(m,null,v,"beforeUnmount"),ee&64?m.type.remove(m,v,_,Y,$):O&&!O.hasOnce&&(E!==ae||K>0&&K&64)?tt(O,v,_,!1,!0):(E===ae&&K&384||!I&&ee&16)&&tt(D,v,_),$&&us(m)}const Me=me!=null&&ne==null;(_e&&($e=U&&U.onVnodeUnmounted)||ye||Me)&&He(()=>{$e&&pt($e,v,m),ye&&Gt(m,null,v,"unmounted"),Me&&(m.el=null)},_)},us=m=>{const{type:v,el:_,anchor:$,transition:I}=m;if(v===ae){fs(_,$);return}if(v===uo){b(m);return}const E=()=>{o(_),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(m.shapeFlag&1&&I&&!I.persisted){const{leave:U,delayLeave:B}=I,D=()=>U(_,E);B?B(m.el,E,D):D()}else E()},fs=(m,v)=>{let _;for(;m!==v;)_=g(m),o(m),m=_;o(v)},Kt=(m,v,_)=>{const{bum:$,scope:I,job:E,subTree:U,um:B,m:D,a:O}=m;Nl(D),Nl(O),$&&dn($),I.stop(),E&&(E.flags|=8,ze(U,m,v,_)),B&&He(B,v),He(()=>{m.isUnmounted=!0},v)},tt=(m,v,_,$=!1,I=!1,E=0)=>{for(let U=E;U{if(m.shapeFlag&6)return A(m.component.subTree);if(m.shapeFlag&128)return m.suspense.next();const v=g(m.anchor||m.el),_=v&&v[ai];return _?g(_):v};let q=!1;const W=(m,v,_)=>{let $;m==null?v._vnode&&(ze(v._vnode,null,null,!0),$=v._vnode.component):w(v._vnode||null,m,v,null,null,null,_),v._vnode=m,q||(q=!0,kl($),ni(),q=!1)},Y={p:w,um:ze,m:ct,r:us,mt:P,mc:H,pc:ie,pbc:z,n:A,o:e};return{render:W,hydrate:void 0,createApp:Bc(W)}}function co({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function qt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function su(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ol(e,t,s=!1){const n=e.children,o=t.children;if(X(n)&&X(o))for(let l=0;l>1,e[s[i]]0&&(t[n]=s[l-1]),s[l]=n)}}for(l=s.length,r=s[l-1];l-- >0;)s[l]=r,r=t[r];return s}function Ni(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ni(t)}function Nl(e){if(e)for(let t=0;te.__isSuspense;function ou(e,t){t&&t.pendingBranch?X(e)?t.effects.push(...e):t.effects.push(e):dc(e)}const ae=Symbol.for("v-fgt"),Wn=Symbol.for("v-txt"),De=Symbol.for("v-cmt"),uo=Symbol.for("v-stc"),At=[];let Je=null;function k(e=!1){At.push(Je=e?null:[])}function ll(){At.pop(),Je=At[At.length-1]||null}let Js=1;function yn(e,t=!1){Js+=e,e<0&&Je&&t&&(Je.hasOnce=!0)}function ji(e){return e.dynamicChildren=Js>0?Je||bs:null,ll(),Js>0&&Je&&Je.push(e),e}function S(e,t,s,n,o,l){return ji(a(e,t,s,n,o,l,!0))}function Ve(e,t,s,n,o){return ji(fe(e,t,s,n,o,!0))}function Ys(e){return e?e.__v_isVNode===!0:!1}function es(e,t){return e.type===t.type&&e.key===t.key}const Di=({key:e})=>e??null,pn=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Ce(e)||Ee(e)||re(e)?{i:Ne,r:e,k:t,f:!!s}:e:null);function a(e,t=null,s=null,n=0,o=null,l=e===ae?0:1,r=!1,i=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Di(t),ref:t&&pn(t),scopeId:li,slotScopeIds:null,children:s,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:l,patchFlag:n,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Ne};return i?(kn(c,s),l&128&&e.normalize(c)):s&&(c.shapeFlag|=Ce(s)?8:16),Js>0&&!r&&Je&&(c.patchFlag>0||l&6)&&c.patchFlag!==32&&Je.push(c),c}const fe=lu;function lu(e,t=null,s=null,n=0,o=null,l=!1){if((!e||e===xi)&&(e=De),Ys(e)){const i=Wt(e,t,!0);return s&&kn(i,s),Js>0&&!l&&Je&&(i.shapeFlag&6?Je[Je.indexOf(e)]=i:Je.push(i)),i.patchFlag=-2,i}if(mu(e)&&(e=e.__vccOpts),t){t=ru(t);let{class:i,style:c}=t;i&&!Ce(i)&&(t.class=G(i)),be(c)&&(Ln(c)&&!X(c)&&(c=Re({},c)),t.style=sn(c))}const r=Ce(e)?1:Vi(e)?128:jn(e)?64:be(e)?4:re(e)?2:0;return a(e,t,s,n,o,r,l,!0)}function ru(e){return e?Ln(e)||Ai(e)?Re({},e):e:null}function Wt(e,t,s=!1,n=!1){const{props:o,ref:l,patchFlag:r,children:i,transition:c}=e,f=t?Bi(o||{},t):o,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&Di(f),ref:t&&t.ref?s&&l?X(l)?l.concat(pn(t)):[l,pn(t)]:pn(t):l,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ae?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Wt(e.ssContent),ssFallback:e.ssFallback&&Wt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&n&&is(u,c.clone(u)),u}function ce(e=" ",t=0){return fe(Wn,null,e,t)}function le(e="",t=!1){return t?(k(),Ve(De,null,e)):fe(De,null,e)}function vt(e){return e==null||typeof e=="boolean"?fe(De):X(e)?fe(ae,null,e.slice()):Ys(e)?St(e):fe(Wn,null,String(e))}function St(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Wt(e)}function kn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(X(t))s=16;else if(typeof t=="object")if(n&65){const o=t.default;o&&(o._c&&(o._d=!1),kn(e,o()),o._c&&(o._d=!0));return}else{s=32;const o=t._;!o&&!Ai(t)?t._ctx=Ne:o===3&&Ne&&(Ne.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(re(t)){if(n&65){kn(e,{default:t});return}t={default:t,_ctx:Ne},s=32}else t=String(t),n&64?(s=16,t=[ce(t)]):s=8;e.children=t,e.shapeFlag|=s}function Bi(...e){const t={};for(let s=0;sBe||Ne;let wn,Qs;{const e=Mn(),t=(s,n)=>{let o;return(o=e[s])||(o=e[s]=[]),o.push(n),l=>{o.length>1?o.forEach(r=>r(l)):o[0](l)}};wn=t("__VUE_INSTANCE_SETTERS__",s=>Be=s),Qs=t("__VUE_SSR_SETTERS__",s=>Xs=s)}const ln=e=>{const t=Be;return wn(e),e.scope.on(),()=>{e.scope.off(),wn(t)}},Ll=()=>{Be&&Be.scope.off(),wn(null)};function Fi(e){return e.vnode.shapeFlag&4}let Xs=!1;function uu(e,t=!1,s=!1){t&&Qs(t);const{props:n,children:o}=e.vnode,l=Fi(e);zc(e,n,l,t),Qc(e,o,s||t);const r=l?fu(e,t):void 0;return t&&Qs(!1),r}function fu(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Oc);const{setup:n}=s;if(n){It();const o=e.setupContext=n.length>1?pu(e):null,l=ln(e),r=on(n,e,0,[e.props,o]),i=Tr(r);if(Rt(),l(),(i||e.sp)&&!ys(e)&&mi(e),i){if(r.then(Ll,Ll),t)return r.then(c=>{Qs(!0);try{Vl(e,c,t)}finally{Qs(!1)}}).catch(c=>{Vn(c,e,0)});e.asyncDep=r}else Vl(e,r)}else Ui(e)}function Vl(e,t,s){re(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:be(t)&&(e.setupState=ei(t)),Ui(e)}function Ui(e,t,s){const n=e.type;e.render||(e.render=n.render||_t);{const o=ln(e);It();try{Mc(e)}finally{Rt(),o()}}}const du={get(e,t){return je(e,"get",""),e[t]}};function pu(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,du),slots:e.slots,emit:e.emit,expose:t}}function Kn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ei(Qo(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in Hs)return Hs[s](e)},has(t,s){return s in t||s in Hs}})):e.proxy}function hu(e,t=!0){return re(e)?e.displayName||e.name:e.name||t&&e.__name}function mu(e){return re(e)&&"__vccOpts"in e}const he=(e,t)=>ic(e,t,Xs);function rl(e,t,s){try{yn(-1);const n=arguments.length;return n===2?be(t)&&!X(t)?Ys(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(n>3?s=Array.prototype.slice.call(arguments,2):n===3&&Ys(s)&&(s=[s]),fe(e,t,s))}finally{yn(1)}}const gu="3.5.41";let Po;const jl=typeof window<"u"&&window.trustedTypes;if(jl)try{Po=jl.createPolicy("vue",{createHTML:e=>e})}catch{}const Hi=Po?e=>Po.createHTML(e):e=>e,vu="http://www.w3.org/2000/svg",bu="http://www.w3.org/1998/Math/MathML",Ct=typeof document<"u"?document:null,Dl=Ct&&Ct.createElement("template"),xu={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const o=t==="svg"?Ct.createElementNS(vu,e):t==="mathml"?Ct.createElementNS(bu,e):s?Ct.createElement(e,{is:s}):Ct.createElement(e);return e==="select"&&n&&n.multiple!=null&&o.setAttribute("multiple",n.multiple),o},createText:e=>Ct.createTextNode(e),createComment:e=>Ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ct.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,o,l){const r=s?s.previousSibling:t.lastChild;if(o&&(o===l||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),s),!(o===l||!(o=o.nextSibling)););else{Dl.innerHTML=Hi(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const i=Dl.content;if(n==="svg"||n==="mathml"){const c=i.firstChild;for(;c.firstChild;)i.appendChild(c.firstChild);i.removeChild(c)}t.insertBefore(i,s)}return[r?r.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Lt="transition",Rs="animation",ws=Symbol("_vtc"),Wi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ki=Re({},ui,Wi),_u=e=>(e.displayName="Transition",e.props=Ki,e),Cn=_u((e,{slots:t})=>rl(yc,Gi(e),t)),zt=(e,t=[])=>{X(e)?e.forEach(s=>s(...t)):e&&e(...t)},Bl=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Gi(e){const t={};for(const F in e)F in Wi||(t[F]=e[F]);if(e.css===!1)return t;const{name:s="v",type:n,duration:o,enterFromClass:l=`${s}-enter-from`,enterActiveClass:r=`${s}-enter-active`,enterToClass:i=`${s}-enter-to`,appearFromClass:c=l,appearActiveClass:f=r,appearToClass:u=i,leaveFromClass:p=`${s}-leave-from`,leaveActiveClass:g=`${s}-leave-active`,leaveToClass:h=`${s}-leave-to`}=e,C=yu(o),w=C&&C[0],N=C&&C[1],{onBeforeEnter:T,onEnter:y,onEnterCancelled:d,onLeave:b,onLeaveCancelled:x,onBeforeAppear:V=T,onAppear:j=y,onAppearCancelled:H=d}=t,M=(F,J,P,te)=>{F._enterCancelled=te,Bt(F,J?u:i),Bt(F,J?f:r),P&&P()},z=(F,J)=>{F._isLeaving=!1,Bt(F,p),Bt(F,h),Bt(F,g),J&&J()},oe=F=>(J,P)=>{const te=F?j:y,ue=()=>M(J,F,P);zt(te,[J,ue]),Fl(()=>{Bt(J,F?c:l),ht(J,F?u:i),Bl(te)||Ul(J,n,w,ue)})};return Re(t,{onBeforeEnter(F){zt(T,[F]),ht(F,l),ht(F,r)},onBeforeAppear(F){zt(V,[F]),ht(F,c),ht(F,f)},onEnter:oe(!1),onAppear:oe(!0),onLeave(F,J){F._isLeaving=!0;const P=()=>z(F,J);ht(F,p),F._enterCancelled?(ht(F,g),Oo(F)):(Oo(F),ht(F,g)),Fl(()=>{F._isLeaving&&(Bt(F,p),ht(F,h),Bl(b)||Ul(F,n,N,P))}),zt(b,[F,P])},onEnterCancelled(F){M(F,!1,void 0,!0),zt(d,[F])},onAppearCancelled(F){M(F,!0,void 0,!0),zt(H,[F])},onLeaveCancelled(F){z(F),zt(x,[F])}})}function yu(e){if(e==null)return null;if(be(e))return[fo(e.enter),fo(e.leave)];{const t=fo(e);return[t,t]}}function fo(e){return Ta(e)}function ht(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.add(s)),(e[ws]||(e[ws]=new Set)).add(t)}function Bt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.remove(n));const s=e[ws];s&&(s.delete(t),s.size||(e[ws]=void 0))}function Fl(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ku=0;function Ul(e,t,s,n){const o=e._endId=++ku,l=()=>{o===e._endId&&n()};if(s!=null)return setTimeout(l,s);const{type:r,timeout:i,propCount:c}=qi(e,t);if(!r)return n();const f=r+"end";let u=0;const p=()=>{e.removeEventListener(f,g),l()},g=h=>{h.target===e&&++u>=c&&p()};setTimeout(()=>{u(s[C]||"").split(", "),o=n(`${Lt}Delay`),l=n(`${Lt}Duration`),r=Hl(o,l),i=n(`${Rs}Delay`),c=n(`${Rs}Duration`),f=Hl(i,c);let u=null,p=0,g=0;t===Lt?r>0&&(u=Lt,p=r,g=l.length):t===Rs?f>0&&(u=Rs,p=f,g=c.length):(p=Math.max(r,f),u=p>0?r>f?Lt:Rs:null,g=u?u===Lt?l.length:c.length:0);const h=u===Lt&&/\b(?:transform|all)(?:,|$)/.test(n(`${Lt}Property`).toString());return{type:u,timeout:p,propCount:g,hasTransform:h}}function Hl(e,t){for(;e.lengthWl(s)+Wl(e[n])))}function Wl(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Oo(e){return(e?e.ownerDocument:document).body.offsetHeight}function wu(e,t,s){const n=e[ws];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const Sn=Symbol("_vod"),il=Symbol("_vsh"),Kl={name:"show",beforeMount(e,{value:t},{transition:s}){e[Sn]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):Ps(e,t)},mounted(e,{value:t},{transition:s}){s&&t&&s.enter(e)},updated(e,{value:t,oldValue:s},{transition:n}){!t!=!s&&(n?t?(n.beforeEnter(e),Ps(e,!0),n.enter(e)):n.leave(e,()=>{Ps(e,!1)}):Ps(e,t))},beforeUnmount(e,{value:t}){Ps(e,t)}};function Ps(e,t){e.style.display=t?e[Sn]:"none",e[il]=!t}const Cu=Symbol(""),Su=/(?:^|;)\s*display\s*:/;function Eu(e,t,s){const n=e.style,o=Ce(s);let l=!1;if(s&&!o){if(t)if(Ce(t))for(const r of t.split(";")){const i=r.slice(0,r.indexOf(":")).trim();s[i]==null&&Ls(n,i,"")}else for(const r in t)s[r]==null&&Ls(n,r,"");for(const r in s){r==="display"&&(l=!0);const i=s[r];i!=null?$u(e,r,!Ce(t)&&t?t[r]:void 0,i)||Ls(n,r,i):Ls(n,r,"")}}else if(o){if(t!==s){const r=n[Cu];r&&(s+=";"+r),n.cssText=s,l=Su.test(s)}}else t&&e.removeAttribute("style");Sn in e&&(e[Sn]=l?n.display:"",e[il]&&(n.display="none"))}const Gl=/\s*!important$/;function Ls(e,t,s){if(X(s))s.forEach(n=>Ls(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Tu(e,t);Gl.test(s)?e.setProperty(as(n),s.replace(Gl,""),"important"):e[n]=s}}const ql=["Webkit","Moz","ms"],po={};function Tu(e,t){const s=po[t];if(s)return s;let n=Ge(t);if(n!=="filter"&&n in e)return po[t]=n;n=On(n);for(let o=0;oho||(Mu.then(()=>ho=0),ho=Date.now());function Lu(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const o=s.value;if(X(o)){const l=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{l.call(n),n._stopped=!0};const r=o.slice(),i=[n];for(let c=0;ce.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Vu=(e,t,s,n,o,l)=>{const r=o==="svg";t==="class"?wu(e,n,r):t==="style"?Eu(e,s,n):$n(t)?An(t)||Iu(e,t,s,n,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ju(e,t,n,r))?(Jl(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Zl(e,t,n,r,l,t!=="value")):e._isVueCE&&(Du(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Ce(n)))?Jl(e,Ge(t),n,l,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Zl(e,t,n,r))};function ju(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ql(t)&&re(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Ql(t)&&Ce(s)?!1:t in e}function Du(e,t){const s=e._def.props;if(!s)return!1;const n=Ge(t);return Array.isArray(s)?s.some(o=>Ge(o)===n):Object.keys(s).some(o=>Ge(o)===n)}const zi=new WeakMap,Zi=new WeakMap,En=Symbol("_moveCb"),Xl=Symbol("_enterCb"),Bu=e=>(delete e.props.mode,e),Fu=Bu({name:"TransitionGroup",props:Re({},Ki,{tag:String,moveClass:String}),setup(e,{slots:t}){const s=Ts(),n=ci();let o,l;return vi(()=>{if(!o.length)return;const r=e.moveClass||`${e.name||"v"}-move`;if(!Ku(o[0].el,s.vnode.el,r)){o=[];return}o.forEach(Uu),o.forEach(Hu);const i=o.filter(Wu);Oo(s.vnode.el),i.forEach(c=>{const f=c.el,u=f.style;ht(f,r),u.transform=u.webkitTransform=u.transitionDuration="";const p=f[En]=g=>{g&&g.target!==f||(!g||g.propertyName.endsWith("transform"))&&(f.removeEventListener("transitionend",p),f[En]=null,Bt(f,r))};f.addEventListener("transitionend",p)}),o=[]}),()=>{const r=pe(e),i=Gi(r);let c=r.tag||ae;if(o=[],l)for(let f=0;f{i.split(/\s+/).forEach(c=>c&&n.classList.remove(c))}),s.split(/\s+/).forEach(i=>i&&n.classList.add(i)),n.style.display="none";const l=t.nodeType===1?t:t.parentNode;l.appendChild(n);const{hasTransform:r}=qi(n);return l.removeChild(n),r}const Tn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return X(t)?s=>dn(t,s):t};function Gu(e){e.target.composing=!0}function er(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ss=Symbol("_assign"),fn=Symbol("_initialValue");function mo(e,t,s){return t&&(e=e.trim()),s&&(e=Ko(e)),e}const Ae={created(e,{modifiers:{lazy:t,trim:s,number:n}},o){e.parentNode&&(e.type==="text"?e[fn]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[fn]=e.defaultValue.replace(/\r\n?/g,` -`))),e[ss]=Tn(o);const l=n||o.props&&o.props.type==="number";ts(e,t?"change":"input",r=>{r.target.composing||e[ss](mo(e.value,s,l))}),(s||l)&&ts(e,"change",()=>{e.value=mo(e.value,s,l)}),t||(ts(e,"compositionstart",Gu),ts(e,"compositionend",er),ts(e,"change",er))},mounted(e,{value:t,modifiers:{trim:s,number:n}}){const o=t??"",l=e[fn];delete e[fn],l!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==l?e[ss](mo(e.value,s,n)):e.value=o},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:o,number:l}},r){if(e[ss]=Tn(r),e.composing)return;const i=(l||e.type==="number")&&!/^0\d/.test(e.value)?Ko(e.value):e.value,c=t??"";if(i===c)return;const f=e.getRootNode();(f instanceof Document||f instanceof ShadowRoot)&&f.activeElement===e&&e.type!=="range"&&(n&&t===s||o&&e.value.trim()===c)||(e.value=c)}},Zt={deep:!0,created(e,t,s){e[ss]=Tn(s),ts(e,"change",()=>{const n=e._modelValue,o=qu(e),l=e.checked,r=e[ss];if(X(n)){const i=Pr(n,o),c=i!==-1;if(l&&!c)r(n.concat(o));else if(!l&&c){const f=[...n];f.splice(i,1),r(f)}}else if(In(n)){const i=new Set(n);l?i.add(o):i.delete(o),r(i)}else r(Qi(e,l))})},mounted:tr,beforeUpdate(e,t,s){e[ss]=Tn(s),tr(e,t,s)}};function tr(e,{value:t,oldValue:s},n){e._modelValue=t;let o;if(X(t))o=Pr(t,n.props.value)>-1;else if(In(t))o=t.has(n.props.value);else{if(t===s)return;o=nn(t,Qi(e,!0))}e.checked!==o&&(e.checked=o)}function qu(e){return"_value"in e?e._value:e.value}function Qi(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const zu=["ctrl","shift","alt","meta"],Zu={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)=>zu.some(s=>e[`${s}Key`]&&!t.includes(s))},rs=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((o,...l)=>{for(let r=0;r{const t=Yu().createApp(...e),{mount:s}=t;return t.mount=n=>{const o=ef(n);if(!o)return;const l=t._component;!re(l)&&!l.render&&!l.template&&(l.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const r=s(o,!1,Xu(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),r},t});function Xu(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ef(e){return Ce(e)?document.querySelector(e):e}let Xi;const Gn=e=>Xi=e,ea=Symbol();function Mo(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Ws;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Ws||(Ws={}));function tf(){const e=Lr(!0),t=e.run(()=>Z({}));let s=[],n=[];const o=Qo({install(l){Gn(o),o._a=l,l.provide(ea,o),l.config.globalProperties.$pinia=o,n.forEach(r=>s.push(r)),n=[]},use(l){return this._a?s.push(l):n.push(l),this},_p:s,_a:null,_e:e,_s:new Map,state:t});return o}const ta=()=>{};function nr(e,t,s,n=ta){e.add(t);const o=()=>{e.delete(t)&&n()};return!s&&Vr()&&Na(o),o}function ps(e,...t){e.forEach(s=>{s(...t)})}const sf=e=>e(),or=Symbol(),go=Symbol();function No(e,t){e instanceof Map&&t instanceof Map?t.forEach((s,n)=>e.set(n,s)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const s in t){if(!t.hasOwnProperty(s))continue;const n=t[s],o=e[s];Mo(o)&&Mo(n)&&e.hasOwnProperty(s)&&!Ee(n)&&!$t(n)?e[s]=No(o,n):e[s]=n}return e}const nf=Symbol();function of(e){return!Mo(e)||!Object.prototype.hasOwnProperty.call(e,nf)}const{assign:Ft}=Object;function lf(e){return!!(Ee(e)&&e.effect)}function rf(e,t,s,n){const{state:o,actions:l,getters:r}=t,i=s.state.value[e];let c;function f(){i||(s.state.value[e]=o?o():{});const u=nc(s.state.value[e]);return Ft(u,l,Object.keys(r||{}).reduce((p,g)=>(p[g]=Qo(he(()=>{Gn(s);const h=s._s.get(e);return r[g].call(h,h)})),p),{}))}return c=sa(e,f,t,s,n,!0),c}function sa(e,t,s={},n,o,l){let r;const i=Ft({actions:{}},s),c={deep:!0};let f,u,p=new Set,g=new Set,h;const C=n.state.value[e];!l&&!C&&(n.state.value[e]={});let w;function N(H){let M;f=u=!1,typeof H=="function"?(H(n.state.value[e]),M={type:Ws.patchFunction,storeId:e,events:h}):(No(n.state.value[e],H),M={type:Ws.patchObject,payload:H,storeId:e,events:h});const z=w=Symbol();yt().then(()=>{w===z&&(f=!0)}),u=!0,ps(p,M,n.state.value[e])}const T=l?function(){const{state:M}=s,z=M?M():{};this.$patch(oe=>{Ft(oe,z)})}:ta;function y(){r.stop(),p.clear(),g.clear(),n._s.delete(e)}const d=(H,M="")=>{if(or in H)return H[go]=M,H;const z=function(){Gn(n);const oe=Array.from(arguments),F=new Set,J=new Set;function P(se){F.add(se)}function te(se){J.add(se)}ps(g,{args:oe,name:z[go],store:x,after:P,onError:te});let ue;try{ue=H.apply(this&&this.$id===e?this:x,oe)}catch(se){throw ps(J,se),se}return ue instanceof Promise?ue.then(se=>(ps(F,se),se)).catch(se=>(ps(J,se),Promise.reject(se))):(ps(F,ue),ue)};return z[or]=!0,z[go]=M,z},b={_p:n,$id:e,$onAction:nr.bind(null,g),$patch:N,$reset:T,$subscribe(H,M={}){const z=nr(p,H,M.detached,()=>oe()),oe=r.run(()=>Le(()=>n.state.value[e],F=>{(M.flush==="sync"?u:f)&&H({storeId:e,type:Ws.direct,events:h},F)},Ft({},c,M)));return z},$dispose:y},x=Pt(b);n._s.set(e,x);const j=(n._a&&n._a.runWithContext||sf)(()=>n._e.run(()=>(r=Lr()).run(()=>t({action:d}))));for(const H in j){const M=j[H];if(Ee(M)&&!lf(M)||$t(M))l||(C&&of(M)&&(Ee(M)?M.value=C[H]:No(M,C[H])),n.state.value[e][H]=M);else if(typeof M=="function"){const z=d(M,H);j[H]=z,i.actions[H]=M}}return Ft(x,j),Ft(pe(x),j),Object.defineProperty(x,"$state",{get:()=>n.state.value[e],set:H=>{N(M=>{Ft(M,H)})}}),n._p.forEach(H=>{Ft(x,r.run(()=>H({store:x,app:n._a,pinia:n,options:i})))}),C&&l&&s.hydrate&&s.hydrate(x.$state,C),f=!0,u=!0,x}function al(e,t,s){let n;const o=typeof t=="function";n=o?s:t;function l(r,i){const c=pc();return r=r||(c?Qe(ea,null):null),r&&Gn(r),r=Xi,r._s.has(e)||(o?sa(e,t,n,r):rf(e,n,r)),r._s.get(e)}return l.$id=e,l}const vs=typeof document<"u";function na(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function af(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&na(e.default)}const ge=Object.assign;function vo(e,t){const s={};for(const n in t){const o=t[n];s[n]=it(o)?o.map(e):e(o)}return s}const Ks=()=>{},it=Array.isArray;function lr(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}const oa=/#/g,cf=/&/g,uf=/\//g,ff=/=/g,df=/\?/g,la=/\+/g,pf=/%5B/g,hf=/%5D/g,ra=/%5E/g,mf=/%60/g,ia=/%7B/g,gf=/%7C/g,aa=/%7D/g,vf=/%20/g;function cl(e){return e==null?"":encodeURI(""+e).replace(gf,"|").replace(pf,"[").replace(hf,"]")}function bf(e){return cl(e).replace(ia,"{").replace(aa,"}").replace(ra,"^")}function Lo(e){return cl(e).replace(la,"%2B").replace(vf,"+").replace(oa,"%23").replace(cf,"%26").replace(mf,"`").replace(ia,"{").replace(aa,"}").replace(ra,"^")}function xf(e){return Lo(e).replace(ff,"%3D")}function _f(e){return cl(e).replace(oa,"%23").replace(df,"%3F")}function yf(e){return _f(e).replace(uf,"%2F")}function en(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const kf=/\/$/,wf=e=>e.replace(kf,"");function bo(e,t,s="/"){let n,o={},l="",r="";const i=t.indexOf("#");let c=t.indexOf("?");return c=i>=0&&c>i?-1:c,c>=0&&(n=t.slice(0,c),l=t.slice(c,i>0?i:t.length),o=e(l.slice(1))),i>=0&&(n=n||t.slice(0,i),r=t.slice(i,t.length)),n=Tf(n??t,s),{fullPath:n+l+r,path:n,query:o,hash:en(r)}}function Cf(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function rr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Sf(e,t,s){const n=t.matched.length-1,o=s.matched.length-1;return n>-1&&n===o&&Cs(t.matched[n],s.matched[o])&&ca(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function Cs(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ca(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var s in e)if(!Ef(e[s],t[s]))return!1;return!0}function Ef(e,t){return it(e)?ir(e,t):it(t)?ir(t,e):e?.valueOf()===t?.valueOf()}function ir(e,t){return it(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function Tf(e,t){if(e.startsWith("/"))return e;if(!e)return t;const s=t.split("/"),n=e.split("/"),o=n[n.length-1];(o===".."||o===".")&&n.push("");let l=s.length-1,r,i;for(r=0;r1&&l--;else break;return s.slice(0,l).join("/")+"/"+n.slice(r).join("/")}const Vt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Vo=(function(e){return e.pop="pop",e.push="push",e})({}),xo=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function $f(e){if(!e)if(vs){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),wf(e)}const Af=/^[^#]+#/;function If(e,t){return e.replace(Af,"#")+t}function Rf(e,t){const s=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-s.left-(t.left||0),top:n.top-s.top-(t.top||0)}}const qn=()=>({left:window.scrollX,top:window.scrollY});function Pf(e){let t;if("el"in e){const s=e.el,n=typeof s=="string"&&s.startsWith("#"),o=typeof s=="string"?n?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!o)return;t=Rf(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function ar(e,t){return(history.state?history.state.position-t:-1)+e}const jo=new Map;function Of(e,t){jo.set(e,t)}function Mf(e){const t=jo.get(e);return jo.delete(e),t}function Nf(e){return typeof e=="string"||e&&typeof e=="object"}function ua(e){return typeof e=="string"||typeof e=="symbol"}let Se=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({});const fa=Symbol("");Se.MATCHER_NOT_FOUND+"",Se.NAVIGATION_GUARD_REDIRECT+"",Se.NAVIGATION_ABORTED+"",Se.NAVIGATION_CANCELLED+"",Se.NAVIGATION_DUPLICATED+"";function Ss(e,t){return ge(new Error,{type:e,[fa]:!0},t)}function wt(e,t){return e instanceof Error&&fa in e&&(t==null||!!(e.type&t))}const Lf=["params","query","hash"];function Vf(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const s of Lf)s in e&&(t[s]=e[s]);return JSON.stringify(t,null,2)}function jf(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let n=0;no&&Lo(o)):[n&&Lo(n)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+s,o!=null&&(t+="="+o))})}return t}function Df(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=it(n)?n.map(o=>o==null?null:""+o):n==null?n:""+n)}return t}const Bf=Symbol(""),ur=Symbol(""),zn=Symbol(""),ul=Symbol(""),Do=Symbol("");function Os(){let e=[];function t(n){return e.push(n),()=>{const o=e.indexOf(n);o>-1&&e.splice(o,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function Ht(e,t,s,n,o,l=r=>r()){const r=n&&(n.enterCallbacks[o]=n.enterCallbacks[o]||[]);return()=>new Promise((i,c)=>{const f=g=>{g===!1?c(Ss(Se.NAVIGATION_ABORTED,{from:s,to:t})):g instanceof Error?c(g):Nf(g)?c(Ss(Se.NAVIGATION_GUARD_REDIRECT,{from:t,to:g})):(r&&n.enterCallbacks[o]===r&&typeof g=="function"&&r.push(g),i())},u=l(()=>e.call(n&&n.instances[o],t,s,f));let p=Promise.resolve(u);e.length<3&&(p=p.then(f)),p.catch(g=>c(g))})}function _o(e,t,s,n,o=l=>l()){const l=[];for(const r of e)for(const i in r.components){let c=r.components[i];if(!(t!=="beforeRouteEnter"&&!r.instances[i]))if(na(c)){const f=(c.__vccOpts||c)[t];f&&l.push(Ht(f,s,n,r,i,o))}else{let f=c();l.push(()=>f.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${i}" at "${r.path}"`);const p=af(u)?u.default:u;r.mods[i]=u,r.components[i]=p;const g=(p.__vccOpts||p)[t];return g&&Ht(g,s,n,r,i,o)()}))}}return l}function Ff(e,t){const s=[],n=[],o=[],l=Math.max(t.matched.length,e.matched.length);for(let r=0;rCs(f,i))?n.push(i):s.push(i));const c=e.matched[r];c&&(t.matched.find(f=>Cs(f,c))||o.push(c))}return[s,n,o]}let Uf=()=>location.protocol+"//"+location.host;function da(e,t){const{pathname:s,search:n,hash:o}=t,l=e.indexOf("#");if(l>-1){let r=o.includes(e.slice(l))?e.slice(l).length:1,i=o.slice(r);return i[0]!=="/"&&(i="/"+i),rr(i,"")}return rr(s,e)+n+o}function Hf(e,t,s,n){let o=[],l=[],r=null;const i=({state:g})=>{const h=da(e,location),C=s.value,w=t.value;let N=0;if(g){if(s.value=h,t.value=g,r&&r===C){r=null;return}N=w?g.position-w.position:0}else n(h);o.forEach(T=>{T(s.value,C,{delta:N,type:Vo.pop,direction:N?N>0?xo.forward:xo.back:xo.unknown})})};function c(){r=s.value}function f(g){o.push(g);const h=()=>{const C=o.indexOf(g);C>-1&&o.splice(C,1)};return l.push(h),h}function u(){if(document.visibilityState==="hidden"){const{history:g}=window;if(!g.state)return;g.replaceState(ge({},g.state,{scroll:qn()}),"")}}function p(){for(const g of l)g();l=[],window.removeEventListener("popstate",i),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",i),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:c,listen:f,destroy:p}}function fr(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?qn():null}}function Wf(e){const{history:t,location:s}=window,n={value:da(e,s)},o={value:t.state};o.value||l(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function l(c,f,u){const p=e.indexOf("#"),g=p>-1?(s.host&&document.querySelector("base")?e:e.slice(p))+c:Uf()+e+c;try{t[u?"replaceState":"pushState"](f,"",g),o.value=f}catch(h){console.error(h),s[u?"replace":"assign"](g)}}function r(c,f){l(c,ge({},t.state,fr(o.value.back,c,o.value.forward,!0),f,{position:o.value.position}),!0),n.value=c}function i(c,f){const u=ge({},o.value,t.state,{forward:c,scroll:qn()});l(u.current,u,!0),l(c,ge({},fr(n.value,c,null),{position:u.position+1},f),!1),n.value=c}return{location:n,state:o,push:i,replace:r}}function Kf(e){e=$f(e);const t=Wf(e),s=Hf(e,t.state,t.location,t.replace);function n(l,r=!0){r||s.pauseListeners(),history.go(l)}const o=ge({location:"",base:e,go:n,createHref:If.bind(null,e)},t,s);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Gf(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Kf(e)}let ns=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Pe=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Pe||{});const qf={type:ns.Static,value:""},zf=/[a-zA-Z0-9_]/;function Zf(e){if(!e)return[[]];if(e==="/")return[[qf]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(h){throw new Error(`ERR (${s})/"${f}": ${h}`)}let s=Pe.Static,n=s;const o=[];let l;function r(){l&&o.push(l),l=[]}let i=0,c,f="",u="";function p(){f&&(s===Pe.Static?l.push({type:ns.Static,value:f}):s===Pe.Param||s===Pe.ParamRegExp||s===Pe.ParamRegExpEnd?(l.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),l.push({type:ns.Param,value:f,regexp:u,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),f="")}function g(){f+=c}for(;it.length?t.length===1&&t[0]===We.Static+We.Segment?1:-1:0}function pa(e,t){let s=0;const n=e.score,o=t.score;for(;s0&&t[t.length-1]<0}const ed={strict:!1,end:!0,sensitive:!1};function td(e,t,s){const n=Qf(Zf(e.path),s),o=ge(n,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function sd(e,t){const s=[],n=new Map;t=lr(ed,t);function o(p){return n.get(p)}function l(p,g,h){const C=!h,w=mr(p);w.aliasOf=h&&h.record;const N=lr(t,p),T=[w];if("alias"in p){const b=typeof p.alias=="string"?[p.alias]:p.alias;for(const x of b)T.push(mr(ge({},w,{components:h?h.record.components:w.components,path:x,aliasOf:h?h.record:w})))}let y,d;for(const b of T){const{path:x}=b;if(g&&x[0]!=="/"){const V=g.record.path,j=V[V.length-1]==="/"?"":"/";b.path=g.record.path+(x&&j+x)}if(y=td(b,g,N),h?h.alias.push(y):(d=d||y,d!==y&&d.alias.push(y),C&&p.name&&!gr(y)&&r(p.name)),ha(y)&&c(y),w.children){const V=w.children;for(let j=0;j{r(d)}:Ks}function r(p){if(ua(p)){const g=n.get(p);g&&(n.delete(p),s.splice(s.indexOf(g),1),g.children.forEach(r),g.alias.forEach(r))}else{const g=s.indexOf(p);g>-1&&(s.splice(g,1),p.record.name&&n.delete(p.record.name),p.children.forEach(r),p.alias.forEach(r))}}function i(){return s}function c(p){const g=ld(p,s);s.splice(g,0,p),p.record.name&&!gr(p)&&n.set(p.record.name,p)}function f(p,g){let h,C={},w,N;if("name"in p&&p.name){if(h=n.get(p.name),!h)throw Ss(Se.MATCHER_NOT_FOUND,{location:p});N=h.record.name,C=ge(hr(g.params,h.keys.filter(d=>!d.optional).concat(h.parent?h.parent.keys.filter(d=>d.optional):[]).map(d=>d.name)),p.params&&hr(p.params,h.keys.map(d=>d.name))),w=h.stringify(C)}else if(p.path!=null)w=p.path,h=s.find(d=>d.re.test(w)),h&&(C=h.parse(w),N=h.record.name);else{if(h=g.name?n.get(g.name):s.find(d=>d.re.test(g.path)),!h)throw Ss(Se.MATCHER_NOT_FOUND,{location:p,currentLocation:g});N=h.record.name,C=ge({},g.params,p.params),w=h.stringify(C)}const T=[];let y=h;for(;y;)T.unshift(y.record),y=y.parent;return{name:N,path:w,params:C,matched:T,meta:od(T)}}e.forEach(p=>l(p));function u(){s.length=0,n.clear()}return{addRoute:l,resolve:f,removeRoute:r,clearRoutes:u,getRoutes:i,getRecordMatcher:o}}function hr(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function mr(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:nd(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function nd(e){const t={},s=e.props||!1;if("component"in e)t.default=s;else for(const n in e.components)t[n]=typeof s=="object"?s[n]:s;return t}function gr(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function od(e){return e.reduce((t,s)=>ge(t,s.meta),{})}function ld(e,t){let s=0,n=t.length;for(;s!==n;){const l=s+n>>1;pa(e,t[l])<0?n=l:s=l+1}const o=rd(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function rd(e){let t=e;for(;t=t.parent;)if(ha(t)&&pa(e,t)===0)return t}function ha({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function vr(e){const t=Qe(zn),s=Qe(ul),n=he(()=>{const c=R(e.to);return t.resolve(c)}),o=he(()=>{const{matched:c}=n.value,{length:f}=c,u=c[f-1],p=s.matched;if(!u||!p.length)return-1;const g=p.findIndex(Cs.bind(null,u));if(g>-1)return g;const h=br(c[f-2]);return f>1&&br(u)===h&&p[p.length-1].path!==h?p.findIndex(Cs.bind(null,c[f-2])):g}),l=he(()=>o.value>-1&&fd(s.params,n.value.params)),r=he(()=>o.value>-1&&o.value===s.matched.length-1&&ca(s.params,n.value.params));function i(c={}){if(ud(c)){const f=t[R(e.replace)?"replace":"push"](R(e.to)).catch(Ks);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:n,href:he(()=>n.value.href),isActive:l,isExactActive:r,navigate:i}}function id(e){return e.length===1?e[0]:e}const ad=hi({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:vr,setup(e,{slots:t}){const s=Pt(vr(e)),{options:n}=Qe(zn),o=he(()=>({[xr(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[xr(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const l=t.default&&id(t.default(s));return e.custom?l:rl("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},l)}}}),cd=ad;function ud(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function fd(e,t){for(const s in t){const n=t[s],o=e[s];if(typeof n=="string"){if(n!==o)return!1}else if(!it(o)||o.length!==n.length||n.some((l,r)=>l.valueOf()!==o[r].valueOf()))return!1}return!0}function br(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const xr=(e,t,s)=>e??t??s,dd=hi({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=Qe(Do),o=he(()=>e.route||n.value),l=Qe(ur,0),r=he(()=>{let f=R(l);const{matched:u}=o.value;let p;for(;(p=u[f])&&!p.components;)f++;return f}),i=he(()=>o.value.matched[r.value]);Fs(ur,he(()=>r.value+1)),Fs(Bf,i),Fs(Do,o);const c=Z();return Le(()=>[c.value,i.value,e.name],([f,u,p],[g,h,C])=>{u&&(u.instances[p]=f,h&&h!==u&&f&&f===g&&(u.leaveGuards.size||(u.leaveGuards=h.leaveGuards),u.updateGuards.size||(u.updateGuards=h.updateGuards))),f&&u&&(!h||!Cs(u,h)||!g)&&(u.enterCallbacks[p]||[]).forEach(w=>w(f))},{flush:"post"}),()=>{const f=o.value,u=e.name,p=i.value,g=p&&p.components[u];if(!g)return _r(s.default,{Component:g,route:f});const h=p.props[u],C=h?h===!0?f.params:typeof h=="function"?h(f):h:null,N=rl(g,ge({},C,t,{onVnodeUnmounted:T=>{T.component.isUnmounted&&(p.instances[u]=null)},ref:c}));return _r(s.default,{Component:N,route:f})||N}}});function _r(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const pd=dd;function hd(e){const t=sd(e.routes,e),s=e.parseQuery||jf,n=e.stringifyQuery||cr,o=e.history,l=Os(),r=Os(),i=Os(),c=ec(Vt);let f=Vt;vs&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=vo.bind(null,A=>""+A),p=vo.bind(null,yf),g=vo.bind(null,en);function h(A,q){let W,Y;return ua(A)?(W=t.getRecordMatcher(A),Y=q):Y=A,t.addRoute(Y,W)}function C(A){const q=t.getRecordMatcher(A);q&&t.removeRoute(q)}function w(){return t.getRoutes().map(A=>A.record)}function N(A){return!!t.getRecordMatcher(A)}function T(A,q){if(q=ge({},q||c.value),typeof A=="string"){const _=bo(s,A,q.path),$=t.resolve({path:_.path},q),I=o.createHref(_.fullPath);return ge(_,$,{params:g($.params),hash:en(_.hash),redirectedFrom:void 0,href:I})}let W;if(A.path!=null)W=ge({},A,{path:bo(s,A.path,q.path).path});else{const _=ge({},A.params);for(const $ in _)_[$]==null&&delete _[$];W=ge({},A,{params:p(_)}),q.params=p(q.params)}const Y=t.resolve(W,q),de=A.hash||"";Y.params=u(g(Y.params));const m=Cf(n,ge({},A,{hash:bf(de),path:Y.path})),v=o.createHref(m);return ge({fullPath:m,hash:de,query:n===cr?Df(A.query):A.query||{}},Y,{redirectedFrom:void 0,href:v})}function y(A){return typeof A=="string"?bo(s,A,c.value.path):ge({},A)}function d(A,q){if(f!==A)return Ss(Se.NAVIGATION_CANCELLED,{from:q,to:A})}function b(A){return j(A)}function x(A){return b(ge(y(A),{replace:!0}))}function V(A,q){const W=A.matched[A.matched.length-1];if(W&&W.redirect){const{redirect:Y}=W;let de=typeof Y=="function"?Y(A,q):Y;return typeof de=="string"&&(de=de.includes("?")||de.includes("#")?de=y(de):{path:de},de.params={}),ge({query:A.query,hash:A.hash,params:de.path!=null?{}:A.params},de)}}function j(A,q){const W=f=T(A),Y=c.value,de=A.state,m=A.force,v=A.replace===!0,_=V(W,Y);if(_)return j(ge(y(_),{state:typeof _=="object"?ge({},de,_.state):de,force:m,replace:v}),q||W);const $=W;$.redirectedFrom=q;let I;return!m&&Sf(n,Y,W)&&(I=Ss(Se.NAVIGATION_DUPLICATED,{to:$,from:Y}),ct(Y,Y,!0,!1)),(I?Promise.resolve(I):z($,Y)).catch(E=>wt(E)?wt(E,Se.NAVIGATION_GUARD_REDIRECT)?E:qe(E):ie(E,$,Y)).then(E=>{if(E){if(wt(E,Se.NAVIGATION_GUARD_REDIRECT))return j(ge({replace:v},y(E.to),{state:typeof E.to=="object"?ge({},de,E.to.state):de,force:m}),q||$)}else E=F($,Y,!0,v,de);return oe($,Y,E),E})}function H(A,q){const W=d(A,q);return W?Promise.reject(W):Promise.resolve()}function M(A){const q=fs.values().next().value;return q&&typeof q.runWithContext=="function"?q.runWithContext(A):A()}function z(A,q){let W;const[Y,de,m]=Ff(A,q);W=_o(Y.reverse(),"beforeRouteLeave",A,q);for(const _ of Y)_.leaveGuards.forEach($=>{W.push(Ht($,A,q))});const v=H.bind(null,A,q);return W.push(v),tt(W).then(()=>{W=[];for(const _ of l.list())W.push(Ht(_,A,q));return W.push(v),tt(W)}).then(()=>{W=_o(de,"beforeRouteUpdate",A,q);for(const _ of de)_.updateGuards.forEach($=>{W.push(Ht($,A,q))});return W.push(v),tt(W)}).then(()=>{W=[];for(const _ of m)if(_.beforeEnter)if(it(_.beforeEnter))for(const $ of _.beforeEnter)W.push(Ht($,A,q));else W.push(Ht(_.beforeEnter,A,q));return W.push(v),tt(W)}).then(()=>(A.matched.forEach(_=>_.enterCallbacks={}),W=_o(m,"beforeRouteEnter",A,q,M),W.push(v),tt(W))).then(()=>{W=[];for(const _ of r.list())W.push(Ht(_,A,q));return W.push(v),tt(W)}).catch(_=>wt(_,Se.NAVIGATION_CANCELLED)?_:Promise.reject(_))}function oe(A,q,W){i.list().forEach(Y=>M(()=>Y(A,q,W)))}function F(A,q,W,Y,de){const m=d(A,q);if(m)return m;const v=q===Vt,_=vs?history.state:{};W&&(Y||v?o.replace(A.fullPath,ge({scroll:v&&_&&_.scroll},de)):o.push(A.fullPath,de)),c.value=A,ct(A,q,W,v),qe()}let J;function P(){J||(J=o.listen((A,q,W)=>{if(!Kt.listening)return;const Y=T(A),de=V(Y,Kt.currentRoute.value);if(de){j(ge(de,{replace:!0,force:!0}),Y).catch(Ks);return}f=Y;const m=c.value;vs&&Of(ar(m.fullPath,W.delta),qn()),z(Y,m).catch(v=>wt(v,Se.NAVIGATION_ABORTED|Se.NAVIGATION_CANCELLED)?v:wt(v,Se.NAVIGATION_GUARD_REDIRECT)?(j(ge(y(v.to),{force:!0}),Y).then(_=>{wt(_,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&!W.delta&&W.type===Vo.pop&&o.go(-1,!1)}).catch(Ks),Promise.reject()):(W.delta&&o.go(-W.delta,!1),ie(v,Y,m))).then(v=>{v=v||F(Y,m,!1),v&&(W.delta&&!wt(v,Se.NAVIGATION_CANCELLED)?o.go(-W.delta,!1):W.type===Vo.pop&&wt(v,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),oe(Y,m,v)}).catch(Ks)}))}let te=Os(),ue=Os(),se;function ie(A,q,W){qe(A);const Y=ue.list();return Y.length?Y.forEach(de=>de(A,q,W)):console.error(A),Promise.reject(A)}function Fe(){return se&&c.value!==Vt?Promise.resolve():new Promise((A,q)=>{te.add([A,q])})}function qe(A){return se||(se=!A,P(),te.list().forEach(([q,W])=>A?W(A):q()),te.reset()),A}function ct(A,q,W,Y){const{scrollBehavior:de}=e;if(!vs||!de)return Promise.resolve();const m=!W&&Mf(ar(A.fullPath,0))||(Y||!W)&&history.state&&history.state.scroll||null;return yt().then(()=>de(A,q,m)).then(v=>v&&Pf(v)).catch(v=>ie(v,A,q))}const ze=A=>o.go(A);let us;const fs=new Set,Kt={currentRoute:c,listening:!0,addRoute:h,removeRoute:C,clearRoutes:t.clearRoutes,hasRoute:N,getRoutes:w,resolve:T,options:e,push:b,replace:x,go:ze,back:()=>ze(-1),forward:()=>ze(1),beforeEach:l.add,beforeResolve:r.add,afterEach:i.add,onError:ue.add,isReady:Fe,install(A){A.component("RouterLink",cd),A.component("RouterView",pd),A.config.globalProperties.$router=Kt,Object.defineProperty(A.config.globalProperties,"$route",{enumerable:!0,get:()=>R(c)}),vs&&!us&&c.value===Vt&&(us=!0,b(o.location).catch(Y=>{}));const q={};for(const Y in Vt)Object.defineProperty(q,Y,{get:()=>c.value[Y],enumerable:!0});A.provide(zn,Kt),A.provide(ul,Qr(q)),A.provide(Do,c);const W=A.unmount;fs.add(A),A.unmount=function(){fs.delete(A),fs.size<1&&(f=Vt,J&&J(),J=null,c.value=Vt,us=!1,se=!1),W()}}};function tt(A){return A.reduce((q,W)=>q.then(()=>M(W)),Promise.resolve())}return Kt}function md(){return Qe(zn)}function ma(e){return Qe(ul)}const Zn="vnt-web-access-token",bt=!!globalThis.__VNT_DESKTOP__,Vs=new URL(window.location.href),Bo=Vs.searchParams.get("token")||"";Bo&&(localStorage.setItem(Zn,Bo),Vs.searchParams.delete("token"),window.history.replaceState({},"",`${Vs.pathname}${Vs.search}${Vs.hash}`));const Jn=Z(bt?"":Bo||localStorage.getItem(Zn)||""),fl=Z(bt||!!Jn.value),ga=()=>Jn.value,gd=e=>{const t=e.trim();localStorage.setItem(Zn,t),Jn.value=t,fl.value=!!t},vd=()=>{localStorage.removeItem(Zn),Jn.value="",fl.value=!1},et=async(e,t={})=>{if(globalThis.__VNT_IPC_REQUEST__){const r=await globalThis.__VNT_IPC_REQUEST__({method:t.method||"GET",path:e,body:t.body||null});if(r.code!==0)throw new Error(r.msg||"请求失败");return r.data}const s=new Headers(t.headers||{}),n=ga();n&&s.set("Authorization",`Bearer ${n}`);const o=await fetch(e,{...t,headers:s}),l=await o.json();if(o.status===401&&vd(),l.code!==0)throw new Error(l.msg||"请求失败");return l.data},va={"Content-Type":"application/json"},bd=e=>et(`/api/info?file_name=${encodeURIComponent(e)}`),xd=e=>et(`/api/peers?file_name=${encodeURIComponent(e)}`),_d=e=>et(`/api/routes?file_name=${encodeURIComponent(e)}`),yd=e=>et(`/api/start/status?file_name=${encodeURIComponent(e)}`),ba=()=>et("/api/version"),yr=()=>et("/api/runtime"),kd=()=>et("/api/instances"),wd=e=>et(`/api/instance?file_name=${encodeURIComponent(e)}`,{method:"DELETE"}),dl=(e,t)=>et(e,{method:"POST",headers:va,body:JSON.stringify({file_name:t})}),Cd=e=>dl("/api/start",e),xa=e=>dl("/api/stop",e),Sd=e=>dl("/api/restart",e),Ed=()=>et("/api/config/list"),Td=e=>et(`/api/config?file_name=${encodeURIComponent(e)}`),$d=(e,t)=>et("/api/config",{method:"POST",headers:va,body:JSON.stringify({file_name:e||null,config:t})}),Ad=e=>et(`/api/config?file_name=${encodeURIComponent(e)}`,{method:"DELETE"});let Id=0;const cs=al("ui",()=>{const e=Z([]),t=(i,c,f=3e3)=>{const u=++Id;e.value.push({id:u,type:i,message:c}),setTimeout(()=>{e.value=e.value.filter(p=>p.id!==u)},f)},s={success:i=>t("success",i),error:i=>t("error",i,4500),info:i=>t("info",i)},n=Pt({show:!1,title:"",message:"",danger:!1,confirmText:"确定",resolve:null});return{toasts:e,toast:s,confirmState:n,confirm:({title:i="确认操作",message:c="",danger:f=!1,confirmText:u="确定"}={})=>new Promise(p=>{n.show=!0,n.title=i,n.message=c,n.danger=f,n.confirmText=u,n.resolve=p}),confirmOk:()=>{n.show=!1,n.resolve&&n.resolve(!0),n.resolve=null},confirmCancel:()=>{n.show=!1,n.resolve&&n.resolve(!1),n.resolve=null}}}),_a=al("startLog",()=>{const e=Z(!1),t=Z([]),s=Z("stopped"),n=Z(null),o=Z(null);let l=null,r=null,i=null,c=null;const f=({fetchInstances:T,instanceList:y,configList:d})=>{r=T,i=y,c=d},u=he(()=>{if(!n.value)return"";const T=(i?.value||[]).find(d=>d.file_name===n.value);if(T)return T.config_name||T.file_name;const y=(c?.value||[]).find(d=>d.file_name===n.value);return y?y.config_name||y.file_name:n.value}),p=async()=>{if(n.value)try{const T=await yd(n.value);t.value=T.logs||[],s.value=T.status,yt(()=>{o.value&&(o.value.scrollTop=o.value.scrollHeight)}),s.value==="running"?(g(),r&&r(),e.value=!1):s.value==="stopped"&&t.value.length>0&&(g(),r&&r())}catch(T){console.error(T)}},g=()=>{l&&(clearInterval(l),l=null)},h=()=>{g(),l=setInterval(p,1e3),p()};return{showStartLog:e,startLogs:t,startStatus:s,logFileName:n,logContainer:o,logConfigName:u,bindApp:f,openStartLog:T=>{n.value=T,t.value=[],s.value="starting",e.value=!0,h()},pollStartStatus:p,startPolling:h,stopPolling:g,cancelStart:async()=>{g();const T=n.value;if(T)try{await xa(T),t.value.push("启动已手动取消")}catch{}s.value="stopped",r&&r()},close:()=>{e.value=!1}}}),Nt=al("app",()=>{const e=cs(),t=_a(),s=Z({}),n=Z([]),o=Z(null),l=Z([]),r=Z({}),i=Z({}),c=Z(!document.hidden),f=()=>{c.value=!document.hidden};let u=null;const p=he(()=>n.value.filter(P=>P.status==="running").length),g=he(()=>n.value.filter(P=>P.status==="starting").length),h=he(()=>p.value>0?`运行中 x${p.value}`:g.value>0?"启动中...":"未启动"),C=he(()=>o.value&&s.value[o.value]||null),w=he(()=>{if(!o.value)return"";const P=n.value.find(te=>te.file_name===o.value);return P?P.config_name||P.file_name:o.value}),N=Z(""),T=async()=>{try{N.value=await ba()||""}catch(P){console.error("Fetch version error",P)}},y=he(()=>!!(C.value&&C.value.server_info&&C.value.server_info.some(P=>P.connected))),d=he(()=>{const P=C.value;return!P||!P.server_info||!P.server_info.length?"未配置服务器":`${P.server_info.filter(te=>te.connected).length} / ${P.server_info.length} 已连接`}),b=P=>s.value[P]||{},x=async P=>{try{s.value[P]=await bd(P)}catch(te){console.error("Fetch info error",te)}},V=async()=>{try{const P=await kd()||[];n.value=P;for(const te of Object.keys(s.value))P.some(ue=>ue.file_name===te)||delete s.value[te];for(const te of Object.keys(i.value)){const ue=P.find(se=>se.file_name===te);(!ue||ue.status==="stopped")&&delete i.value[te]}if(!o.value||!P.some(te=>te.file_name===o.value)){const te=P.find(ue=>ue.status==="running");o.value=te?te.file_name:P.length>0?P[0].file_name:null}for(const te of P)te.status==="running"&&x(te.file_name)}catch(P){console.error("Fetch instances error",P)}},j=async()=>{try{l.value=await Ed()||[]}catch(P){console.error("Fetch list error",P)}},H=async P=>{if(!P){e.toast.error("请先选择一个配置");return}if(!r.value[P]){r.value[P]=!0;try{await Cd(P),t.openStartLog(P),V()}catch(te){e.toast.error("启动失败: "+te.message)}finally{r.value[P]=!1}}},M=async P=>{if(!(!P||r.value[P])){r.value[P]=!0,i.value[P]=!0;try{await xa(P),e.toast.success("已停止"),t.logFileName===P&&(t.stopPolling(),t.showStartLog=!1),V()}catch(te){e.toast.error("停止失败: "+te.message),console.error(te),delete i.value[P]}finally{r.value[P]=!1}}},z=async P=>{if(!(!P||r.value[P])){r.value[P]=!0;try{await Sd(P),t.openStartLog(P),V()}catch(te){e.toast.error("重启失败: "+te.message)}finally{r.value[P]=!1}}},oe=async P=>{if(!(!P||r.value[P])){r.value[P]=!0;try{await wd(P),e.toast.success("已移除"),t.logFileName===P&&(t.stopPolling(),t.showStartLog=!1),o.value===P&&(o.value=null),V()}catch(te){e.toast.error("移除失败: "+te.message)}finally{r.value[P]=!1}}};t.bindApp({fetchInstances:V,instanceList:n,configList:l});const F=async()=>{if(!bt&&!ga())return;document.addEventListener("visibilitychange",f),T(),await V(),j();const P=n.value.find(te=>te.status==="starting");P&&t.openStartLog(P.file_name),u=setInterval(()=>{c.value&&V()},3e3)},J=()=>{document.removeEventListener("visibilitychange",f),t.stopPolling(),u&&clearInterval(u)};return Ts()&&(at(F),Es(J)),{instances:s,instanceList:n,selectedInstance:o,configList:l,loadingMap:r,stoppingMap:i,isPageVisible:c,runningCount:p,startingCount:g,headerStatusText:h,selectedInfo:C,selectedConfigName:w,version:N,isServerConnected:y,serverStatusText:d,infoOf:b,fetchInstances:V,fetchInstanceInfo:x,fetchConfigList:j,startVnt:H,stopVnt:M,restartVnt:z,dismissInstance:oe}}),Rd=[{to:"/",label:"网络总览",shortLabel:"总览",subtitle:"组网状态与实例管理",icon:"M4 4h6v6H4V4Zm10 0h6v6h-6V4ZM4 14h6v6H4v-6Zm10 0h6v6h-6v-6Z"},{to:"/peers",label:"在线设备",shortLabel:"设备",subtitle:"查看网络中的对端设备",icon:"M15 19a6 6 0 0 0-12 0m18 0a5 5 0 0 0-5-5m-7-3a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm8 0a3 3 0 1 0 0-6"},{to:"/routes",label:"路由表",shortLabel:"路由",subtitle:"虚拟网络路由信息",icon:"M6 8a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm12 12a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM8 6h6a4 4 0 0 1 4 4v2m-3-3 3 3 3-3M16 18h-6a4 4 0 0 1-4-4v-2"},{to:"/config",label:"组网配置",shortLabel:"配置",subtitle:"管理组网配置文件",icon:"M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Zm7.4-.5a1.7 1.7 0 0 0 .3 1.9l.1.1-2.8 2.8-.1-.1a1.7 1.7 0 0 0-1.9-.3A1.7 1.7 0 0 0 14 21v.2h-4V21a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1L4.2 17l.1-.1a1.7 1.7 0 0 0 .3-1.9A1.7 1.7 0 0 0 3 14h-.2v-4H3a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9L4.2 7 7 4.2l.1.1A1.7 1.7 0 0 0 9 4.6 1.7 1.7 0 0 0 10 3v-.2h4V3a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1L19.8 7l-.1.1a1.7 1.7 0 0 0-.3 1.9 1.7 1.7 0 0 0 1.6 1h.2v4H21a1.7 1.7 0 0 0-1.6-1Z"},{to:"/web-access",label:"Web 访问",shortLabel:"Web",subtitle:"远程访问设置",desktopOnly:!0,icon:"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 0c-2.2-2.5 3.3-5.5 3.3-9S14.2 5.5 12 3m0 18c-2.2-2.5-3.3-5.5-3.3-9S9.8 5.5 12 3M3.5 9h17m-17 6h17"},{to:"/about",label:"关于",shortLabel:"关于",subtitle:"版本与更新",icon:"M12 17v-6m0-4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"}],ya=()=>Rd.filter(e=>!e.desktopOnly||globalThis.__VNT_DESKTOP__),Yn="/assets/vnt-icon-CtSHy0mt.png",Pd={class:"flex h-full min-h-0 flex-col bg-white dark:bg-slate-900"},Od={class:"flex h-16 shrink-0 items-center gap-3 border-b border-slate-200 px-5 dark:border-slate-800"},Md=["src"],Nd={class:"mx-3 mt-4 flex items-center gap-3 rounded-xl border border-slate-200 bg-slate-50 px-3 py-3 dark:border-slate-700 dark:bg-slate-800/60"},Ld={class:"min-w-0"},Vd={class:"mt-0.5 truncate text-xs font-medium text-slate-700 dark:text-slate-200"},jd={class:"mt-4 flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto px-3","aria-label":"主导航"},Dd={class:"h-[18px] w-[18px] shrink-0 fill-none stroke-current",viewBox:"0 0 24 24"},Bd=["d"],Fd={class:"mx-3 mt-3 shrink-0 border-t border-slate-200 px-1 py-4 dark:border-slate-800"},Ud={class:"flex items-center gap-2 text-xs text-slate-400"},Hd={class:"ml-auto font-mono text-[10px]"},kr={__name:"AppSidebar",emits:["navigate"],setup(e){const t=ma(),s=Nt(),n=ya();return(o,l)=>{const r=Un("router-link");return k(),S("div",Pd,[a("div",Od,[a("img",{src:R(Yn),alt:"",class:"h-8 w-8 shrink-0"},null,8,Md),l[1]||(l[1]=a("div",null,[a("div",{class:"text-sm font-bold tracking-wide text-slate-900 dark:text-white"},"VNT"),a("div",{class:"text-[9px] font-semibold tracking-[0.18em] text-slate-400"},"CONTROL CENTER")],-1))]),a("div",Nd,[a("span",{class:G(["h-2.5 w-2.5 shrink-0 rounded-full",R(s).runningCount>0?"bg-green-500":R(s).startingCount>0?"animate-pulse bg-amber-400":"bg-slate-300 dark:bg-slate-600"])},null,2),a("div",Ld,[l[2]||(l[2]=a("div",{class:"text-[9px] font-semibold tracking-wider text-slate-400"},"虚拟网络",-1)),a("div",Vd,L(R(s).headerStatusText),1)])]),a("nav",jd,[(k(!0),S(ae,null,Te(R(n),i=>(k(),Ve(r,{key:i.to,to:i.to,class:G(["flex min-h-10 items-center gap-3 rounded-lg px-3 text-sm font-medium transition-colors",R(t).path===i.to?"bg-indigo-50 text-indigo-700 dark:bg-indigo-500/10 dark:text-indigo-300":"text-slate-500 hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white"]),onClick:l[0]||(l[0]=c=>o.$emit("navigate"))},{default:Ie(()=>[(k(),S("svg",Dd,[a("path",{d:i.icon,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.7"},null,8,Bd)])),a("span",null,L(i.label),1)]),_:2},1032,["to","class"]))),128))]),a("div",Fd,[a("div",Ud,[a("span",{class:G(["h-1.5 w-1.5 rounded-full",R(s).version?"bg-green-500":"bg-amber-400"])},null,2),a("span",null,L(R(s).version?"本地服务正常":"正在连接服务…"),1),a("span",Hd,"v"+L(R(s).version||"2.0"),1)])])])}}},Wd={key:0,class:"flex shrink-0 items-center justify-between gap-3 border-b border-slate-200 bg-slate-50/60 px-6 py-4 dark:border-slate-700 dark:bg-slate-800/50"},Kd={class:"custom-scrollbar min-h-0 flex-1 overflow-y-auto"},Gd={key:1,class:"flex shrink-0 items-center justify-end gap-3 border-t border-slate-200 bg-slate-50/60 px-6 py-4 dark:border-slate-700 dark:bg-slate-800/50"},pl={__name:"AppModal",props:{show:{type:Boolean,default:!1},maskClosable:{type:Boolean,default:!0},escClosable:{type:Boolean,default:!0},panelClass:{type:String,default:"w-full max-w-2xl"}},emits:["close"],setup(e,{emit:t}){const s=e,n=t,o=r=>{s.escClosable&&r.key==="Escape"&&n("close")};Le(()=>s.show,r=>{r?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),Es(()=>window.removeEventListener("keydown",o));const l=()=>{s.maskClosable&&n("close")};return(r,i)=>(k(),Ve(el,{to:"body"},[fe(Cn,{name:"modal"},{default:Ie(()=>[e.show?(k(),S("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-slate-900/40 p-4 backdrop-blur-sm",onClick:rs(l,["self"])},[a("div",{class:G(["modal-panel flex max-h-[90vh] flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-2xl dark:border-slate-700 dark:bg-slate-900",e.panelClass])},[r.$slots.header?(k(),S("div",Wd,[io(r.$slots,"header")])):le("",!0),a("div",Kd,[io(r.$slots,"body")]),r.$slots.footer?(k(),S("div",Gd,[io(r.$slots,"footer")])):le("",!0)],2)])):le("",!0)]),_:3})]))}},qd={class:"w-auto min-w-[260px] max-w-[320px] rounded-lg border border-slate-200 bg-white p-4 text-left text-sm text-slate-600 shadow-2xl dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200"},zd={class:"relative z-10 mb-2 flex items-center justify-between border-b border-slate-200 pb-2 dark:border-slate-600"},Zd={class:"badge-green border border-green-200 dark:border-green-800"},Jd={key:0,class:"relative z-10 mb-3"},Yd={class:"flex flex-wrap gap-1"},Qd={key:1,class:"relative z-10"},Xd={class:"whitespace-normal break-all rounded border border-slate-200 bg-slate-50 p-1.5 font-mono text-xs leading-relaxed text-slate-600 dark:border-slate-700/50 dark:bg-slate-900/50 dark:text-slate-200"},ep={__name:"AppTooltip",setup(e,{expose:t}){const s=Z({show:!1,x:0,y:0,info:null});let n=null;const o=(c,f)=>{if(!f.nat_info)return;n&&(clearTimeout(n),n=null);const u=c.currentTarget.getBoundingClientRect();s.value={show:!0,x:u.left+u.width/2,y:u.bottom+10,info:f.nat_info}},l=()=>{n=setTimeout(()=>{s.value.show=!1},100)},r=()=>{n&&(clearTimeout(n),n=null)},i=()=>{s.value.show=!1};return t({showPeerTooltip:o,hidePeerTooltip:l}),(c,f)=>(k(),Ve(el,{to:"body"},[s.value.show?(k(),S("div",{key:0,style:sn({top:s.value.y+"px",left:s.value.x+"px"}),class:"fixed z-[9999] mt-1 -translate-x-1/2 transform",onMouseenter:r,onMouseleave:i},[a("div",qd,[f[3]||(f[3]=a("div",{class:"absolute -top-2 left-1/2 h-4 w-4 -translate-x-1/2 rotate-45 transform border-l border-t border-slate-200 bg-white dark:border-slate-600 dark:bg-slate-800"},null,-1)),a("div",zd,[f[0]||(f[0]=a("span",{class:"text-xs font-bold uppercase text-slate-400"},"NAT Type",-1)),a("span",Zd,L(s.value.info.nat_type),1)]),s.value.info.public_ips&&s.value.info.public_ips.length>0?(k(),S("div",Jd,[f[1]||(f[1]=a("span",{class:"mb-1 block text-xs text-slate-400"},"Public IPv4:",-1)),a("div",Yd,[(k(!0),S(ae,null,Te(s.value.info.public_ips,u=>(k(),S("span",{key:u,class:"rounded border border-slate-200 bg-slate-100 px-1.5 py-0.5 font-mono text-xs tabular-nums text-slate-600 dark:border-slate-600 dark:bg-slate-700 dark:text-slate-200"},L(u),1))),128))])])):le("",!0),s.value.info.ipv6?(k(),S("div",Qd,[f[2]||(f[2]=a("span",{class:"mb-1 block text-xs text-slate-400"},"IPv6:",-1)),a("div",Xd,L(s.value.info.ipv6),1)])):le("",!0)])],36)):le("",!0)]))}},tp={class:"text-lg font-bold text-slate-900 flex items-center gap-2 dark:text-white"},sp={key:0,class:"w-5 h-5 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},np={class:"px-6 py-5 text-sm text-slate-600 break-all dark:text-slate-300"},op={__name:"ConfirmHost",setup(e){const t=cs();return(s,n)=>(k(),Ve(pl,{show:R(t).confirmState.show,"panel-class":"w-full max-w-sm",onClose:R(t).confirmCancel},{header:Ie(()=>[a("h3",tp,[R(t).confirmState.danger?(k(),S("svg",sp,[...n[2]||(n[2]=[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"},null,-1)])])):le("",!0),ce(" "+L(R(t).confirmState.title),1)])]),body:Ie(()=>[a("p",np,L(R(t).confirmState.message),1)]),footer:Ie(()=>[a("button",{class:"btn-ghost",onClick:n[0]||(n[0]=(...o)=>R(t).confirmCancel&&R(t).confirmCancel(...o))},"取消"),a("button",{class:G(R(t).confirmState.danger?"btn-danger":"btn-primary"),onClick:n[1]||(n[1]=(...o)=>R(t).confirmOk&&R(t).confirmOk(...o))},L(R(t).confirmState.confirmText),3)]),_:1},8,["show","onClose"]))}},lp={class:"pointer-events-none fixed right-4 top-4 z-[100] flex flex-col items-end gap-2"},rp={class:"flex items-center gap-2 px-4 py-2.5"},ip=["d"],ap={class:"break-all text-sm text-slate-700 dark:text-slate-200"},cp={__name:"ToastHost",setup(e){const t=cs(),s=l=>l==="success"?"bg-green-500":l==="error"?"bg-red-500":"bg-indigo-500",n=l=>l==="success"?"text-green-500":l==="error"?"text-red-500":"text-indigo-500",o=l=>l==="success"?"M5 13l4 4L19 7":l==="error"?"M6 18L18 6M6 6l12 12":"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z";return(l,r)=>(k(),Ve(el,{to:"body"},[a("div",lp,[fe(Ji,{name:"toast"},{default:Ie(()=>[(k(!0),S(ae,null,Te(R(t).toasts,i=>(k(),S("div",{key:i.id,class:"pointer-events-auto flex max-w-sm items-stretch overflow-hidden rounded-lg border border-slate-200 bg-white shadow-lg dark:border-slate-700 dark:bg-slate-800"},[a("span",{class:G(["w-1 shrink-0",s(i.type)])},null,2),a("div",rp,[(k(),S("svg",{class:G(["h-4 w-4 shrink-0",n(i.type)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:o(i.type)},null,8,ip)],2)),a("span",ap,L(i.message),1)])]))),128))]),_:1})])]))}},up={class:"grid h-[100dvh] place-items-center overflow-y-auto bg-slate-50 p-4 text-slate-700 dark:bg-slate-950 dark:text-slate-200"},fp={class:"mb-7 flex items-center gap-3"},dp=["src"],pp=["disabled"],hp={__name:"AccessGate",setup(e){const t=Z(""),s=()=>{t.value.trim()&&(gd(t.value),window.location.reload())};return(n,o)=>(k(),S("main",up,[a("form",{class:"w-full max-w-md rounded-2xl border border-slate-200 bg-white p-6 shadow-sm sm:p-8 dark:border-slate-800 dark:bg-slate-900",onSubmit:rs(s,["prevent"])},[a("div",fp,[a("img",{src:R(Yn),alt:"",class:"h-10 w-10 shrink-0"},null,8,dp),o[1]||(o[1]=a("div",null,[a("h1",{class:"text-lg font-bold text-slate-900 dark:text-white"},"访问 VNT 控制台"),a("p",{class:"mt-0.5 text-xs text-slate-400"},"请输入桌面端 Web 访问设置中的令牌")],-1))]),o[2]||(o[2]=a("label",{class:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-200",for:"access-token"},"访问令牌",-1)),xe(a("input",{id:"access-token","onUpdate:modelValue":o[0]||(o[0]=l=>t.value=l),class:"input font-mono",type:"password",autocomplete:"current-password",autofocus:"",placeholder:"粘贴访问令牌"},null,512),[[Ae,t.value]]),a("button",{class:"btn-primary mt-5 w-full",type:"submit",disabled:!t.value.trim()},"进入控制台",8,pp),o[3]||(o[3]=a("p",{class:"mt-5 text-center text-xs leading-5 text-slate-400"},"令牌只保存在当前浏览器中,可随时在桌面端重新生成。",-1))],32)]))}},mp={key:1,class:"flex h-[100dvh] min-h-0 overflow-hidden bg-slate-50 text-slate-700 dark:bg-slate-950 dark:text-slate-200"},gp={class:"hidden w-60 shrink-0 border-r border-slate-200 dark:border-slate-800 lg:block"},vp={key:0,class:"fixed inset-0 z-40 lg:hidden"},bp={class:"drawer-panel relative h-full w-[min(82vw,288px)] border-r border-slate-200 shadow-2xl dark:border-slate-700"},xp={class:"flex min-w-0 flex-1 flex-col"},_p={class:"flex h-16 shrink-0 items-center gap-3 border-b border-slate-200 bg-white/90 px-4 backdrop-blur lg:px-6 dark:border-slate-800 dark:bg-slate-900/90"},yp={class:"min-w-0"},kp={class:"truncate text-lg font-bold text-slate-900 dark:text-white"},wp={class:"hidden text-xs text-slate-400 sm:block"},Cp={class:"ml-auto flex items-center gap-2"},Sp={class:"flex h-8 items-center gap-2 rounded-lg border border-slate-200 bg-white px-2.5 text-xs font-medium text-slate-500 sm:px-3 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300"},Ep={class:"hidden sm:inline"},Tp=["title","aria-label"],$p={key:0,class:"h-4 w-4 fill-none stroke-current",viewBox:"0 0 24 24"},Ap={key:1,class:"h-4 w-4 fill-none stroke-current",viewBox:"0 0 24 24"},Ip={class:"custom-scrollbar min-h-0 flex-1 overflow-x-hidden overflow-y-auto"},Rp={class:"mx-auto w-full max-w-[1700px] px-4 py-5 sm:px-5 lg:px-7 lg:py-6"},Pp={class:"flex min-w-0 items-center gap-3"},Op={class:"truncate text-base font-bold text-slate-900 sm:text-lg dark:text-white"},Mp={class:"max-w-[40%] truncate font-mono text-xs text-indigo-600 dark:text-indigo-400"},Np={class:"break-all"},Lp={key:0,class:"animate-pulse text-indigo-600 dark:text-indigo-400"},Vp={__name:"App",setup(e){const t=Nt(),s=_a(),n=ma(),o=md(),l=Z(null);Fs("peerTooltip",l);const r=Z(!1),i=ya(),c=he(()=>i.find(C=>C.to===n.path)||i[0]),f=localStorage.getItem("vnt-theme"),u=Z(f?f==="dark":window.matchMedia("(prefers-color-scheme: dark)").matches),p=()=>document.documentElement.classList.toggle("dark",u.value),g=()=>{u.value=!u.value,localStorage.setItem("vnt-theme",u.value?"dark":"light"),p()};p(),Le(()=>n.path,()=>{r.value=!1});const h=C=>{if(!(C.ctrlKey||C.metaKey)||C.altKey)return;const w=Number(C.key)-1;w>=0&&wwindow.addEventListener("keydown",h)),Fn(()=>window.removeEventListener("keydown",h)),(C,w)=>{const N=Un("router-view");return!R(bt)&&!R(fl)?(k(),Ve(hp,{key:0})):(k(),S("div",mp,[a("aside",gp,[fe(kr)]),fe(Cn,{name:"drawer"},{default:Ie(()=>[r.value?(k(),S("div",vp,[a("button",{class:"absolute inset-0 bg-slate-950/45 backdrop-blur-[2px]","aria-label":"关闭导航",onClick:w[0]||(w[0]=T=>r.value=!1)}),a("aside",bp,[fe(kr,{onNavigate:w[1]||(w[1]=T=>r.value=!1)})])])):le("",!0)]),_:1}),a("div",xp,[a("header",_p,[a("button",{class:"grid h-9 w-9 shrink-0 place-items-center rounded-lg text-slate-500 hover:bg-slate-100 hover:text-slate-900 lg:hidden dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white","aria-label":"打开导航",onClick:w[2]||(w[2]=T=>r.value=!0)},[...w[5]||(w[5]=[a("svg",{class:"h-5 w-5 fill-none stroke-current",viewBox:"0 0 24 24"},[a("path",{d:"M4 7h16M4 12h16M4 17h16","stroke-linecap":"round","stroke-width":"2"})],-1)])]),a("div",yp,[a("h1",kp,L(c.value.label),1),a("p",wp,L(c.value.subtitle||"VNT 虚拟局域网管理"),1)]),a("div",Cp,[a("div",Sp,[a("span",{class:G(["h-1.5 w-1.5 rounded-full",R(t).runningCount>0?"bg-green-500":R(t).startingCount>0?"animate-pulse bg-amber-400":"bg-slate-300 dark:bg-slate-600"])},null,2),a("span",Ep,L(R(t).headerStatusText),1)]),a("button",{class:"grid h-8 w-8 place-items-center rounded-lg border border-slate-200 bg-white text-slate-500 hover:border-indigo-300 hover:text-indigo-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-400 dark:hover:border-indigo-500 dark:hover:text-indigo-400",title:u.value?"切换浅色模式":"切换深色模式","aria-label":u.value?"切换浅色模式":"切换深色模式",onClick:g},[u.value?(k(),S("svg",$p,[...w[6]||(w[6]=[a("circle",{cx:"12",cy:"12",r:"4"},null,-1),a("path",{d:"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4","stroke-linecap":"round","stroke-width":"1.7"},null,-1)])])):(k(),S("svg",Ap,[...w[7]||(w[7]=[a("path",{d:"M20.5 15.2A8.5 8.5 0 0 1 8.8 3.5 8.5 8.5 0 1 0 20.5 15.2Z","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.7"},null,-1)])]))],8,Tp)])]),a("main",Ip,[a("div",Rp,[fe(N,null,{default:Ie(({Component:T})=>[fe(Cn,{name:"fade",mode:"out-in"},{default:Ie(()=>[(k(),Ve(Pc(T)))]),_:2},1024)]),_:1})])])]),fe(pl,{show:R(s).showStartLog,"mask-closable":R(s).startStatus!=="starting","esc-closable":R(s).startStatus!=="starting","panel-class":"w-full max-w-2xl",onClose:R(s).close},{header:Ie(()=>[a("div",Pp,[a("span",{class:G(["h-2 w-2 shrink-0 rounded-full",R(s).startStatus==="starting"?"animate-pulse bg-amber-400":R(s).startStatus==="running"?"bg-green-500":"bg-red-500"])},null,2),a("h3",Op,L(R(s).startStatus==="starting"?"正在建立虚拟网络":R(s).startStatus==="running"?"网络已连接":"连接未完成"),1)]),a("span",Mp,L(R(s).logConfigName),1)]),body:Ie(()=>[a("div",{ref:T=>R(s).logContainer=T,class:"custom-scrollbar h-64 space-y-2 overflow-y-auto border-y border-slate-200 bg-slate-50 p-4 font-mono text-xs text-slate-600 sm:h-80 sm:p-6 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-300"},[(k(!0),S(ae,null,Te(R(s).startLogs,(T,y)=>(k(),S("div",{key:y,class:"flex gap-3"},[w[8]||(w[8]=a("span",{class:"text-indigo-600 dark:text-indigo-400"},"›",-1)),a("span",Np,L(T),1)]))),128)),R(s).startStatus==="starting"?(k(),S("div",Lp,"等待下一阶段…")):le("",!0)],512)]),footer:Ie(()=>[R(s).startStatus==="starting"?(k(),S("button",{key:0,class:"btn-ghost",onClick:w[3]||(w[3]=(...T)=>R(s).cancelStart&&R(s).cancelStart(...T))},"取消连接")):(k(),S("button",{key:1,class:"btn-primary",onClick:w[4]||(w[4]=(...T)=>R(s).close&&R(s).close(...T))},"完成"))]),_:1},8,["show","mask-closable","esc-closable","onClose"]),fe(cp),fe(op),fe(ep,{ref_key:"tooltipRef",ref:l},null,512)]))}}},Qn=(e,t)=>{const s=e.__vccOpts||e;for(const[n,o]of t)s[n]=o;return s},jp=["aria-expanded","disabled"],Dp=["aria-selected","disabled","data-option-index","onMouseenter","onClick"],Bp={class:"min-w-0 flex-1 truncate"},Fp={key:0,class:"h-4 w-4 shrink-0 fill-none stroke-current",viewBox:"0 0 24 24","aria-hidden":"true"},Up={key:0,class:"px-3 py-4 text-center text-xs text-slate-400"},Hp=Object.assign({inheritAttrs:!1},{__name:"AppSelect",props:{modelValue:{default:null},options:{type:Array,default:()=>[]},placeholder:{type:String,default:"请选择"},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(e,{emit:t}){const s=e,n=t,o=Z(null),l=Z(null),r=Z(!1),i=Z(-1),c=`app-select-${kc().replaceAll(":","")}`,f=he(()=>s.options.findIndex(y=>Object.is(y.value,s.modelValue))),u=he(()=>s.options[f.value]||null),p=(y,d)=>{if(!s.options.length)return-1;let b=y;for(let x=0;x{s.disabled||(r.value=!0,i.value=f.value>=0?f.value:p(-1,1),await yt(),o.value?.querySelector(`[data-option-index="${i.value}"]`)?.scrollIntoView({block:"nearest"}))},h=(y=!1)=>{r.value=!1,y&&l.value?.focus()},C=y=>{y.disabled||(n("update:modelValue",y.value),h(!0))},w=y=>{i.value=p(i.value,y),yt(()=>{o.value?.querySelector(`[data-option-index="${i.value}"]`)?.scrollIntoView({block:"nearest"})})},N=y=>{if(!s.disabled){if(y.key==="ArrowDown"||y.key==="ArrowUp"){y.preventDefault(),r.value?w(y.key==="ArrowDown"?1:-1):g();return}if(y.key==="Enter"||y.key===" "){y.preventDefault(),r.value?i.value>=0&&C(s.options[i.value]):g();return}if(y.key==="Escape"&&r.value){y.preventDefault(),h(!0);return}y.key==="Home"&&r.value?(y.preventDefault(),i.value=p(-1,1)):y.key==="End"&&r.value?(y.preventDefault(),i.value=p(0,-1)):y.key==="Tab"&&h()}},T=y=>{r.value&&!o.value?.contains(y.target)&&h()};return Le(()=>s.disabled,y=>{y&&h()}),at(()=>document.addEventListener("pointerdown",T)),Fn(()=>document.removeEventListener("pointerdown",T)),(y,d)=>(k(),S("div",{ref_key:"root",ref:o,class:"relative w-full"},[a("button",Bi({ref_key:"trigger",ref:l},y.$attrs,{type:"button",role:"combobox","aria-expanded":r.value,"aria-controls":c,"aria-haspopup":"listbox",disabled:e.disabled,class:["input flex min-h-10 items-center justify-between gap-3 text-left",r.value?"border-indigo-500 ring-2 ring-indigo-500/25":""],onClick:d[0]||(d[0]=b=>r.value?h():g()),onKeydown:N}),[a("span",{class:G(["min-w-0 flex-1 truncate",u.value?"":"text-slate-400 dark:text-slate-500"])},L(u.value?.label||e.placeholder),3),(k(),S("svg",{class:G(["h-4 w-4 shrink-0 fill-none stroke-current text-slate-400 transition-transform duration-150",r.value?"rotate-180 text-indigo-500":""]),viewBox:"0 0 24 24","aria-hidden":"true"},[...d[1]||(d[1]=[a("path",{d:"m7 10 5 5 5-5","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.8"},null,-1)])],2))],16,jp),fe(Cn,{name:"select-menu"},{default:Ie(()=>[r.value?(k(),S("div",{key:0,id:c,role:"listbox",class:"custom-scrollbar absolute z-40 mt-1.5 max-h-60 w-full overflow-y-auto rounded-xl border border-slate-200 bg-white p-1.5 shadow-xl shadow-slate-900/10 dark:border-slate-700 dark:bg-slate-800 dark:shadow-black/30"},[(k(!0),S(ae,null,Te(e.options,(b,x)=>(k(),S("button",{key:`${String(b.value)}-${x}`,type:"button",role:"option","aria-selected":Object.is(b.value,e.modelValue),disabled:b.disabled,"data-option-index":x,class:G(["flex w-full items-center gap-2 rounded-lg px-3 py-2.5 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-40",[Object.is(b.value,e.modelValue)?"bg-indigo-50 font-medium text-indigo-700 dark:bg-indigo-500/15 dark:text-indigo-300":"text-slate-600 hover:bg-slate-100 dark:text-slate-200 dark:hover:bg-slate-700/70",i.value===x&&!Object.is(b.value,e.modelValue)?"bg-slate-100 dark:bg-slate-700/70":""]]),onMouseenter:V=>i.value=x,onClick:V=>C(b)},[a("span",Bp,L(b.label),1),Object.is(b.value,e.modelValue)?(k(),S("svg",Fp,[...d[2]||(d[2]=[a("path",{d:"m5 12 4 4L19 6","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},null,-1)])])):le("",!0)],42,Dp))),128)),e.options.length===0?(k(),S("div",Up,"暂无可选项")):le("",!0)])):le("",!0)]),_:1})],512))}}),hl=Qn(Hp,[["__scopeId","data-v-2fb2198c"]]),Wp={class:"card"},Kp={key:0,class:"flex flex-wrap items-center justify-between gap-3"},Gp={key:1,class:"text-sm muted"},qp={key:2,class:"flex flex-col gap-3 sm:flex-row sm:items-end"},zp={class:"flex-1"},Zp=["disabled"],Jp={key:0,class:"animate-spin"},Yp={__name:"StartPanel",setup(e){const t=Nt(),s=cs(),n=Z(""),o=he(()=>t.configList.filter(i=>!t.instanceList.some(c=>c.file_name===i.file_name))),l=he(()=>o.value.map(i=>({value:i.file_name,label:i.config_name||i.file_name})));Le(o,i=>{i.some(c=>c.file_name===n.value)||(n.value=i.length?i[0].file_name:"")},{immediate:!0});const r=()=>{if(!n.value){s.toast.error("请先选择一个配置");return}t.startVnt(n.value)};return(i,c)=>{const f=Un("router-link");return k(),S("div",Wp,[c[5]||(c[5]=a("h2",{class:"mb-4 text-base font-bold text-slate-900 dark:text-white"},"启动组网",-1)),R(t).configList.length===0?(k(),S("div",Kp,[c[2]||(c[2]=a("p",{class:"text-sm muted"},"还没有任何配置,先创建一个组网配置吧。",-1)),fe(f,{to:"/config",class:"btn-primary btn-sm"},{default:Ie(()=>[...c[1]||(c[1]=[ce("去新建配置",-1)])]),_:1})])):o.value.length===0?(k(),S("div",Gp," 所有配置均已启动。 ")):(k(),S("div",qp,[a("div",zp,[c[3]||(c[3]=a("label",{class:"mb-1.5 block text-xs font-medium muted"},"选择配置",-1)),fe(hl,{modelValue:n.value,"onUpdate:modelValue":c[0]||(c[0]=u=>n.value=u),options:l.value,placeholder:"请选择配置…","aria-label":"选择配置"},null,8,["modelValue","options"])]),a("button",{class:"btn-primary px-8",disabled:!n.value||!!R(t).loadingMap[n.value],onClick:r},[R(t).loadingMap[n.value]?(k(),S("span",Jp,"⟳")):le("",!0),c[4]||(c[4]=ce(" 启动 ",-1))],8,Zp)]))])}}},Qp={class:"flex items-center justify-between gap-2"},Xp=["title"],e0={class:"flex shrink-0 items-center gap-1.5"},t0={key:0,class:"badge-yellow",title:"配置文件在启动后被修改,重启实例后生效"},s0={class:"mt-2 text-sm"},n0={class:"ml-1 font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},o0={class:"mt-3 flex gap-4 text-xs muted"},l0={class:"font-bold tabular-nums text-blue-600 dark:text-blue-400"},r0={class:"font-bold tabular-nums text-green-600 dark:text-green-400"},i0={class:"font-bold tabular-nums text-slate-400"},a0={class:"mt-4 flex flex-wrap justify-end gap-2"},c0={key:0,class:"flex items-center gap-1.5 text-xs muted"},u0=["disabled"],f0={key:0,class:"animate-spin"},d0=["disabled"],p0={key:0,class:"animate-spin"},h0=["disabled"],m0={key:0,class:"animate-spin"},g0={__name:"InstanceCard",props:{inst:{type:Object,required:!0},selectable:{type:Boolean,default:!1}},setup(e){const t=e,s=Nt(),n=cs(),o=he(()=>s.infoOf(t.inst.file_name)),l=he(()=>!!s.loadingMap[t.inst.file_name]),r=he(()=>!!s.stoppingMap[t.inst.file_name]),i=he(()=>t.inst.config_name||t.inst.file_name),c=C=>r.value?"badge-yellow":C==="running"?"badge-green":C==="starting"?"badge-blue":"badge-gray",f=C=>r.value?"停止中":C==="running"?"运行中":C==="starting"?"启动中":"已停止",u=()=>{t.selectable&&(s.selectedInstance=t.inst.file_name)},p=async()=>{await n.confirm({title:"停止组网",message:`确定要停止 ${i.value} 吗?`,danger:!0,confirmText:"停止"})&&s.stopVnt(t.inst.file_name)},g=async()=>{await n.confirm({title:"重启组网",message:`确定要重启 ${i.value} 吗?`})&&s.restartVnt(t.inst.file_name)},h=async()=>{await n.confirm({title:"移除实例",message:`确定要移除已停止的实例 ${i.value} 吗?`,danger:!0,confirmText:"移除"})&&s.dismissInstance(t.inst.file_name)};return(C,w)=>(k(),S("div",{class:G(["card",[e.selectable?"cursor-pointer":"",e.selectable&&R(s).selectedInstance===e.inst.file_name?"ring-2 ring-indigo-500 dark:ring-indigo-400":""]]),onClick:u},[a("div",Qp,[a("h3",{class:"truncate text-base font-bold text-slate-900 dark:text-white",title:e.inst.file_name},L(i.value),9,Xp),a("div",e0,[o.value.config_changed?(k(),S("span",t0," 配置发生变化 ")):le("",!0),a("span",{class:G([c(e.inst.status),r.value?"animate-pulse":""])},L(f(e.inst.status)),3)])]),a("div",s0,[w[0]||(w[0]=a("span",{class:"muted"},"虚拟 IP:",-1)),a("span",n0,L(o.value.ip||"-"),1)]),a("div",o0,[a("span",null,[w[1]||(w[1]=ce(" 在线 ",-1)),a("span",l0,L(o.value.online_client_num||0),1)]),a("span",null,[w[2]||(w[2]=ce(" 直连 ",-1)),a("span",r0,L(o.value.direct_client_num||0),1)]),a("span",null,[w[3]||(w[3]=ce(" 离线 ",-1)),a("span",i0,L(o.value.offline_client_num||0),1)])]),a("div",a0,[r.value?(k(),S("span",c0,[...w[4]||(w[4]=[a("span",{class:"inline-block animate-spin"},"⟳",-1),ce(" 正在停止,请稍候... ",-1)])])):(k(),S(ae,{key:1},[e.inst.status==="running"||e.inst.status==="stopped"?(k(),S("button",{key:0,class:"btn-primary btn-sm",disabled:l.value,onClick:rs(g,["stop"])},[l.value?(k(),S("span",f0,"⟳")):le("",!0),ce(" "+L(e.inst.status==="stopped"?"重新启动":"重启"),1)],8,u0)):le("",!0),e.inst.status!=="stopped"?(k(),S("button",{key:1,class:"btn-danger btn-sm",disabled:l.value,onClick:rs(p,["stop"])},[l.value?(k(),S("span",p0,"⟳")):le("",!0),w[5]||(w[5]=ce(" 停止 ",-1))],8,d0)):le("",!0),e.inst.status==="stopped"?(k(),S("button",{key:2,class:"btn-ghost btn-sm",disabled:l.value,onClick:rs(h,["stop"])},[l.value?(k(),S("span",m0,"⟳")):le("",!0),w[6]||(w[6]=ce(" 移除 ",-1))],8,h0)):le("",!0)],64))])],2))}},v0={class:"card p-12 text-center text-slate-500 dark:text-slate-400"},Xn={__name:"EmptyState",props:{text:{type:String,default:"暂无数据"}},setup(e){return(t,s)=>(k(),S("div",v0,[s[0]||(s[0]=a("svg",{class:"w-12 h-12 mx-auto mb-3 text-slate-300 dark:text-slate-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})],-1)),a("p",null,L(e.text),1)]))}},b0={class:"space-y-6"},x0={class:"flex flex-wrap items-end justify-between gap-4"},_0={class:"page-subtitle"},y0={class:"grid grid-cols-2 gap-4 lg:grid-cols-4"},k0={class:"card"},w0={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},C0={class:"ml-1 text-sm font-normal muted"},S0={class:"card"},E0={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},T0={class:"card"},$0={class:"card"},A0={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},I0={class:"text-sm font-normal muted"},R0={key:1,class:"muted"},P0={class:"mb-3 flex items-center justify-between"},O0={key:0,class:"text-xs muted"},M0={class:"card"},N0={class:"mb-4 text-lg font-bold text-slate-900 dark:text-white"},L0={class:"ml-2 text-sm font-medium text-indigo-600 dark:text-indigo-400"},V0={class:"grid grid-cols-1 gap-4 text-sm md:grid-cols-2"},j0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},D0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},B0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},F0={class:"font-mono text-slate-900 dark:text-white"},U0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},H0={class:"font-mono text-slate-900 dark:text-white"},W0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},K0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},G0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},q0={class:"font-mono text-indigo-600 dark:text-indigo-400"},z0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},Z0=["title"],J0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},Y0={class:"text-slate-900 dark:text-white"},Q0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},X0=["title"],eh={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},th={class:"text-sm text-slate-600 dark:text-slate-300"},sh={class:"mt-4"},nh={class:"flex flex-wrap gap-2"},oh={key:0,class:"text-xs text-slate-400"},lh={class:"card p-0 overflow-hidden"},rh={class:"custom-scrollbar max-h-[400px] overflow-x-auto"},ih={class:"table"},ah={class:"font-mono"},ch={class:"tabular-nums"},uh={key:0},fh={__name:"DashboardView",setup(e){const t=Nt(),s=he(()=>Object.values(t.instances).reduce((l,r)=>l+(r?.online_client_num||0),0)),n=he(()=>{const l=t.instanceList.filter(i=>i.status==="running");return{connected:l.filter(i=>t.instances[i.file_name]?.server_info?.some(f=>f.connected)).length,total:l.length}}),o=he(()=>t.runningCount>0?`运行中 ${t.runningCount} 个实例`:t.startingCount>0?"有实例正在启动...":"全部实例已停止");return(l,r)=>{const i=Un("router-link");return k(),S("div",b0,[a("div",x0,[a("div",null,[r[0]||(r[0]=a("h1",{class:"page-title"},"总览",-1)),a("p",_0,L(o.value),1)]),fe(i,{to:"/config",class:"btn-ghost btn-sm"},{default:Ie(()=>[...r[1]||(r[1]=[ce("管理配置",-1)])]),_:1})]),a("div",y0,[a("div",k0,[r[2]||(r[2]=a("div",{class:"text-xs font-medium muted"},"运行实例",-1)),a("div",w0,[ce(L(R(t).runningCount),1),a("span",C0,"/ "+L(R(t).instanceList.length),1)])]),a("div",S0,[r[3]||(r[3]=a("div",{class:"text-xs font-medium muted"},"配置总数",-1)),a("div",E0,L(R(t).configList.length),1)]),a("div",T0,[r[4]||(r[4]=a("div",{class:"text-xs font-medium muted"},"在线设备",-1)),a("div",{class:G(["mt-2 text-2xl font-bold tabular-nums",s.value>0?"text-green-600 dark:text-green-400":"text-slate-900 dark:text-white"])},L(s.value),3)]),a("div",$0,[r[5]||(r[5]=a("div",{class:"text-xs font-medium muted"},"服务器连接",-1)),a("div",A0,[n.value.total>0?(k(),S(ae,{key:0},[a("span",{class:G(n.value.connected>0?"text-green-600 dark:text-green-400":"text-red-500")},L(n.value.connected),3),a("span",I0,"/ "+L(n.value.total)+" 已连接",1)],64)):(k(),S("span",R0,"-"))])])]),fe(Yp),a("div",null,[a("div",P0,[r[6]||(r[6]=a("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"组网实例",-1)),R(t).instanceList.length>0?(k(),S("span",O0,"点击卡片查看详情")):le("",!0)]),R(t).instanceList.length===0?(k(),Ve(Xn,{key:0,text:R(t).configList.length===0?"暂无配置,请先新建配置":"暂无运行中的组网,请在上方选择配置启动"},null,8,["text"])):(k(),Ve(Ji,{key:1,name:"card-list",tag:"div",class:"grid grid-cols-1 gap-4 md:grid-cols-2"},{default:Ie(()=>[(k(!0),S(ae,null,Te(R(t).instanceList,c=>(k(),Ve(g0,{key:c.file_name,inst:c,selectable:""},null,8,["inst"]))),128))]),_:1}))]),R(t).selectedInstance&&R(t).selectedInfo?(k(),S(ae,{key:0},[a("div",M0,[a("h2",N0,[r[7]||(r[7]=ce(" 网络详情 ",-1)),a("span",L0,L(R(t).selectedConfigName),1)]),a("div",V0,[a("div",j0,[r[8]||(r[8]=a("span",{class:"muted"},"虚拟 IP / 掩码",-1)),a("span",D0,L(R(t).selectedInfo.ip||"-")+" / "+L(R(t).selectedInfo.prefix_len||"-"),1)]),a("div",B0,[r[9]||(r[9]=a("span",{class:"muted"},"网关",-1)),a("span",F0,L(R(t).selectedInfo.gateway||"-"),1)]),a("div",U0,[r[10]||(r[10]=a("span",{class:"muted"},"网络编号",-1)),a("span",H0,L(R(t).selectedInfo.network_code||"-"),1)]),a("div",W0,[r[11]||(r[11]=a("span",{class:"muted"},"MTU",-1)),a("span",K0,L(R(t).selectedInfo.mtu||""),1)]),a("div",G0,[r[12]||(r[12]=a("span",{class:"muted"},"NAT 类型",-1)),a("span",q0,L(R(t).selectedInfo.nat_type||"Unknown"),1)]),a("div",z0,[r[13]||(r[13]=a("span",{class:"muted"},"Public IPv6",-1)),a("span",{class:"max-w-[200px] truncate font-mono text-slate-900 dark:text-white",title:R(t).selectedInfo.public_ipv6},L(R(t).selectedInfo.public_ipv6||"-"),9,Z0)]),a("div",J0,[r[14]||(r[14]=a("span",{class:"muted"},"设备名称",-1)),a("span",Y0,L(R(t).selectedInfo.name||"-"),1)]),a("div",Q0,[r[15]||(r[15]=a("span",{class:"muted"},"设备 ID",-1)),a("span",{class:"max-w-[200px] truncate font-mono text-xs text-slate-500 dark:text-slate-400",title:R(t).selectedInfo.device_id},L(R(t).selectedInfo.device_id||"-"),9,X0)])]),a("div",eh,[(k(),S(ae,null,Te([{key:"encrypt",label:"加密"},{key:"compress",label:"压缩"},{key:"fec",label:"FEC纠错"},{key:"rtx",label:"QUIC传输"}],c=>a("div",{key:c.key,class:"flex items-center gap-2 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-800/50"},[a("span",{class:G(["h-2 w-2 rounded-full",R(t).selectedInfo[c.key]?"bg-green-500":"bg-slate-300 dark:bg-slate-600"])},null,2),a("span",th,L(c.label),1)])),64))]),a("div",sh,[r[16]||(r[16]=a("span",{class:"mb-2 block text-sm muted"},"Public IPv4s",-1)),a("div",nh,[(k(!0),S(ae,null,Te(R(t).selectedInfo.public_ipv4s,c=>(k(),S("span",{key:c,class:"rounded border border-slate-200 bg-slate-50 px-2 py-1 font-mono text-xs tabular-nums text-green-700 dark:border-slate-600 dark:bg-slate-800 dark:text-green-300"},L(c),1))),128)),!R(t).selectedInfo.public_ipv4s||R(t).selectedInfo.public_ipv4s.length===0?(k(),S("span",oh,"无")):le("",!0)])])]),a("div",lh,[r[19]||(r[19]=a("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[a("h2",{class:"text-lg font-bold text-slate-900 dark:text-white"},"服务器连接列表")],-1)),a("div",rh,[a("table",ih,[r[18]||(r[18]=a("thead",null,[a("tr",null,[a("th",null,"地址"),a("th",null,"状态"),a("th",null,"延迟"),a("th",null,"版本")])],-1)),a("tbody",null,[(k(!0),S(ae,null,Te(R(t).selectedInfo.server_info,(c,f)=>(k(),S("tr",{key:f},[a("td",ah,L(c.server),1),a("td",null,[a("span",{class:G(c.connected?"badge-green":"badge-red")},L(c.connected?"已连接":"未连接"),3)]),a("td",ch,L(c.server_rtt?c.server_rtt+" ms":"-"),1),a("td",null,L(c.server_version||"-"),1)]))),128)),!R(t).selectedInfo.server_info||R(t).selectedInfo.server_info.length===0?(k(),S("tr",uh,[...r[17]||(r[17]=[a("td",{colspan:"4",class:"text-center text-slate-400"},"暂无数据",-1)])])):le("",!0)])])])])],64)):le("",!0)])}}},Fo=()=>({config_name:"",network_code:"",server:[""],ip:"",mtu:null,rtx:!1,fec:!1,compress:!1,no_punch:!1,input:[],output:[],no_nat:!1,no_tun:!1,port_mapping:[],allow_mapping:!1,device_name:"",device_id:"",tun_name:"",outbound_interface:"",password:"",cert_mode:"skip",fingerprint:"",udp_stun:[],tcp_stun:[],tunnel_port:null}),wr=e=>{const t=Fo(),s=e.split(` -`);for(const n of s){const o=n.trim();if(!(!o||o.startsWith("#"))){if(o.includes("config_name")){const l=o.match(/config_name\s*=\s*"([^"]*)"/);l&&(t.config_name=l[1])}else if(o.includes("network_code")){const l=o.match(/network_code\s*=\s*"([^"]*)"/);l&&(t.network_code=l[1])}else if(o.startsWith("server")){const l=o.match(/server\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.server=r.map(i=>i.replace(/"/g,"")))}}else if(o.includes("ip =")){const l=o.match(/ip\s*=\s*"([^"]*)"/);l&&(t.ip=l[1])}else if(o.includes("mtu =")){const l=o.match(/mtu\s*=\s*(\d+)/);l&&(t.mtu=parseInt(l[1]))}else if(o.match(/^rtx\s*=/))t.rtx=o.includes("true");else if(o.match(/^fec\s*=/))t.fec=o.includes("true");else if(o.match(/^compress\s*=/))t.compress=o.includes("true");else if(o.match(/^no_punch\s*=/))t.no_punch=o.includes("true");else if(o.startsWith("input")){const l=o.match(/input\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.input=r.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("output")){const l=o.match(/output\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.output=r.map(i=>i.replace(/"/g,"")))}}else if(o.match(/^no_nat\s*=/))t.no_nat=o.includes("true");else if(o.match(/^no_tun\s*=/))t.no_tun=o.includes("true");else if(o.startsWith("port_mapping")){const l=o.match(/port_mapping\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.port_mapping=r.map(i=>i.replace(/"/g,"")))}}else if(o.match(/^allow_mapping\s*=/))t.allow_mapping=o.includes("true");else if(o.includes("device_name")){const l=o.match(/device_name\s*=\s*"([^"]*)"/);l&&(t.device_name=l[1])}else if(o.includes("device_id")){const l=o.match(/device_id\s*=\s*"([^"]*)"/);l&&(t.device_id=l[1])}else if(o.includes("tun_name")){const l=o.match(/tun_name\s*=\s*"([^"]*)"/);l&&(t.tun_name=l[1])}else if(o.includes("outbound_interface")){const l=o.match(/outbound_interface\s*=\s*"([^"]*)"/);l&&(t.outbound_interface=l[1])}else if(o.includes("password =")){const l=o.match(/password\s*=\s*"([^"]*)"/);l&&(t.password=l[1])}else if(o.includes("cert_mode")){const l=o.match(/cert_mode\s*=\s*"([^"]*)"/);if(l){const r=l[1];r.startsWith("finger:")?(t.cert_mode="finger",t.fingerprint=r.substring(7)):t.cert_mode=r}}else if(o.startsWith("udp_stun")){const l=o.match(/udp_stun\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.udp_stun=r.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("tcp_stun")){const l=o.match(/tcp_stun\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.tcp_stun=r.map(i=>i.replace(/"/g,"")))}}}}return t},yo=e=>{let t="";e.config_name&&(t+=`# 配置名称 -config_name = "${e.config_name}" -`),t+=` -# --- 网络配置 --- -`,t+=`# 网络编号,相同网络编号的会组在同一个虚拟网 (必填) -`,t+=`network_code = "${e.network_code}" - -`;const s=e.server.filter(c=>c.trim());s.length>0&&(t+=`# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) -`,t+=`# dynamic 协议使用dns txt解析记录值 -`,t+=`server = [${s.map(c=>`"${c}"`).join(", ")}] -`),e.ip&&(t+=` -# 自定义虚拟 IP (可选) -`,t+=`ip = "${e.ip}" -`),e.rtx&&(t+=` -# 是否启用quic优化传输 (默认 false) -`,t+=`# 开启后传输过程几乎不会丢包,但是延迟可能会有波动 -`,t+=`rtx = true -`),e.fec&&(t+=` -# 是否启用 FEC 前向纠错 (默认 false) -`,t+=`# 开启后可以减少丢包率,损失带宽但是延迟比较稳定,带宽充足时可以使用此功能 -`,t+=`fec = true -`),e.no_punch&&(t+=` -# 是否关闭 P2P 打洞 (默认 false) -`,t+=`no_punch = true -`),e.compress&&(t+=` -# 是否启用 LZ4 压缩 (默认 false) -`,t+=`compress = true -`);const n=e.input.filter(c=>c.trim());n.length>0&&(t+=` -# 入栈监听网段 (逗号分隔的 CIDR 和目标 IP),用于点对网,将指定网段的流量发送到目标节点 -`,t+=`# 例如192.168.0.0/24,10.26.0.2 表示将192.168.0.0/24网段的数据转发到10.26.0.2 -`,t+=`input = [${n.map(c=>`"${c}"`).join(", ")}] -`);const o=e.output.filter(c=>c.trim());o.length>0&&(t+=` -# 出栈允许网段,用于点对网,允许指定网段的转发 -`,t+=`output = [${o.map(c=>`"${c}"`).join(", ")}] -`),e.no_nat&&(t+=` -# 是否关闭内置子网NAT,关闭后需要配置网卡转发,否则无法使用点对网 -`,t+=`# 通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 -`,t+=`no_nat = true -`),e.no_tun&&(t+=` -# 是否关闭TUN虚拟网卡,关闭后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 -`,t+=`no_tun = true -`);const l=e.port_mapping.filter(c=>c.trim());l.length>0&&(t+=` -# 端口映射,格式为:协议://本地监听地址-目标虚拟IP-目标映射地址 -`,t+=`# 端口映射用于在本地监听指定端口,并将收到的网络流量经由指定虚拟节点转发到目标地址 -`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80 表示将本地tcp的81端口的数据转发到10.0.0.2:80 -`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-192.168.1.10:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到192.168.1.10:80 -`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-anyonehost:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到anyonehost:80 -`,t+=`port_mapping = [${l.map(c=>`"${c}"`).join(", ")}] -`),e.allow_mapping&&(t+=` -# 是否允许作为端口映射出口,开启后其他设备才可使用本设备的ip为"目标虚拟IP" -`,t+=`# 开启后虚拟网络其他设备可以使用此设备当跳板访问其他网络 -`,t+=`allow_mapping = true -`),e.mtu&&(t+=` -# MTU 设置 -`,t+=`mtu = ${e.mtu} -`),t+=` -# --- 设备配置 --- -`,e.device_name&&(t+=` -# 设备名称 (可选,默认读取本机 hostname) -`,t+=`device_name = "${e.device_name}" -`),e.device_id&&(t+=` -# 设备 ID (可选,不填自动生成,不同设备ID不能相同) -`,t+=`device_id = "${e.device_id}" -`),e.tun_name&&(t+=` -# 虚拟网卡名称 -`,t+=`tun_name = "${e.tun_name}" -`),e.outbound_interface&&(t+=` -# 绑定对外通信 Socket 的出口网卡名称(用于服务端通信、P2P 打洞及转发流量) -`,t+=`outbound_interface = "${e.outbound_interface}" -`),t+=` -# --- 安全配置 --- -`,e.password&&(t+=` -# 组网加密密码 (可选) -`,t+=`password = "${e.password}" -`),e.cert_mode&&e.cert_mode!=="skip"&&(t+=` -# 证书校验方式: -`,t+=`# skip 跳过验证(默认) -`,t+=`# standard 使用系统证书验证 -`,t+=`# finger 使用证书指纹验证,服务端启动时日志会输出指纹 -`,e.cert_mode==="finger"&&e.fingerprint?t+=`cert_mode = "finger:${e.fingerprint}" -`:t+=`cert_mode = "${e.cert_mode}" -`);const r=e.udp_stun.filter(c=>c.trim());r.length>0&&(t+=` -# 自定义UDP STUN地址,不设置则用默认stun -`,t+=`udp_stun = [${r.map(c=>`"${c}"`).join(", ")}] -`);const i=e.tcp_stun.filter(c=>c.trim());return i.length>0&&(t+=` -# 自定义TCP STUN地址,不设置则用默认stun -`,t+=`tcp_stun = [${i.map(c=>`"${c}"`).join(", ")}] -`),t},dh=`# config_name = "配置名称" -# --- 网络配置 --- -# 网络编号,相同网络编号的会组在同一个虚拟网 (必填) -network_code = "your_network_code" - -# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) -# dynamic 协议使用dns txt解析记录值 -server = ["quic://1.2.3.4:29872"] - -# ===简单使用以下参数可以不动=== - -# 自定义虚拟 IP (可选) -# ip = "10.10.0.2" - -# 是否启用quic优化传输 (默认 false,设置为true时开启) -# 开启后传输过程几乎不会丢包,但是延迟会有波动 -# rtx = false - -# 是否启用 FEC 前向纠错,损失一定带宽来提升网络稳定性(默认 false,设置为true时开启) -# 开启后可以减少丢包率,损失带宽但是延迟比较稳定,带宽充足时可以使用此功能 -# fec = false - -# 是否关闭 P2P 打洞 (默认 false,设置为true时关闭) -# no_punch = false - -# 是否启用 LZ4 压缩 (默认 false,设置为true时开启) -# compress = false - -# 入栈监听网段 (逗号分隔的 CIDR 和目标 IP),用于点对网,将指定网段的流量发送到目标节点 -# input = ["192.168.0.0/24,10.26.0.2", "192.168.1.0/24,10.26.0.3"] - -# 出栈允许网段,用于点对网,允许指定网段的转发 -# output = ["0.0.0.0/0"] - -# 是否关闭内置子网NAT,关闭(设为true)后需要配置网卡转发,否则无法使用点对网。通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 -# no_nat = false - -# 是否关闭TUN虚拟网卡,关闭(设为true)后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 -# no_tun = false - -# 端口映射,格式为:协议://本地监听地址-目标虚拟IP-目标映射地址 -# 端口映射用于在本地监听指定端口,并将收到的网络流量经由指定虚拟节点转发到目标地址,从而实现跨网络或内网服务访问 -# 例如 port_mapping = ["tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80"] -# tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80 则表示将本地tcp的81端口的数据转发到10.0.0.2:80 -# tcp://0.0.0.0:81-10.0.0.2-192.168.1.10:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到192.168.1.10:80 -# tcp://0.0.0.0:81-10.0.0.2-anyonehost:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到anyonehost:80 -# port_mapping = [] - -# 是否允许作为端口映射出口,开启(设置为true)后其他设备才可使用本设备的ip为"目标虚拟IP" -# 开启后虚拟网络其他设备可以使用此设备当跳板访问其他网络 -# allow_mapping = false - -# MTU 设置 -# mtu = 1400 - -# --- 设备配置 --- - -# 设备名称 (可选,默认读取本机 hostname) -# device_name = "my-device" - -# 设备 ID (可选,不填自动生成,不同设备ID不能相同) -# device_id = "device-id-xxxx" - -# 虚拟网卡名称 -# tun_name = "vnt-tun" - -# 绑定对外通信 Socket 的出口网卡名称(例如 Ethernet、Wi-Fi、eth0) -# outbound_interface = "Ethernet" - -# --- 安全配置 --- - -# 加密密码 (可选) -# password = "123456" - -# 证书校验方式: -# skip 跳过验证(默认) -# standard 使用系统证书验证 -# finger 使用证书指纹验证,服务端启动时日志会输出指纹, -# 例如 finger:3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1 -# cert_mode = "skip" - -# --- 其他配置 --- -# 自定义stun地址,分别用于udp打洞和tcp打洞,需要单独配置,不设置则用默认stun -# udp_stun = ["stun.chat.bilibili.com"] -# tcp_stun = ["stun.nextcloud.com:443"]`,ph={class:"text-lg font-bold text-slate-900 dark:text-white"},hh={class:"flex items-center gap-4"},mh={class:"flex rounded-lg border border-slate-300 bg-slate-100 p-1 dark:border-slate-600 dark:bg-slate-800"},gh={key:0,class:"text-sm text-slate-500 font-mono hidden md:block"},vh={class:"h-full overflow-y-auto scrollbar-hide p-6"},bh={class:"max-w-4xl mx-auto space-y-6"},xh={class:"card"},_h={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},yh={class:"mt-4"},kh={class:"space-y-2"},wh=["onUpdate:modelValue"],Ch=["onClick"],Sh={class:"card"},Eh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Th={class:"card"},$h={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Ah={class:"card"},Ih={class:"space-y-4"},Rh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Ph={key:0},Oh={class:"card"},Mh={class:"space-y-4"},Nh={class:"space-y-2"},Lh=["onUpdate:modelValue"],Vh=["onClick"],jh={class:"space-y-2"},Dh=["onUpdate:modelValue"],Bh=["onClick"],Fh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Uh={class:"card"},Hh={class:"space-y-4"},Wh={class:"space-y-2"},Kh=["onUpdate:modelValue"],Gh=["onClick"],qh={class:"card"},zh={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4"},Zh={class:"card"},Jh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Yh={class:"space-y-2"},Qh=["onUpdate:modelValue"],Xh=["onClick"],em={class:"space-y-2"},tm=["onUpdate:modelValue"],sm=["onClick"],nm={class:"h-full"},om={class:"flex-1 text-left text-xs text-slate-500"},lm={key:0},rm={key:1},Jt="h-5 w-5 rounded border-slate-300 bg-white text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700",Yt="flex cursor-pointer items-center justify-between gap-2 rounded-lg border border-slate-200 bg-slate-50 p-3 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800/50 dark:hover:bg-slate-800",hs="shrink-0 rounded-lg bg-red-50 px-3 py-2 text-red-500 transition-colors hover:bg-red-100 dark:bg-red-900/20 dark:text-red-500 dark:hover:bg-red-900/40",ms="flex w-full items-center justify-center gap-1 rounded-lg bg-slate-100 px-3 py-2 text-sm text-slate-600 transition-colors hover:bg-slate-200 dark:bg-slate-700/50 dark:text-slate-300 dark:hover:bg-slate-700",jt="text-md mb-4 flex items-center font-bold text-slate-900 dark:text-white",im={__name:"ConfigEditor",props:{show:{type:Boolean,default:!1},fileName:{type:String,default:null}},emits:["close","saved"],setup(e,{emit:t}){const s=e,n=t,o=cs(),l=Z(""),r=Z(""),i=Z("new"),c=Z("form"),f=Z(""),u=Z(!1),p=Z(!1),g=Z(!1),h=Z(Fo()),C=[{value:"skip",label:"跳过验证(默认)"},{value:"standard",label:"系统证书验证"},{value:"finger",label:"证书指纹验证"}];Le(()=>s.show,async y=>{if(y)if(r.value=s.fileName||"",i.value=s.fileName?"edit":"new",c.value="form",u.value=!1,p.value=!1,s.fileName)try{const d=await Td(s.fileName);l.value=d,f.value=d,g.value=!0,h.value=wr(d),yt(()=>{g.value=!1})}catch(d){o.toast.error("获取配置失败: "+d.message),n("close")}else f.value="",h.value=Fo(),l.value=dh});const w=()=>{c.value==="toml"?(c.value="form",g.value=!0,h.value=wr(l.value),yt(()=>{g.value=!1})):c.value="form"},N=()=>{c.value==="form"&&(p.value?(l.value=yo(h.value),p.value=!1):f.value&&!u.value?l.value=f.value:l.value=yo(h.value)),c.value="toml"};Le(l,(y,d)=>{c.value==="toml"&&d!==void 0&&(u.value=!0)}),Le(h,()=>{c.value==="form"&&s.show&&!g.value&&(p.value=!0)},{deep:!0});const T=async()=>{try{let y=l.value;if(c.value==="form"){if(!h.value.network_code.trim()){o.toast.error("请填写网络编号");return}if(h.value.server.filter(b=>b.trim()).length===0){o.toast.error("请至少填写一个服务器地址");return}y=yo(h.value)}await $d(r.value||null,y),o.toast.success("配置已保存"),n("close"),n("saved")}catch(y){o.toast.error("保存失败: "+y.message)}};return(y,d)=>(k(),Ve(pl,{show:e.show,"mask-closable":!1,"panel-class":"w-full max-w-6xl h-[85vh]",onClose:d[27]||(d[27]=b=>n("close"))},{header:Ie(()=>[a("h3",ph,L(i.value==="new"?"新建配置":"编辑配置"),1),a("div",hh,[a("div",mh,[a("button",{onClick:w,class:G([c.value==="form"?"bg-white text-slate-900 shadow-sm dark:bg-indigo-600 dark:text-white":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white","px-4 py-1.5 rounded text-sm font-medium transition-colors flex items-center"])},[...d[28]||(d[28]=[a("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1),ce(" 表单模式 ",-1)])],2),a("button",{onClick:N,class:G([c.value==="toml"?"bg-white text-slate-900 shadow-sm dark:bg-indigo-600 dark:text-white":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white","px-4 py-1.5 rounded text-sm font-medium transition-colors flex items-center"])},[...d[29]||(d[29]=[a("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"})],-1),ce(" TOML模式 ",-1)])],2)]),r.value?(k(),S("div",gh,L(r.value),1)):le("",!0)])]),body:Ie(()=>[xe(a("div",vh,[a("div",bh,[a("div",xh,[a("h4",{class:G(jt)},[...d[30]||(d[30]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),ce(" 基础配置 ",-1)])]),a("div",_h,[a("div",null,[d[31]||(d[31]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"配置名称",-1)),xe(a("input",{"onUpdate:modelValue":d[0]||(d[0]=b=>h.value.config_name=b),type:"text",placeholder:"例如: 我的VPN配置",class:"input"},null,512),[[Ae,h.value.config_name]])]),a("div",null,[d[32]||(d[32]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ce(" 网络编号 "),a("span",{class:"text-red-500"},"*")],-1)),xe(a("input",{"onUpdate:modelValue":d[1]||(d[1]=b=>h.value.network_code=b),type:"text",placeholder:"例如: my_network",required:"",class:"input"},null,512),[[Ae,h.value.network_code]])])]),a("div",yh,[d[35]||(d[35]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ce(" 服务器地址 "),a("span",{class:"text-red-500"},"*"),a("span",{class:"text-xs text-slate-500 ml-2"},"支持 quic:// tcp:// wss:// dynamic://")],-1)),a("div",kh,[(k(!0),S(ae,null,Te(h.value.server,(b,x)=>(k(),S("div",{key:x,class:"flex gap-2"},[xe(a("input",{"onUpdate:modelValue":V=>h.value.server[x]=V,type:"text",placeholder:"例如: quic://1.2.3.4:29872",class:"input flex-1"},null,8,wh),[[Ae,h.value.server[x]]]),h.value.server.length>1?(k(),S("button",{key:0,onClick:V=>h.value.server.splice(x,1),class:G(hs)},[...d[33]||(d[33]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,Ch)):le("",!0)]))),128)),a("button",{onClick:d[2]||(d[2]=b=>h.value.server.push("")),class:G(ms)},[...d[34]||(d[34]=[a("svg",{class:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),ce(" 添加服务器 ",-1)])])])])]),a("div",Sh,[a("h4",{class:G(jt)},[...d[36]||(d[36]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1),ce(" 网络设置 ",-1)])]),a("div",Eh,[a("div",null,[d[37]||(d[37]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ce(" 自定义虚拟IP "),a("span",{class:"text-xs text-slate-500 ml-1"},"(可选)")],-1)),xe(a("input",{"onUpdate:modelValue":d[3]||(d[3]=b=>h.value.ip=b),type:"text",placeholder:"例如: 10.26.0.2",class:"input"},null,512),[[Ae,h.value.ip]])]),a("div",null,[d[38]||(d[38]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"MTU",-1)),xe(a("input",{"onUpdate:modelValue":d[4]||(d[4]=b=>h.value.mtu=b),type:"number",placeholder:"1380",class:"input"},null,512),[[Ae,h.value.mtu,void 0,{number:!0}]])]),a("div",null,[d[39]||(d[39]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"隧道端口",-1)),xe(a("input",{"onUpdate:modelValue":d[5]||(d[5]=b=>h.value.tunnel_port=b),type:"number",placeholder:"0 (自动分配)",class:"input"},null,512),[[Ae,h.value.tunnel_port,void 0,{number:!0}]])])])]),a("div",Th,[a("h4",{class:G(jt)},[...d[40]||(d[40]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),ce(" 传输优化 ",-1)])]),a("div",$h,[a("label",{class:G(Yt)},[d[41]||(d[41]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"QUIC传输优化"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"重传丢包")],-1)),xe(a("input",{"onUpdate:modelValue":d[6]||(d[6]=b=>h.value.rtx=b),type:"checkbox",class:G(Jt)},null,512),[[Zt,h.value.rtx]])]),a("label",{class:G(Yt)},[d[42]||(d[42]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"FEC前向纠错"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"损失部分带宽提升稳定性")],-1)),xe(a("input",{"onUpdate:modelValue":d[7]||(d[7]=b=>h.value.fec=b),type:"checkbox",class:G(Jt)},null,512),[[Zt,h.value.fec]])]),a("label",{class:G(Yt)},[d[43]||(d[43]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"LZ4压缩"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"减少传输数据量")],-1)),xe(a("input",{"onUpdate:modelValue":d[8]||(d[8]=b=>h.value.compress=b),type:"checkbox",class:G(Jt)},null,512),[[Zt,h.value.compress]])]),a("label",{class:G(Yt)},[d[44]||(d[44]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭P2P打洞"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"仅通过服务器中转")],-1)),xe(a("input",{"onUpdate:modelValue":d[9]||(d[9]=b=>h.value.no_punch=b),type:"checkbox",class:G(Jt)},null,512),[[Zt,h.value.no_punch]])])])]),a("div",Ah,[a("h4",{class:G(jt)},[...d[45]||(d[45]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1),ce(" 安全配置 ",-1)])]),a("div",Ih,[a("div",Rh,[a("div",null,[d[46]||(d[46]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"组网加密密码(同一组网密码需要相同)",-1)),xe(a("input",{"onUpdate:modelValue":d[10]||(d[10]=b=>h.value.password=b),type:"password",placeholder:"留空则不加密",class:"input"},null,512),[[Ae,h.value.password]])]),a("div",null,[d[47]||(d[47]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"服务端证书校验模式",-1)),fe(hl,{modelValue:h.value.cert_mode,"onUpdate:modelValue":d[11]||(d[11]=b=>h.value.cert_mode=b),options:C,"aria-label":"服务端证书校验模式"},null,8,["modelValue"])])]),h.value.cert_mode==="finger"?(k(),S("div",Ph,[d[48]||(d[48]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ce(" 证书指纹 "),a("span",{class:"text-xs text-slate-500 ml-1"},"(服务端启动时日志会输出指纹)")],-1)),xe(a("input",{"onUpdate:modelValue":d[12]||(d[12]=b=>h.value.fingerprint=b),type:"text",placeholder:"例如: 3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1",class:"input font-mono text-sm"},null,512),[[Ae,h.value.fingerprint]])])):le("",!0)])]),a("div",Oh,[a("h4",{class:G(jt)},[...d[49]||(d[49]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 01-.806-.98L15 9m0 0V7m0 2v6"})],-1),ce(" NAT与路由 (点对网) ",-1)])]),a("div",Mh,[a("div",null,[d[51]||(d[51]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ce(" 入栈网段 "),a("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR,目标IP")],-1)),a("div",Nh,[(k(!0),S(ae,null,Te(h.value.input,(b,x)=>(k(),S("div",{key:x,class:"flex gap-2"},[xe(a("input",{"onUpdate:modelValue":V=>h.value.input[x]=V,type:"text",placeholder:"例如: 192.168.0.0/24,10.26.0.2",class:"input flex-1"},null,8,Lh),[[Ae,h.value.input[x]]]),a("button",{onClick:V=>h.value.input.splice(x,1),class:G(hs)},[...d[50]||(d[50]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Vh)]))),128)),a("button",{onClick:d[13]||(d[13]=b=>h.value.input.push("")),class:G(ms)}," + 添加入栈网段 ")])]),a("div",null,[d[53]||(d[53]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ce(" 出栈网段 "),a("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR (允许转发的网段)")],-1)),a("div",jh,[(k(!0),S(ae,null,Te(h.value.output,(b,x)=>(k(),S("div",{key:x,class:"flex gap-2"},[xe(a("input",{"onUpdate:modelValue":V=>h.value.output[x]=V,type:"text",placeholder:"例如: 0.0.0.0/0",class:"input flex-1"},null,8,Dh),[[Ae,h.value.output[x]]]),a("button",{onClick:V=>h.value.output.splice(x,1),class:G(hs)},[...d[52]||(d[52]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Bh)]))),128)),a("button",{onClick:d[14]||(d[14]=b=>h.value.output.push("")),class:G(ms)}," + 添加出栈网段 ")])]),a("div",Fh,[a("label",{class:G(Yt)},[d[54]||(d[54]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭内置NAT"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"使用系统网卡转发")],-1)),xe(a("input",{"onUpdate:modelValue":d[15]||(d[15]=b=>h.value.no_nat=b),type:"checkbox",class:G(Jt)},null,512),[[Zt,h.value.no_nat]])]),a("label",{class:G(Yt)},[d[55]||(d[55]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭TUN网卡"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"仅作流量出口或端口映射")],-1)),xe(a("input",{"onUpdate:modelValue":d[16]||(d[16]=b=>h.value.no_tun=b),type:"checkbox",class:G(Jt)},null,512),[[Zt,h.value.no_tun]])])])])]),a("div",Uh,[a("h4",{class:G(jt)},[...d[56]||(d[56]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})],-1),ce(" 端口映射 ",-1)])]),a("div",Hh,[a("div",null,[d[58]||(d[58]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ce(" 映射规则 "),a("span",{class:"text-xs text-slate-500 ml-1"},"格式: 协议://监听地址-虚拟IP-目标地址")],-1)),a("div",Wh,[(k(!0),S(ae,null,Te(h.value.port_mapping,(b,x)=>(k(),S("div",{key:x,class:"flex gap-2"},[xe(a("input",{"onUpdate:modelValue":V=>h.value.port_mapping[x]=V,type:"text",placeholder:"例如: tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80",class:"input flex-1 font-mono"},null,8,Kh),[[Ae,h.value.port_mapping[x]]]),a("button",{onClick:V=>h.value.port_mapping.splice(x,1),class:G(hs)},[...d[57]||(d[57]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Gh)]))),128)),a("button",{onClick:d[17]||(d[17]=b=>h.value.port_mapping.push("")),class:G(ms)}," + 添加映射规则 ")])]),a("label",{class:G(Yt)},[d[59]||(d[59]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"允许作为映射出口"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"允许其他设备使用本机作跳板")],-1)),xe(a("input",{"onUpdate:modelValue":d[18]||(d[18]=b=>h.value.allow_mapping=b),type:"checkbox",class:G(Jt)},null,512),[[Zt,h.value.allow_mapping]])])])]),a("div",qh,[a("h4",{class:G(jt)},[...d[60]||(d[60]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})],-1),ce(" 设备配置 ",-1)])]),a("div",zh,[a("div",null,[d[61]||(d[61]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备名称",-1)),xe(a("input",{"onUpdate:modelValue":d[19]||(d[19]=b=>h.value.device_name=b),type:"text",placeholder:"默认为主机名",class:"input"},null,512),[[Ae,h.value.device_name]])]),a("div",null,[d[62]||(d[62]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备ID",-1)),xe(a("input",{"onUpdate:modelValue":d[20]||(d[20]=b=>h.value.device_id=b),type:"text",placeholder:"自动生成",class:"input"},null,512),[[Ae,h.value.device_id]])]),a("div",null,[d[63]||(d[63]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"虚拟网卡名",-1)),xe(a("input",{"onUpdate:modelValue":d[21]||(d[21]=b=>h.value.tun_name=b),type:"text",placeholder:"默认为vnt-tun",class:"input"},null,512),[[Ae,h.value.tun_name]])]),a("div",null,[d[64]||(d[64]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"绑定出口网卡",-1)),xe(a("input",{"onUpdate:modelValue":d[22]||(d[22]=b=>h.value.outbound_interface=b),type:"text",placeholder:"例如 Ethernet、Wi-Fi、eth0",class:"input"},null,512),[[Ae,h.value.outbound_interface]]),d[65]||(d[65]=a("p",{class:"mt-1.5 text-xs leading-5 text-slate-400"},"服务端通信、P2P 打洞及转发流量将使用此网卡",-1))])])]),a("div",Zh,[a("h4",{class:G(jt)},[...d[66]||(d[66]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),ce(" STUN配置 (高级) ",-1)])]),a("div",Jh,[a("div",null,[d[68]||(d[68]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"UDP STUN服务器",-1)),a("div",Yh,[(k(!0),S(ae,null,Te(h.value.udp_stun,(b,x)=>(k(),S("div",{key:x,class:"flex gap-2"},[xe(a("input",{"onUpdate:modelValue":V=>h.value.udp_stun[x]=V,type:"text",placeholder:"例如: stun.l.google.com:19302",class:"input flex-1"},null,8,Qh),[[Ae,h.value.udp_stun[x]]]),a("button",{onClick:V=>h.value.udp_stun.splice(x,1),class:G(hs)},[...d[67]||(d[67]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Xh)]))),128)),a("button",{onClick:d[23]||(d[23]=b=>h.value.udp_stun.push("")),class:G(ms)}," + 添加UDP STUN ")])]),a("div",null,[d[70]||(d[70]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"TCP STUN服务器",-1)),a("div",em,[(k(!0),S(ae,null,Te(h.value.tcp_stun,(b,x)=>(k(),S("div",{key:x,class:"flex gap-2"},[xe(a("input",{"onUpdate:modelValue":V=>h.value.tcp_stun[x]=V,type:"text",placeholder:"例如: stun.nextcloud.com:443",class:"input flex-1"},null,8,tm),[[Ae,h.value.tcp_stun[x]]]),a("button",{onClick:V=>h.value.tcp_stun.splice(x,1),class:G(hs)},[...d[69]||(d[69]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,sm)]))),128)),a("button",{onClick:d[24]||(d[24]=b=>h.value.tcp_stun.push("")),class:G(ms)}," + 添加TCP STUN ")])])])])])],512),[[Kl,c.value==="form"]]),xe(a("div",nm,[xe(a("textarea",{"onUpdate:modelValue":d[25]||(d[25]=b=>l.value=b),class:"h-full w-full resize-none bg-slate-50 p-4 font-mono text-sm text-slate-800 focus:outline-none dark:bg-slate-950 dark:text-slate-200",spellcheck:"false",placeholder:"# 在此处输入 TOML 配置..."},null,512),[[Ae,l.value]])],512),[[Kl,c.value==="toml"]])]),footer:Ie(()=>[a("div",om,[c.value==="form"?(k(),S("span",lm,"填写完成后保存即可生成配置文件")):(k(),S("span",rm,"* 请使用标准 TOML 格式"))]),a("button",{class:"btn-ghost",onClick:d[26]||(d[26]=b=>n("close"))},"取消"),a("button",{class:"btn-primary",onClick:T},"保存配置")]),_:1},8,["show"]))}},am={class:"space-y-6"},cm={class:"flex items-end justify-between gap-4"},um={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},fm=["onClick"],dm={key:0,class:"absolute right-0 top-0 rounded-bl bg-green-500 px-2 py-1 text-xs text-white"},pm={key:1,class:"absolute right-0 top-0 rounded-bl bg-indigo-500 px-2 py-1 text-xs text-white"},hm={class:"flex items-start"},mm={class:"overflow-hidden"},gm=["title"],vm=["title"],bm={class:"config-card-actions mt-4 flex justify-end transition-opacity"},xm=["onClick"],_m=["onClick"],ym={__name:"ConfigView",setup(e){const t=Nt(),s=cs(),n=Z(!1),o=Z(null),l=u=>{const p=t.instanceList.find(g=>g.file_name===u);return p?p.status:null},r=u=>{const p=l(u);return p==="running"?"ring-2 ring-green-500/60":p==="starting"?"ring-2 ring-indigo-500/60":""},i=u=>{o.value=u,n.value=!0},c=()=>{t.fetchConfigList()},f=async u=>{if(await s.confirm({title:"删除配置",message:`确定要删除配置 ${u} 吗?`,danger:!0,confirmText:"删除"}))try{await Ad(u),s.toast.success("配置已删除"),t.fetchConfigList()}catch(g){s.toast.error(g.message)}};return at(()=>t.fetchConfigList()),(u,p)=>(k(),S("div",am,[a("div",cm,[p[3]||(p[3]=a("div",null,[a("h1",{class:"page-title"},"配置"),a("p",{class:"page-subtitle"},"管理组网配置文件")],-1)),a("button",{class:"btn-primary",onClick:p[0]||(p[0]=g=>i(null))},[...p[2]||(p[2]=[a("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),ce(" 新建配置 ",-1)])])]),R(t).configList.length===0?(k(),Ve(Xn,{key:0,text:"暂无配置,点击右上角新建"})):(k(),S("div",um,[(k(!0),S(ae,null,Te(R(t).configList,g=>(k(),S("div",{key:g.file_name,class:G([r(g.file_name),"card group relative flex min-h-[140px] cursor-pointer flex-col justify-between overflow-hidden"]),onClick:h=>i(g.file_name)},[l(g.file_name)==="running"?(k(),S("div",dm," 运行中 ")):l(g.file_name)==="starting"?(k(),S("div",pm," 启动中 ")):le("",!0),a("div",hm,[p[4]||(p[4]=a("div",{class:"mr-3 mt-1 rounded-lg bg-indigo-50 p-2 text-indigo-600 dark:bg-indigo-500/10 dark:text-indigo-400"},[a("svg",{class:"h-6 w-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})])],-1)),a("div",mm,[a("h3",{class:"truncate text-lg font-bold text-slate-900 dark:text-white",title:g.config_name},L(g.config_name||"Unnamed"),9,gm),a("p",{class:"truncate font-mono text-xs text-slate-400",title:g.file_name},L(g.file_name),9,vm)])]),a("div",bm,[a("button",{class:"mr-4 text-sm text-indigo-600 hover:text-indigo-500 dark:text-indigo-400",onClick:rs(h=>i(g.file_name),["stop"])}," 编辑 ",8,xm),a("button",{class:"text-sm text-red-500 hover:text-red-400",onClick:rs(h=>f(g.file_name),["stop"])}," 删除 ",8,_m)])],10,fm))),128))])),fe(im,{show:n.value,"file-name":o.value,onClose:p[1]||(p[1]=g=>n.value=!1),onSaved:c},null,8,["show","file-name"])]))}},km=Qn(ym,[["__scopeId","data-v-b7dce6ea"]]),wm=e=>{if(!e)return"-";const t=new Date(e*1e3),s=n=>n<10?"0"+n:n;return`${t.getFullYear()}-${s(t.getMonth()+1)}-${s(t.getDate())} ${s(t.getHours())}:${s(t.getMinutes())}:${s(t.getSeconds())}`},Cr=e=>{if(e===0||e===void 0||e===null)return"0B";const t=["B","KB","MB","GB","TB"];let s=0,n=e;for(;n>=1024&&s{if(e===0||e===void 0||e===null)return"0B/s";const t=["B/s","KB/s","MB/s","GB/s"];let s=0,n=e;for(;n>=1024&&s{const t=[1024,10240,102400,1048576,10485760,104857600,1073741824];for(const s of t)if(e<=s)return s;return Math.ceil(e/(1024*1024*1024))*1024*1024*1024},ka={__name:"StatusDot",props:{status:{type:String,default:"stopped"},size:{type:String,default:"w-2.5 h-2.5"}},setup(e){const t=s=>s==="running"?"bg-green-500":s==="starting"?"bg-blue-500 animate-pulse":"bg-slate-400 dark:bg-slate-500";return(s,n)=>(k(),S("span",{class:G(["rounded-full inline-block shrink-0",[e.size,t(e.status)]])},null,2))}},Sm={class:"flex items-center gap-4 mb-2 text-xs text-slate-400"},Em={class:"ml-auto"},Tm={__name:"SpeedChart",props:{history:{type:Object,required:!0},size:{type:Number,default:60}},setup(e,{expose:t}){const s=e,n=Z(null),o=Z(""),l=()=>{const r=n.value;if(!r)return;const i=r.getContext("2d"),c=s.history?s.history.tx:[],f=s.history?s.history.rx:[],u=s.size,p=window.devicePixelRatio||1,g=r.getBoundingClientRect();if(g.width===0)return;r.width=g.width*p,r.height=g.height*p,i.setTransform(p,0,0,p,0,0);const h=g.width,C=g.height,N=document.documentElement.classList.contains("dark")?{bg:"#0c1222",grid:"rgba(71, 85, 105, 0.3)",rx:"#60a5fa",rxFill:"rgba(96, 165, 250, 0.15)",tx:"#4ade80",txFill:"rgba(74, 222, 128, 0.15)"}:{bg:"#f8fafc",grid:"rgba(148, 163, 184, 0.35)",rx:"#3b82f6",rxFill:"rgba(59, 130, 246, 0.12)",tx:"#22c55e",txFill:"rgba(34, 197, 94, 0.12)"},T=8,y=4,d=0,x=h-d-0,V=C-T-y;i.fillStyle=N.bg,i.fillRect(0,0,h,C);const j=[...c,...f];let H=j.length>0?Math.max(...j):0;H<1024&&(H=1024);const M=Cm(H);o.value="峰值: "+Uo(M);const z=4;i.strokeStyle=N.grid,i.lineWidth=1;for(let J=0;J<=z;J++){const P=T+V/z*J;i.beginPath(),i.moveTo(d,P),i.lineTo(d+x,P),i.stroke()}const oe=6;for(let J=0;J<=oe;J++){const P=d+x/oe*J;i.beginPath(),i.moveTo(P,T),i.lineTo(P,T+V),i.stroke()}const F=(J,P,te)=>{if(J.length<2)return;const ue=x/(u-1),se=u-J.length;i.beginPath(),i.moveTo(d+se*ue,T+V);for(let ie=0;ieyt(l)),Le(()=>[s.history?.tx?.length,s.history?.rx?.length,s.history?.tx?.at(-1),s.history?.rx?.at(-1)],()=>yt(l)),t({draw:l}),(r,i)=>(k(),S("div",null,[a("div",Sm,[i[0]||(i[0]=a("span",{class:"flex items-center"},[a("span",{class:"inline-block w-3 h-0.5 bg-green-400 mr-1"}),ce("上传速度")],-1)),i[1]||(i[1]=a("span",{class:"flex items-center"},[a("span",{class:"inline-block w-3 h-0.5 bg-blue-400 mr-1"}),ce("下载速度")],-1)),a("span",Em,L(o.value),1)]),a("canvas",{ref_key:"canvasRef",ref:n,class:"rounded w-full block h-[150px]"},null,512)]))}},$m={class:"space-y-4"},Am={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Im=["onClick"],Rm={key:2,class:"card overflow-hidden p-0"},Pm={class:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-700"},Om={class:"flex gap-4 text-sm muted"},Mm={class:"font-medium tabular-nums text-slate-900 dark:text-white"},Nm={class:"font-medium tabular-nums text-slate-900 dark:text-white"},Lm={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},Vm={class:"table peer-table"},jm={class:"transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50"},Dm=["onClick"],Bm={class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},Fm=["onMouseenter"],Um={class:"hidden text-xs text-slate-400 md:table-cell"},Hm={class:"flex items-center gap-2"},Wm={key:0,class:"tooltip"},Km={key:1,class:"tooltip"},Gm={key:2,class:"tooltip cursor-help"},qm={class:"tooltip-text"},zm={key:1,class:"text-yellow-600 dark:text-yellow-400"},Zm={key:2,class:"text-slate-400"},Jm={class:"tabular-nums"},Ym=["title"],Qm={key:1,class:"text-slate-400"},Xm={class:"text-xs"},eg={key:0,class:"leading-relaxed"},tg={class:"text-green-600 tabular-nums dark:text-green-400"},sg={class:"text-blue-600 tabular-nums dark:text-blue-400"},ng={key:1,class:"text-slate-400"},og={class:"hidden font-mono text-xs text-slate-400 md:table-cell"},lg={key:0},rg={colspan:"10",class:"p-0"},ig={class:"border-t border-slate-200 bg-slate-50 px-4 py-3 dark:border-slate-700/50 dark:bg-slate-950/60"},ag=60,cg={__name:"PeersView",setup(e){const t=Nt(),s=Qe("peerTooltip"),n=(d,b)=>s.value?.showPeerTooltip(d,b),o=()=>s.value?.hidePeerTooltip(),l=Z([]);let r=null,i={},c=0;const f=Pt({}),u=Pt({}),p=d=>{f[d]=!f[d]},g=()=>{const d=t.instanceList.find(b=>b.file_name===t.selectedInstance);return d?d.status:null},h=()=>{l.value=[],i={},c=0;for(const d in u)delete u[d];for(const d in f)delete f[d]},C=async()=>{if(!t.selectedInstance||g()!=="running"){h();return}try{const d=await xd(t.selectedInstance)||[],b=Date.now(),x=c>0?(b-c)/1e3:0,V={};for(const j of d)if(j.traffic){const H=j.ip,M=i[H];if(M&&x>0){const z=Math.max(0,j.traffic.tx_bytes-M.tx_bytes),oe=Math.max(0,j.traffic.rx_bytes-M.rx_bytes);j.traffic.tx_speed=Math.round(z/x),j.traffic.rx_speed=Math.round(oe/x)}else j.traffic.tx_speed=0,j.traffic.rx_speed=0;V[H]={tx_bytes:j.traffic.tx_bytes,rx_bytes:j.traffic.rx_bytes},u[H]||(u[H]={tx:[],rx:[]}),u[H].tx.push(j.traffic.tx_speed),u[H].rx.push(j.traffic.rx_speed),u[H].tx.length>ag&&(u[H].tx.shift(),u[H].rx.shift())}i=V,c=b,l.value=d}catch(d){console.error(d)}};at(()=>{C(),r=setInterval(()=>{t.isPageVisible&&C()},3e3)}),Es(()=>{r&&clearInterval(r)}),Le(()=>t.selectedInstance,()=>{h(),C()}),Le(g,d=>{d==="running"&&C()});const w=d=>d.metric===1?"font-medium text-green-600 dark:text-green-400":"text-blue-600 dark:text-blue-400",N=d=>{const b=d.metric===1,x=d.protocol.includes("Tcp");return b?x?"打洞TCP直连":"打洞UDP直连":x?"客户端TCP中继":"客户端UDP中继"},T=d=>d===3?"己方加密对方未加密":d===4?"己方未加密对方加密":d===5?"密钥不一致":"未知错误",y=d=>t.selectedInstance===d?"border-indigo-600 bg-indigo-600 text-white dark:border-indigo-500 dark:bg-indigo-500":"border-slate-300 bg-white text-slate-600 hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700";return(d,b)=>(k(),S("div",$m,[b[8]||(b[8]=a("div",null,[a("h1",{class:"page-title"},"设备列表"),a("p",{class:"page-subtitle"},"查看各实例的设备连接与流量状况")],-1)),R(t).instanceList.length>0?(k(),S("div",Am,[(k(!0),S(ae,null,Te(R(t).instanceList,x=>(k(),S("button",{key:x.file_name,onClick:V=>R(t).selectedInstance=x.file_name,class:G([y(x.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[fe(ka,{status:x.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),ce(" "+L(x.config_name||x.file_name),1)],10,Im))),128))])):le("",!0),R(t).selectedInstance?(k(),S("div",Rm,[a("div",Pm,[b[2]||(b[2]=a("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"设备列表",-1)),a("div",Om,[a("span",null,[b[0]||(b[0]=ce(" Online: ",-1)),a("span",Mm,L(l.value.filter(x=>x.online).length),1)]),a("span",null,[b[1]||(b[1]=ce(" Total: ",-1)),a("span",Nm,L(l.value.length),1)])])]),a("div",Lm,[a("table",Vm,[b[7]||(b[7]=a("thead",null,[a("tr",null,[a("th",{class:"w-8 px-2"}),a("th",null,"IP地址"),a("th",null,"名称"),a("th",{class:"hidden md:table-cell"},"版本"),a("th",null,"状态"),a("th",null,"模式"),a("th",null,"延迟"),a("th",null,"丢包率"),a("th",null,"流量"),a("th",{class:"hidden md:table-cell"},"最后在线")])],-1)),a("tbody",null,[(k(!0),S(ae,null,Te(l.value,x=>(k(),S(ae,{key:x.ip},[a("tr",jm,[a("td",{class:"cursor-pointer select-none px-2 text-center",onClick:V=>p(x.ip)},[(k(),S("svg",{class:G(["inline-block h-4 w-4 text-slate-400 transition-transform duration-200",{"rotate-90":f[x.ip]}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...b[3]||(b[3]=[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2))],8,Dm),a("td",Bm,[a("span",{class:"cursor-help border-b border-dotted border-indigo-400/50 pb-0.5",onMouseenter:V=>n(V,x),onMouseleave:o},L(x.ip),41,Fm)]),a("td",null,L(x.name||"-"),1),a("td",Um,L(x.version||"-"),1),a("td",null,[a("div",Hm,[a("span",{class:G(x.online?"badge-green":"badge-gray")},L(x.online?"在线":"离线"),3),x.online&&x.key_equal===1?(k(),S("div",Wm,[...b[4]||(b[4]=[a("svg",{class:"h-4 w-4 text-green-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1),a("span",{class:"tooltip-text"},"双方加密传输",-1)])])):x.online&&x.key_equal===2?(k(),S("div",Km,[...b[5]||(b[5]=[a("svg",{class:"h-4 w-4 text-yellow-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"})],-1),a("span",{class:"tooltip-text"},"双方未加密",-1)])])):x.online&&[3,4,5].includes(x.key_equal)?(k(),S("div",Gm,[b[6]||(b[6]=a("svg",{class:"h-4 w-4 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),a("span",qm,L(T(x.key_equal)),1)])):le("",!0)])]),a("td",null,[x.online&&x.route?(k(),S("span",{key:0,class:G(w(x.route))},L(N(x.route)),3)):x.online?(k(),S("span",zm,"服务器中继")):(k(),S("span",Zm,"-"))]),a("td",Jm,L(x.route?x.route.rtt+" ms":"-"),1),a("td",null,[x.packet_loss?(k(),S("span",{key:0,class:G(x.packet_loss.loss_rate>10?"text-red-600 dark:text-red-400":x.packet_loss.loss_rate>5?"text-yellow-600 dark:text-yellow-400":"text-green-600 dark:text-green-400"),title:"Sent: "+x.packet_loss.sent+", Received: "+x.packet_loss.received},L(x.packet_loss.loss_rate.toFixed(1))+"%",11,Ym)):(k(),S("span",Qm,"-"))]),a("td",Xm,[x.traffic?(k(),S("div",eg,[a("div",tg," ↑ "+L(R(Cr)(x.traffic.tx_bytes))+" ("+L(R(Uo)(x.traffic.tx_speed))+") ",1),a("div",sg," ↓ "+L(R(Cr)(x.traffic.rx_bytes))+" ("+L(R(Uo)(x.traffic.rx_speed))+") ",1)])):(k(),S("span",ng,"-"))]),a("td",og,L(R(wm)(x.last_connected_time)),1)]),f[x.ip]?(k(),S("tr",lg,[a("td",rg,[a("div",ig,[fe(Tm,{history:u[x.ip]||{tx:[],rx:[]},size:60},null,8,["history"])])])])):le("",!0)],64))),128))])])])])):(k(),Ve(Xn,{key:1,text:"暂无运行中的组网实例"}))]))}},ug=Qn(cg,[["__scopeId","data-v-c64dc8e9"]]),fg={class:"space-y-4"},dg={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},pg=["onClick"],hg={key:2,class:"card overflow-hidden p-0"},mg={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},gg={class:"table"},vg=["rowspan"],bg={class:"font-mono tabular-nums text-yellow-700 dark:text-yellow-300"},xg={class:"tabular-nums"},_g={class:"tabular-nums"},yg={__name:"RoutesView",setup(e){const t=Nt(),s=Z([]);let n=null;const o=()=>{const i=t.instanceList.find(c=>c.file_name===t.selectedInstance);return i?i.status:null},l=async()=>{if(!t.selectedInstance||o()!=="running"){s.value=[];return}try{s.value=await _d(t.selectedInstance)||[]}catch(i){console.error(i)}};at(()=>{l(),n=setInterval(()=>{t.isPageVisible&&l()},3e3)}),Es(()=>{n&&clearInterval(n)}),Le(()=>t.selectedInstance,()=>{l()}),Le(o,i=>{i==="running"&&l()});const r=i=>t.selectedInstance===i?"border-indigo-600 bg-indigo-600 text-white dark:border-indigo-500 dark:bg-indigo-500":"border-slate-300 bg-white text-slate-600 hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700";return(i,c)=>(k(),S("div",fg,[c[2]||(c[2]=a("div",null,[a("h1",{class:"page-title"},"路由"),a("p",{class:"page-subtitle"},"查看各实例的路由表")],-1)),R(t).instanceList.length>0?(k(),S("div",dg,[(k(!0),S(ae,null,Te(R(t).instanceList,f=>(k(),S("button",{key:f.file_name,onClick:u=>R(t).selectedInstance=f.file_name,class:G([r(f.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[fe(ka,{status:f.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),ce(" "+L(f.config_name||f.file_name),1)],10,pg))),128))])):le("",!0),R(t).selectedInstance?(k(),S("div",hg,[c[1]||(c[1]=a("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[a("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"路由表")],-1)),a("div",mg,[a("table",gg,[c[0]||(c[0]=a("thead",null,[a("tr",null,[a("th",null,"目标节点IP"),a("th",null,"目标网络"),a("th",null,"跳数"),a("th",null,"延迟")])],-1)),a("tbody",null,[(k(!0),S(ae,null,Te(s.value,f=>(k(),S(ae,{key:f.ip},[(k(!0),S(ae,null,Te(f.routes,(u,p)=>(k(),S("tr",{key:p,class:"hover:bg-slate-50 dark:hover:bg-slate-800/50"},[p===0?(k(),S("td",{key:0,rowspan:f.routes.length,class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},L(f.ip),9,vg)):le("",!0),a("td",bg,L(u.addr),1),a("td",xg,L(u.metric),1),a("td",_g,L(u.rtt)+" ms",1)]))),128))],64))),128))])])])])):(k(),Ve(Xn,{key:1,text:"暂无运行中的组网实例"}))]))}},kg={class:"mx-auto max-w-4xl space-y-5"},wg={key:0,class:"card text-sm text-slate-400"},Cg={key:1,class:"card border-red-200 text-sm text-red-600 dark:border-red-900 dark:text-red-300"},Sg={class:"card space-y-6"},Eg={class:"flex items-start justify-between gap-5"},Tg=["aria-checked","disabled"],$g={class:"grid gap-5 sm:grid-cols-2"},Ag={class:"block"},Ig=["disabled"],Rg={class:"block"},Pg={class:"mb-2 flex items-center justify-between gap-3"},Og=["disabled"],Mg={class:"block min-w-0 truncate rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-300"},Ng={key:0,class:"border-t border-slate-200 pt-5 dark:border-slate-800"},Lg={key:0,class:"text-xs text-green-600 dark:text-green-400"},Vg={key:1,class:"text-xs text-red-600 dark:text-red-400"},jg={class:"card"},Dg={class:"flex items-start gap-3"},Bg={class:"min-w-0 flex-1"},Fg={class:"text-sm font-semibold text-slate-900 dark:text-white"},Ug={class:"mt-1 text-xs text-slate-400"},Hg={key:0,class:"mt-4 rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 font-mono text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-300"},Wg={class:"block truncate"},Kg={key:1,class:"mt-3 flex flex-wrap gap-2"},Gg={__name:"WebAccessView",setup(e){const t=globalThis.__VNT_WEB_ACCESS__,s=Pt({enabled:!1,port:19099,global:!1,token:""}),n=Z(null),o=Z(!0),l=Z(!1),r=Z(""),i=Z(""),c=[{value:!1,label:"仅本机(推荐)"},{value:!0,label:"局域网内所有设备"}],f=y=>{n.value=y,Object.assign(s,{enabled:y.enabled,port:y.port,global:y.global,token:y.token})},u=async()=>{o.value=!0,i.value="";try{if(!t)throw new Error("Web 访问设置仅在桌面客户端中提供");f(await t.status())}catch(y){i.value=y.message||String(y)}finally{o.value=!1}},p=async(y,d)=>{l.value=!0,i.value="",r.value="";try{f(await t.update({...s,...y,port:Number(y.port??s.port)})),r.value=d}catch(b){const x=b.message||String(b);try{f(await t.status())}catch{}i.value=x}finally{l.value=!1}},g=async()=>{const y=!s.enabled;await p({enabled:y},y?"Web 服务已启动":"Web 服务已关闭")},h=async()=>{const y=await t.generateToken();await p({token:y},s.enabled?"新令牌已生效,Web 服务已重新加载":"新令牌已生成")},C=async()=>{s.enabled||await p({},"监听设置已自动保存")},w=async y=>{s.global=y,await C()},N=async()=>{await navigator.clipboard.writeText(n.value.url),r.value="访问地址已复制"},T=async()=>{await t.openUrl(n.value.url)};return at(u),(y,d)=>(k(),S("div",kg,[d[7]||(d[7]=a("div",{class:"page-title"},[a("div",null,[a("h2",null,"Web 访问"),a("p",null,"从浏览器访问当前 VNT 进程,API 请求由持久访问令牌保护。")])],-1)),o.value?(k(),S("div",wg,"正在读取 Web 服务状态…")):R(t)?(k(),S(ae,{key:2},[a("section",Sg,[a("div",Eg,[d[1]||(d[1]=a("div",null,[a("h3",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"启用 Web 服务")],-1)),a("button",{type:"button",role:"switch","aria-label":"启用 Web 服务","aria-checked":s.enabled,disabled:l.value,class:G(["web-switch transition-colors disabled:opacity-50",s.enabled?"bg-indigo-600 dark:bg-indigo-500":"bg-slate-300 dark:bg-slate-600"]),onClick:g},[a("span",{class:G(["web-switch-knob bg-white shadow-sm",{"web-switch-knob-on":s.enabled}])},null,2)],10,Tg)]),a("div",$g,[a("label",Ag,[d[2]||(d[2]=a("span",{class:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-200"},"监听端口",-1)),xe(a("input",{"onUpdate:modelValue":d[0]||(d[0]=b=>s.port=b),class:"input font-mono",type:"number",min:"1",max:"65535",disabled:l.value||s.enabled,onChange:C},null,40,Ig),[[Ae,s.port,void 0,{number:!0}]])]),a("label",Rg,[d[3]||(d[3]=a("span",{class:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-200"},"监听范围",-1)),fe(hl,{"model-value":s.global,options:c,disabled:l.value||s.enabled,"aria-label":"监听范围","onUpdate:modelValue":w},null,8,["model-value","disabled"])])]),d[6]||(d[6]=a("p",{class:"-mt-3 text-xs text-slate-400"},"端口和监听范围会自动保存;需要修改时请先关闭 Web 服务。",-1)),a("div",null,[a("div",Pg,[d[4]||(d[4]=a("span",{class:"text-sm font-medium text-slate-700 dark:text-slate-200"},"访问令牌",-1)),a("button",{class:"text-xs font-medium text-indigo-600 hover:text-indigo-500 disabled:opacity-50 dark:text-indigo-400",type:"button",disabled:l.value,onClick:h},"更换令牌",8,Og)]),a("code",Mg,L(s.token),1),d[5]||(d[5]=a("p",{class:"mt-2 text-xs text-slate-400"},"更换令牌后,已登录的浏览器需要使用新令牌重新鉴权。",-1))]),r.value||i.value?(k(),S("div",Ng,[r.value?(k(),S("span",Lg,L(r.value),1)):le("",!0),i.value?(k(),S("span",Vg,L(i.value),1)):le("",!0)])):le("",!0)]),a("section",jg,[a("div",Dg,[a("span",{class:G(["mt-1 h-2.5 w-2.5 shrink-0 rounded-full",n.value?.running?"bg-green-500":"bg-slate-300 dark:bg-slate-600"])},null,2),a("div",Bg,[a("div",Fg,L(n.value?.running?"运行中":"未运行"),1),a("div",Ug,"监听地址:"+L(n.value?.listenAddress),1),n.value?.running?(k(),S("div",Hg,[a("span",Wg,L(n.value.url),1)])):le("",!0),n.value?.running?(k(),S("div",Kg,[a("button",{class:"btn-primary btn-sm",type:"button",onClick:T},"打开浏览器"),a("button",{class:"btn-ghost btn-sm",type:"button",onClick:N},"复制访问地址")])):le("",!0)])])])],64)):(k(),S("div",Cg,L(i.value),1))]))}},qg=Qn(Gg,[["__scopeId","data-v-a6f46239"]]),zg={class:"mx-auto max-w-3xl space-y-5"},Zg={class:"card flex items-center gap-4"},Jg=["src"],Yg={class:"min-w-0"},Qg={class:"mt-2 font-mono text-xs text-slate-400"},Xg={class:"card"},ev={class:"card"},tv={class:"flex flex-wrap items-start justify-between gap-4"},sv={class:"mt-2 text-sm text-slate-500 dark:text-slate-400"},nv=["disabled"],ov={key:1,class:"mt-4"},lv={class:"mb-1.5 flex justify-between text-xs text-slate-400"},rv={class:"h-1.5 overflow-hidden rounded-full bg-slate-200 dark:bg-slate-700"},iv={key:2,class:"mt-4 flex flex-wrap gap-2"},av=["disabled"],cv={key:3,class:"mt-4 text-xs leading-5 text-slate-400"},Sr="https://github.com/vnt-dev/vnt",uv="https://api.github.com/repos/vnt-dev/vnt/releases?per_page=20",fv={__name:"AboutView",setup(e){const t=`${Sr}/releases`,s=Nt(),n=Z(bt?"desktop":""),o=Z(!1),l=Z(!1),r=Z(null),i=Z(""),c=Z(""),f=Z(0),u=Z(0),p=he(()=>s.version||"2.0.0"),g=he(()=>u.value?Math.min(100,Math.round(f.value/u.value*100)):0),h=d=>{const b=String(d||"").trim().match(/^v?(\d+)\.(\d+)\.(\d+)(?:[+-].*)?$/);return b?b.slice(1).map(Number):null},C=(d,b)=>{const x=h(d),V=h(b);if(!x||!V)return 0;for(let j=0;j<3;j+=1)if(x[j]!==V[j])return x[j]>V[j]?1:-1;return 0},w=async d=>{globalThis.__VNT_WEB_ACCESS__?.openUrl?await globalThis.__VNT_WEB_ACCESS__.openUrl(d):window.open(d,"_blank","noopener,noreferrer")},N=async()=>{const d=await fetch(uv,{headers:{Accept:"application/vnd.github+json"},cache:"no-store"});if(!d.ok)throw new Error(`GitHub 返回 ${d.status}`);const b=(await d.json()).filter(V=>!V.draft&&!V.prerelease&&h(V.tag_name));b.sort((V,j)=>C(j.tag_name,V.tag_name));const x=b[0];if(!x)throw new Error("没有找到可用的发布版本");return{version:x.tag_name.replace(/^v/,""),body:x.body||"",url:x.html_url||t}},T=async()=>{o.value=!0,i.value="",c.value="",r.value=null;try{if(bt){let b;try{b=await globalThis.__VNT_UPDATER__?.check()}catch{const x=await N();if(C(x.version,p.value)<=0){i.value="latest",c.value="当前已是最新版本";return}r.value={...x,manualOnly:!0},i.value="update",c.value=`发现新版本 v${x.version},该版本暂未提供自动更新包。`;return}if(!b){i.value="latest",c.value="当前已是最新版本";return}r.value={...b,url:t},i.value="update",c.value=`发现新版本 v${b.version},可以直接下载并更新。`;return}n.value||=await yr();const d=await N();if(C(d.version,p.value)<=0){i.value="latest",c.value="当前已是最新版本";return}r.value=d,i.value="update",c.value=n.value==="desktop_web"?`发现新版本 v${d.version},请回到 VNT Desktop 的“关于”页面完成更新。`:`发现新版本 v${d.version},请下载新版本并替换当前 vnt2_web 程序。`}catch(d){i.value="error",c.value=`检查更新失败:${d?.message||d}`}finally{o.value=!1}},y=async()=>{l.value=!0,f.value=0,u.value=0,c.value="正在准备下载更新…";try{await globalThis.__VNT_UPDATER__.downloadAndInstall(d=>{f.value=d.downloaded,u.value=d.contentLength,c.value=d.event==="Finished"?"下载完成,正在安装…":"正在下载更新…"})}catch(d){i.value="error",c.value=`更新失败:${d?.message||d}`,l.value=!1}};return at(async()=>{if(!s.version)try{s.version=await ba()}catch{}if(!bt)try{n.value=await yr()}catch{n.value="standalone_web"}}),(d,b)=>(k(),S("div",zg,[b[9]||(b[9]=a("div",null,[a("h1",{class:"page-title"},"关于"),a("p",{class:"page-subtitle"},"VNT 客户端信息与软件更新")],-1)),a("section",Zg,[a("img",{src:R(Yn),alt:"VNT",class:"h-16 w-16 shrink-0 rounded-2xl"},null,8,Jg),a("div",Yg,[b[2]||(b[2]=a("h2",{class:"text-lg font-bold text-slate-900 dark:text-white"},"VNT",-1)),b[3]||(b[3]=a("p",{class:"mt-1 text-sm text-slate-500 dark:text-slate-400"},"简单、高效的异地组网与内网穿透工具",-1)),a("p",Qg,"当前版本 v"+L(p.value),1)])]),a("section",Xg,[b[5]||(b[5]=a("h2",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"开源项目",-1)),b[6]||(b[6]=a("p",{class:"mt-2 text-sm leading-6 text-slate-500 dark:text-slate-400"},"项目代码、使用说明和问题反馈均托管在 GitHub。",-1)),a("button",{class:"btn-ghost mt-4",type:"button",onClick:b[0]||(b[0]=x=>w(Sr))},[...b[4]||(b[4]=[a("svg",{class:"h-4 w-4",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},[a("path",{d:"M14 5h5v5m0-5-9 9M19 13v5a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h5","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.8"})],-1),ce(" github.com/vnt-dev/vnt ",-1)])])]),a("section",ev,[a("div",tv,[a("div",null,[b[7]||(b[7]=a("h2",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"软件更新",-1)),a("p",sv,L(R(bt)?"检查并安装 VNT Desktop 的最新版本。":"检查 GitHub 上发布的最新版本。"),1)]),a("button",{class:"btn-primary",type:"button",disabled:o.value||l.value,onClick:T},L(o.value?"正在检查…":"检查更新"),9,nv)]),c.value?(k(),S("div",{key:0,class:G(["mt-5 rounded-lg border px-4 py-3 text-sm",i.value==="error"?"border-red-200 bg-red-50 text-red-700 dark:border-red-900 dark:bg-red-950/40 dark:text-red-300":i.value==="update"?"border-indigo-200 bg-indigo-50 text-indigo-700 dark:border-indigo-900 dark:bg-indigo-950/40 dark:text-indigo-300":"border-slate-200 bg-slate-50 text-slate-600 dark:border-slate-700 dark:bg-slate-800/60 dark:text-slate-300"])},L(c.value),3)):le("",!0),l.value&&u.value?(k(),S("div",ov,[a("div",lv,[b[8]||(b[8]=a("span",null,"下载进度",-1)),a("span",null,L(g.value)+"%",1)]),a("div",rv,[a("div",{class:"h-full rounded-full bg-indigo-600 transition-[width] dark:bg-indigo-500",style:sn({width:`${g.value}%`})},null,4)])])):le("",!0),i.value==="update"?(k(),S("div",iv,[R(bt)&&!r.value?.manualOnly?(k(),S("button",{key:0,class:"btn-primary",type:"button",disabled:l.value,onClick:y},L(l.value?"正在更新…":"下载并更新"),9,av)):r.value?.manualOnly||n.value==="standalone_web"?(k(),S("button",{key:1,class:"btn-ghost",type:"button",onClick:b[1]||(b[1]=x=>w(r.value?.url||t))},"查看发布版本")):le("",!0)])):le("",!0),R(bt)?(k(),S("p",cv,"安装更新时桌面客户端可能自动退出,完成后将重新启动。")):le("",!0)])]))}},dv=[{path:"/",component:fh},{path:"/instances",redirect:"/"},{path:"/general",redirect:"/"},{path:"/config",component:km},{path:"/peers",component:ug},{path:"/routes",component:yg},{path:"/web-access",component:qg},{path:"/about",component:fv}],pv=hd({history:Gf(),routes:dv}),eo=document.querySelector('link[rel~="icon"]')||document.createElement("link");eo.rel="icon";eo.type="image/png";eo.href=Yn;document.head.appendChild(eo);Qu(Vp).use(tf()).use(pv).mount("#app"); diff --git a/vnt-web/static/assets/index-DI9vlWSX.css b/vnt-web/static/assets/index-DI9vlWSX.css deleted file mode 100644 index 0cb9d5d..0000000 --- a/vnt-web/static/assets/index-DI9vlWSX.css +++ /dev/null @@ -1 +0,0 @@ -.select-menu-enter-active[data-v-2fb2198c],.select-menu-leave-active[data-v-2fb2198c]{transform-origin:top;transition:opacity .12s ease,transform .12s ease}.select-menu-enter-from[data-v-2fb2198c],.select-menu-leave-to[data-v-2fb2198c]{opacity:0;transform:translateY(-4px) scale(.98)}.config-card-actions[data-v-b7dce6ea]{opacity:1}@media(min-width:640px)and (hover:hover)and (pointer:fine){.config-card-actions[data-v-b7dce6ea]{opacity:0}.group:hover .config-card-actions[data-v-b7dce6ea],.group:focus-within .config-card-actions[data-v-b7dce6ea]{opacity:1}}.peer-table[data-v-c64dc8e9] thead th{padding:.5rem;font-size:.6875rem}.peer-table[data-v-c64dc8e9] tbody td{padding:.5rem;font-size:.75rem}.peer-table[data-v-c64dc8e9] th:first-child,.peer-table[data-v-c64dc8e9] td:first-child{padding-left:.25rem;padding-right:0}.web-switch[data-v-a6f46239]{position:relative;display:inline-flex;flex:0 0 44px;align-items:center;width:44px;min-width:44px;height:24px;min-height:24px;padding:2px;border:0;border-radius:9999px;cursor:pointer}.web-switch-knob[data-v-a6f46239]{display:block;width:20px;min-width:20px;height:20px;border-radius:9999px;transform:translate(0);transition:transform .16s ease}.web-switch-knob-on[data-v-a6f46239]{transform:translate(20px)}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-divide-y-reverse:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-amber-400:oklch(82.8% .189 84.429);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.btn-primary{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-primary:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-primary:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-primary:focus-visible{--tw-outline-style:none;outline-style:none}.btn-primary:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-primary:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-primary{background-color:var(--color-indigo-600);color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-primary:hover{background-color:var(--color-indigo-500)}}.btn-primary:where(.dark,.dark *){background-color:var(--color-indigo-500)}@media(hover:hover){.btn-primary:where(.dark,.dark *):hover{background-color:var(--color-indigo-400)}}.btn-ghost{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-ghost:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-ghost:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-ghost:focus-visible{--tw-outline-style:none;outline-style:none}.btn-ghost:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-ghost:disabled{cursor:not-allowed;opacity:.5}.btn-ghost:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-ghost{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-300);background-color:var(--color-white);color:var(--color-slate-700);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-ghost:hover{background-color:var(--color-slate-50)}}.btn-ghost:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-slate-200)}@media(hover:hover){.btn-ghost:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}}.btn-danger{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-danger:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-danger:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-danger:focus-visible{--tw-outline-style:none;outline-style:none}.btn-danger:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-danger:disabled{cursor:not-allowed;opacity:.5}.btn-danger:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-danger{background-color:var(--color-red-600);color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-danger:hover{background-color:var(--color-red-500)}}.btn-sm{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);padding:calc(var(--spacing) * 5);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s}@media(hover:hover){.card:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.card:where(.dark,.dark *){border-color:#314158cc}@supports (color:color-mix(in lab,red,red)){.card:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700) 80%,transparent)}}.card:where(.dark,.dark *){background-color:var(--color-slate-900)}.input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-300);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-900)}.input::placeholder{color:var(--color-slate-400)}.input{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.input:focus{border-color:var(--color-indigo-500);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.input:focus{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 25%, transparent)}}.input:focus{--tw-outline-style:none;outline-style:none}.input:disabled{cursor:not-allowed;opacity:.5}.input:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-white)}.input:where(.dark,.dark *)::placeholder{color:var(--color-slate-500)}.badge-green{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-green-100);color:var(--color-green-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-green:where(.dark,.dark *){background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.badge-green:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.badge-green:where(.dark,.dark *){color:var(--color-green-300)}.badge-red{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-red-100);color:var(--color-red-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-red:where(.dark,.dark *){background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.badge-red:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.badge-red:where(.dark,.dark *){color:var(--color-red-300)}.badge-yellow{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-yellow-100);color:var(--color-yellow-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-yellow:where(.dark,.dark *){background-color:#733e0a66}@supports (color:color-mix(in lab,red,red)){.badge-yellow:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.badge-yellow:where(.dark,.dark *){color:var(--color-yellow-300)}.badge-blue{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-blue-100);color:var(--color-blue-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-blue:where(.dark,.dark *){background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.badge-blue:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.badge-blue:where(.dark,.dark *){color:var(--color-blue-300)}.badge-purple{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-purple-100);color:var(--color-purple-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-purple:where(.dark,.dark *){background-color:#59168b66}@supports (color:color-mix(in lab,red,red)){.badge-purple:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-purple-900) 40%,transparent)}}.badge-purple:where(.dark,.dark *){color:var(--color-purple-300)}.badge-gray{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-slate-100);color:var(--color-slate-500);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-gray:where(.dark,.dark *){background-color:var(--color-slate-700);color:var(--color-slate-300)}.table{min-width:100%}:where(.table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-slate-200)}:where(.table:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-slate-700)}.table thead{background-color:var(--color-slate-50)}.table thead:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.table thead:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.table thead th{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider);white-space:nowrap;color:var(--color-slate-500);text-transform:uppercase}.table thead th:where(.dark,.dark *){color:var(--color-slate-400)}:where(.table tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-slate-200)}.table tbody{background-color:var(--color-white)}:where(.table tbody:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-slate-700)}.table tbody:where(.dark,.dark *){background-color:#0000}.table tbody td{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:var(--color-slate-600)}.table tbody td:where(.dark,.dark *){color:var(--color-slate-300)}.tooltip{justify-content:center;align-items:center;display:inline-flex;position:relative}.tooltip .tooltip-text{pointer-events:none;visibility:hidden;z-index:10;width:calc(var(--spacing) * 36);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-slate-600);opacity:0;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s;position:absolute;bottom:125%;left:50%}.tooltip .tooltip-text:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-slate-200)}.tooltip:hover .tooltip-text{visibility:visible;opacity:1}.page-title{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-slate-900)}.page-title:where(.dark,.dark *){color:var(--color-white)}.page-subtitle{margin-top:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-500)}.page-subtitle:where(.dark,.dark *){color:var(--color-slate-400)}.page-title,.page-subtitle{display:none}.muted{color:var(--color-slate-500)}.muted:where(.dark,.dark *){color:var(--color-slate-400)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.-top-2{top:calc(var(--spacing) * -2)}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:0}.right-4{right:calc(var(--spacing) * 4)}.left-1\/2{left:50%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.-mt-3{margin-top:calc(var(--spacing) * -3)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-7{margin-bottom:calc(var(--spacing) * 7)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.table{display:table}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-64{height:calc(var(--spacing) * 64)}.h-\[18px\]{height:18px}.h-\[85vh\]{height:85vh}.h-\[100dvh\]{height:100dvh}.h-\[150px\]{height:150px}.h-full{height:100%}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[90vh\]{max-height:90vh}.max-h-\[400px\]{max-height:400px}.max-h-\[600px\]{max-height:600px}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[140px\]{min-height:140px}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-60{width:calc(var(--spacing) * 60)}.w-\[18px\]{width:18px}.w-\[min\(82vw\,288px\)\]{width:min(82vw,288px)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[40\%\]{max-width:40%}.max-w-\[200px\]{max-width:200px}.max-w-\[320px\]{max-width:320px}.max-w-\[1700px\]{max-width:1700px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-\[260px\]{min-width:260px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-green-200{border-color:var(--color-green-200)}.border-indigo-200{border-color:var(--color-indigo-200)}.border-indigo-400\/50{border-color:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.border-indigo-400\/50{border-color:color-mix(in oklab,var(--color-indigo-400) 50%,transparent)}}.border-indigo-500{border-color:var(--color-indigo-500)}.border-indigo-600{border-color:var(--color-indigo-600)}.border-red-200{border-color:var(--color-red-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/60{background-color:#f8fafc99}@supports (color:color-mix(in lab,red,red)){.bg-slate-50\/60{background-color:color-mix(in oklab,var(--color-slate-50) 60%,transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-900\/40{background-color:#0f172b66}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/40{background-color:color-mix(in oklab,var(--color-slate-900) 40%,transparent)}}.bg-slate-950\/45{background-color:#02061873}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/45{background-color:color-mix(in oklab,var(--color-slate-950) 45%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.fill-none{fill:none}.stroke-current{stroke:currentColor}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-12{padding:calc(var(--spacing) * 12)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.text-blue-600{color:var(--color-blue-600)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-slate-900\/10{--tw-shadow-color:#0f172b1a}@supports (color:color-mix(in lab,red,red)){.shadow-slate-900\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-900) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-green-500\/60{--tw-ring-color:#00c75899}@supports (color:color-mix(in lab,red,red)){.ring-green-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-green-500) 60%, transparent)}}.ring-indigo-500{--tw-ring-color:var(--color-indigo-500)}.ring-indigo-500\/25{--tw-ring-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.ring-indigo-500\/25{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 25%, transparent)}}.ring-indigo-500\/60{--tw-ring-color:#625fff99}@supports (color:color-mix(in lab,red,red)){.ring-indigo-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 60%, transparent)}}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.hover\:border-indigo-300:hover{border-color:var(--color-indigo-300)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:text-indigo-500:hover{color:var(--color-indigo-500)}.hover\:text-indigo-600:hover{color:var(--color-indigo-600)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:h-80{height:calc(var(--spacing) * 80)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media(min-width:48rem){.md\:block{display:block}.md\:table-cell{display:table-cell}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:px-6{padding-inline:calc(var(--spacing) * 6)}.lg\:px-7{padding-inline:calc(var(--spacing) * 7)}.lg\:py-6{padding-block:calc(var(--spacing) * 6)}}@media(min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.dark\:border-green-800:where(.dark,.dark *){border-color:var(--color-green-800)}.dark\:border-indigo-500:where(.dark,.dark *){border-color:var(--color-indigo-500)}.dark\:border-indigo-900:where(.dark,.dark *){border-color:var(--color-indigo-900)}.dark\:border-red-900:where(.dark,.dark *){border-color:var(--color-red-900)}.dark\:border-slate-600:where(.dark,.dark *){border-color:var(--color-slate-600)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.dark\:border-slate-800:where(.dark,.dark *){border-color:var(--color-slate-800)}.dark\:bg-indigo-500:where(.dark,.dark *){background-color:var(--color-indigo-500)}.dark\:bg-indigo-500\/10:where(.dark,.dark *){background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-indigo-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.dark\:bg-indigo-500\/15:where(.dark,.dark *){background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.dark\:bg-indigo-500\/15:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.dark\:bg-indigo-600:where(.dark,.dark *){background-color:var(--color-indigo-600)}.dark\:bg-indigo-950\/40:where(.dark,.dark *){background-color:#1e1a4d66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-indigo-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-indigo-950) 40%,transparent)}}.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900) 20%,transparent)}}.dark\:bg-red-950\/40:where(.dark,.dark *){background-color:#46080966}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-950) 40%,transparent)}}.dark\:bg-slate-500:where(.dark,.dark *){background-color:var(--color-slate-500)}.dark\:bg-slate-600:where(.dark,.dark *){background-color:var(--color-slate-600)}.dark\:bg-slate-700:where(.dark,.dark *){background-color:var(--color-slate-700)}.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.dark\:bg-slate-700\/70:where(.dark,.dark *){background-color:#314158b3}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/70:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700) 70%,transparent)}}.dark\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.dark\:bg-slate-900:where(.dark,.dark *){background-color:var(--color-slate-900)}.dark\:bg-slate-900\/50:where(.dark,.dark *){background-color:#0f172b80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 50%,transparent)}}.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:#0f172be6}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 90%,transparent)}}.dark\:bg-slate-950:where(.dark,.dark *){background-color:var(--color-slate-950)}.dark\:bg-slate-950\/60:where(.dark,.dark *){background-color:#02061899}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-950\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-950) 60%,transparent)}}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-green-300:where(.dark,.dark *){color:var(--color-green-300)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-indigo-300:where(.dark,.dark *){color:var(--color-indigo-300)}.dark\:text-indigo-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-red-300:where(.dark,.dark *){color:var(--color-red-300)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-red-500:where(.dark,.dark *){color:var(--color-red-500)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:where(.dark,.dark *){color:var(--color-slate-500)}.dark\:text-slate-600:where(.dark,.dark *){color:var(--color-slate-600)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-300:where(.dark,.dark *){color:var(--color-yellow-300)}.dark\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}.dark\:shadow-black\/30:where(.dark,.dark *){--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.dark\:shadow-black\/30:where(.dark,.dark *){--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.dark\:ring-indigo-400:where(.dark,.dark *){--tw-ring-color:var(--color-indigo-400)}@media(hover:hover){.dark\:hover\:border-indigo-500:where(.dark,.dark *):hover{border-color:var(--color-indigo-500)}.dark\:hover\:bg-red-900\/40:where(.dark,.dark *):hover{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/40:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.dark\:hover\:bg-slate-700:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}.dark\:hover\:bg-slate-700\/70:where(.dark,.dark *):hover{background-color:#314158b3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-700\/70:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-700) 70%,transparent)}}.dark\:hover\:bg-slate-800:where(.dark,.dark *):hover{background-color:var(--color-slate-800)}.dark\:hover\:bg-slate-800\/50:where(.dark,.dark *):hover{background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-800\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.dark\:hover\:text-indigo-400:where(.dark,.dark *):hover{color:var(--color-indigo-400)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}}body{background-color:var(--color-slate-50);color:var(--color-slate-700);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body:where(.dark,.dark *){background-color:var(--color-slate-950);color:var(--color-slate-200)}html,body,#app{height:100%;overflow:hidden}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.custom-scrollbar::-webkit-scrollbar{width:8px;height:8px}.custom-scrollbar::-webkit-scrollbar-track{background:0 0}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:var(--color-slate-300);border-radius:.25rem}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--color-slate-400)}.custom-scrollbar{scrollbar-width:thin;scrollbar-color:var(--color-slate-300) transparent}.dark .custom-scrollbar{scrollbar-color:var(--color-slate-600) transparent}.fade-enter-active,.fade-leave-active{transition:opacity .2s}.fade-enter-from,.fade-leave-to{opacity:0}.card-list-enter-active,.card-list-leave-active{transition:opacity .3s,transform .3s}.card-list-enter-from,.card-list-leave-to{opacity:0;transform:scale(.96)}.modal-enter-active,.modal-leave-active{transition:opacity .2s}.modal-enter-active .modal-panel,.modal-leave-active .modal-panel{transition:transform .2s,opacity .2s}.modal-enter-from,.modal-leave-to{opacity:0}.modal-enter-from .modal-panel,.modal-leave-to .modal-panel{opacity:0;transform:scale(.96)}.toast-enter-active,.toast-leave-active{transition:opacity .25s,transform .25s}.toast-enter-from{opacity:0;transform:translateY(-10px)}.toast-leave-to{opacity:0;transform:translate(20px)}.navdrop-enter-active,.navdrop-leave-active{transition:opacity .2s,transform .2s}.navdrop-enter-from,.navdrop-leave-to{opacity:0;transform:translateY(-6px)}.drawer-enter-active,.drawer-leave-active{transition:opacity .2s}.drawer-enter-active .drawer-panel,.drawer-leave-active .drawer-panel{transition:transform .2s}.drawer-enter-from,.drawer-leave-to{opacity:0}.drawer-enter-from .drawer-panel,.drawer-leave-to .drawer-panel{transform:translate(-100%)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/vnt-web/static/assets/vnt-icon-CtSHy0mt.png b/vnt-web/static/assets/vnt-icon-CtSHy0mt.png deleted file mode 100644 index 70a03ec17e59a6201403dcd562c612d646a67f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16855 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 Wr - - - - - VNT Dashboard - - - - - - -
- -